摘要:這可以通過負載平衡來實現(xiàn)數(shù)據(jù)分片當問題不是并發(fā)查詢的數(shù)量,而是數(shù)據(jù)庫的大小和單個查詢的速度時,可以實現(xiàn)不同的方法。
來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯
愿碼Slogan | 連接每個程序員的故事
網(wǎng)站 | http://chaindesk.cn
愿碼愿景 | 打造全學科IT系統(tǒng)免費課程,助力小白用戶、初級工程師0成本免費系統(tǒng)學習、低成本進階,幫助BAT一線資深工程師成長并利用自身優(yōu)勢創(chuàng)造睡后收入。
官方公眾號 | 愿碼 | 愿碼服務(wù)號 | 區(qū)塊鏈部落
免費加入愿碼全思維工程師社群 | 任一公眾號回復(fù)“愿碼”兩個字獲取入群二維碼
本文閱讀時長:11min
可伸縮性是指軟件系統(tǒng)隨著使用它的業(yè)務(wù)增長而增長的能力。 PostgreSQL提供了一些功能,可以幫助您構(gòu)建可擴展的解決方案,但嚴格來說, PostgreSQL本身是不可擴展的。它可以有效地利用單臺機器的以下資源:
它使用多個CPU內(nèi)核通過并行查詢功能更快地執(zhí)行單個查詢
如果配置正確,它可以使用所有可用內(nèi)存進行緩存
數(shù)據(jù)庫的大小不受限制; 創(chuàng)建多個表空間時,PostgreSQL可以使用多個硬盤; 通過分區(qū),可以同時訪問硬盤,從而加快數(shù)據(jù)處理速度
但是,當涉及將數(shù)據(jù)庫解決方案擴展到多臺計算機時,它可能非常有問題,因為標準PostgreSQL服務(wù)器只能在單個計算機上運行。在本文中,我們將介紹PostgreSQL中不同的擴展方案及其實現(xiàn)。
系統(tǒng)可擴展性的要求意味著現(xiàn)在支持業(yè)務(wù)的系統(tǒng)也應(yīng)該能夠以與其增長相同的服務(wù)質(zhì)量來支持相同的業(yè)務(wù)。
假設(shè)一個數(shù)據(jù)庫可以存儲1 GB的數(shù)據(jù),并且每秒有效地處理100個查詢。如果隨著業(yè)務(wù)的發(fā)展,處理的數(shù)據(jù)量會增長100倍?它能夠每秒支持10,000個查詢并處理100 GB的數(shù)據(jù)嗎?也許不是現(xiàn)在,不是在同一個裝置中。但是,可以擴展可擴展的解決方案,以便能夠在需要時立即處理負載。
在需要獲得更好性能的場景中,設(shè)置更多服務(wù)器以處理額外負載并從主服務(wù)器將相同數(shù)據(jù)復(fù)制到它們是很常見的。在需要高可用性的情況下,這也是將數(shù)據(jù)連續(xù)復(fù)制到備用服務(wù)器的典型解決方案,以便在主服務(wù)器崩潰時它可以接管。
可擴展的PostgreSQL解決方案復(fù)制可用于許多擴展方案。其主要目的是在系統(tǒng)出現(xiàn)故障時創(chuàng)建和維護備份數(shù)據(jù)庫。對于物理復(fù)制尤其如此。但是,復(fù)制也可用于提高基于PostgreSQL的解決方案的性能。有時,第三方工具可用于實現(xiàn)復(fù)雜的擴展方案。
想象一下,有一個系統(tǒng)應(yīng)該處理大量的讀取請求。例如,可能有一個應(yīng)用程序?qū)崿F(xiàn)支持網(wǎng)站上的自動完成功能的HTTP API端點。每次用戶在Web表單中輸入字符時,系統(tǒng)都會在數(shù)據(jù)庫中搜索名稱以用戶輸入的字符串開頭的對象。由于用戶數(shù)量眾多,查詢數(shù)量可能非常大,并且還因為每個用戶會話都處理了多個請求。為了處理大量請求,數(shù)據(jù)庫應(yīng)該能夠使用多個CPU核心。如果同時請求的數(shù)量非常大,則處理它們所需的核心數(shù)量可能大于單個機器可能具有的核心數(shù)量。
這同樣適用于應(yīng)該同時處理多個重度查詢的系統(tǒng)。您不需要大量查詢,但是當查詢本身很大時,使用盡可能多的CPU將提供性能優(yōu)勢,尤其是在使用并行查詢時。
在這種情況下,一個數(shù)據(jù)庫無法處理負載,可以設(shè)置多個數(shù)據(jù)庫,設(shè)置從一個主數(shù)據(jù)庫到所有數(shù)據(jù)庫的復(fù)制,使每個數(shù)據(jù)庫作為熱備用,然后讓應(yīng)用程序查詢不同的數(shù)據(jù)庫不同的要求。應(yīng)用程序本身可以是智能的,每次都可以查詢不同的數(shù)據(jù)庫,但這需要應(yīng)用程序的數(shù)據(jù)訪問組件的特殊實現(xiàn),如下所示:
另一個選擇是使用一個名為Pgpool-II的工具,它可以作為幾個PostgreSQL數(shù)據(jù)庫前面的負載均衡器。該工具公開了一個SQL接口,應(yīng)用程序可以連接到那里,就好像它是一個真正的PostgreSQL服務(wù)器。然后Pgpool-II會將查詢重定向到當時執(zhí)行最少查詢的數(shù)據(jù)庫; 換句話說,它將執(zhí)行負載平衡:
另一種選擇是將應(yīng)用程序與數(shù)據(jù)庫一起擴展,以便應(yīng)用程序的一個實例將連接到數(shù)據(jù)庫的一個實例。在這種情況下,應(yīng)用程序的用戶應(yīng)該連接到許多實例中的一個。這可以通過HTTP負載平衡來實現(xiàn):
當問題不是并發(fā)查詢的數(shù)量,而是數(shù)據(jù)庫的大小和單個查詢的速度時,可以實現(xiàn)不同的方法??梢詫?shù)據(jù)分成多個服務(wù)器,這些服務(wù)器將并行查詢,然后將查詢結(jié)果合并到這些數(shù)據(jù)庫之外。這稱為數(shù)據(jù)分片。
PostgreSQL提供了一種基于表分區(qū)實現(xiàn)分片的方法,其中分區(qū)位于不同的服務(wù)器上,而另一個分區(qū)(主服務(wù)器)將它們用作外部表。在主服務(wù)器上定義的父表上執(zhí)行查詢時,具體取決于WHERE子句和分區(qū)的定義,PostgreSQL可以識別哪些分區(qū)包含所請求的數(shù)據(jù),并且只查詢這些分區(qū)。根據(jù)查詢,有時可以在遠程服務(wù)器上執(zhí)行聯(lián)接,分組和聚合。PostgreSQL可以并行查詢不同的分區(qū),這將有效地利用多臺機器的資源。完成所有這些后,可以在應(yīng)用程序連接到單個數(shù)據(jù)庫時構(gòu)建解決方案,該數(shù)據(jù)庫將根據(jù)要查詢的數(shù)據(jù)在不同的數(shù)據(jù)庫服務(wù)器上物理執(zhí)行查詢。
也可以在使用PostgreSQL的應(yīng)用程序中構(gòu)建分片算法。簡而言之,應(yīng)用程序可能會知道哪些數(shù)據(jù)位于哪個數(shù)據(jù)庫中,只在那里寫入,并且只能從那里讀取數(shù)據(jù)。這會給應(yīng)用程序增加很多復(fù)雜性。
另一種選擇是使用市場上可用的基于PostgreSQL的分片解決方案或開源解決方案。它們有各自的優(yōu)點和缺點,但常見的問題是它們基于PostgreSQL的早期版本,并且不使用最新的功能(有時會提供自己的功能)。
最受歡迎的分片解決方案之一是Postgres-XL,它使用運行PostgreSQL的多個服務(wù)器實現(xiàn)無共享架構(gòu)。該系統(tǒng)有幾個組成部分:
· 多個數(shù)據(jù)節(jié)點:存儲數(shù)據(jù)
· 單個全局事務(wù)監(jiān)視器(GTM):管理集群,提供全局事務(wù)一致性
· 多個協(xié)調(diào)器節(jié)點:支持用戶連接,構(gòu)建查詢執(zhí)行計劃,并與GTM和數(shù)據(jù)節(jié)點交互
Postgres-XL實現(xiàn)與PostgreSQL相同的API,因此應(yīng)用程序不需要以任何特殊方式處理服務(wù)器。它符合ACID,這意味著它支持事務(wù)和完整性約束。該COPY命令也受支持。
使用Postgres-XL的主要好處如下:
它可以擴展以通過添加更多數(shù)據(jù)節(jié)點來支持更多讀取操作
它可以擴展以通過添加更多協(xié)調(diào)器節(jié)點來支持更多寫入操作
Postgres-XL的當前版本(在撰寫本文時)基于PostgreSQL 10,它相對較新Postgres-XL的主要缺點是它不提供開箱即用的任何高可用性功能。當更多服務(wù)器添加到群集時,任何服務(wù)器失敗的可能性都會增加。這就是為什么你應(yīng)該注意備份或?qū)崿F(xiàn)數(shù)據(jù)節(jié)點本身的復(fù)制。
Postgres-XL是開源的,但可以獲得商業(yè)支持。
值得一提的另一個解決方案是Greenplum。它被定位為大規(guī)模并行處理數(shù)據(jù)庫的實現(xiàn),專門為數(shù)據(jù)倉庫而設(shè)計。它有以下組件:
· 主節(jié)點:管理用戶連接,構(gòu)建查詢執(zhí)行計劃,管理事務(wù)
· 數(shù)據(jù)節(jié)點:存儲數(shù)據(jù)并執(zhí)行查詢
Greenplum還實現(xiàn)了PostgreSQL API,應(yīng)用程序可以連接到Greenplum數(shù)據(jù)庫而無需任何更改。它支持事務(wù),但對完整性約束的支持是有限的。該COPY命令受支持。
Greenplum的主要好處如下:
它可以擴展以通過添加更多數(shù)據(jù)節(jié)點來支持更多讀取操作。
它支持面向列的表組織,這對于數(shù)據(jù)倉庫解決方案非常有用。
支持數(shù)據(jù)壓縮。
開箱即用支持高可用性功能??梢裕ú⑶医ㄗh)添加輔助主服務(wù)器,以便在主服務(wù)器崩潰時接管。還可以向數(shù)據(jù)節(jié)點添加鏡像以防止數(shù)據(jù)丟失。
缺點如下:
它不能擴展以支持更多的寫入操作。一切都通過單個主節(jié)點,添加更多數(shù)據(jù)節(jié)點不會使寫入更快。但是,可以直接從數(shù)據(jù)節(jié)點導(dǎo)入文件中的數(shù)據(jù)。
它的核心使用PostgreSQL 8.4。Greenplum在PostgreSQL基礎(chǔ)代碼中添加了許多改進和新功能,但它仍然基于一個非常舊的版本; 但是,該系統(tǒng)正在積極開發(fā)中。
Greenplum不支持外鍵,并且對唯一約束的支持是有限的。
Greenplum有商業(yè)和開源版本。
與可伸縮性相關(guān)的另一個用例是當數(shù)據(jù)庫連接的數(shù)量很大時。但是,當在具有大量微服務(wù)的環(huán)境中使用單個數(shù)據(jù)庫并且每個數(shù)據(jù)庫都有自己的連接池時,即使它們不執(zhí)行太多查詢,也可能在數(shù)據(jù)庫中打開數(shù)百甚至數(shù)千個連接。每個連接都消耗服務(wù)器資源,只是處理大量連接的要求已經(jīng)成為問題,甚至不執(zhí)行任何查詢。
如果應(yīng)用程序僅在需要查詢數(shù)據(jù)庫并在之后關(guān)閉它們時才使用連接池和打開連接,則可能會出現(xiàn)另一個問題。建立數(shù)據(jù)庫連接需要時間 - 而不是太多,但是當操作數(shù)量很大時,總開銷將是巨大的。
有一個名為PgBouncer的工具可以實現(xiàn)連接池功能。它可以接受來自許多應(yīng)用程序的連接,就像它是PostgreSQL服務(wù)器一樣,然后打開有限數(shù)量的數(shù)據(jù)庫連接。它將為多個應(yīng)用程序的連接重用相同的數(shù)據(jù)庫連接。建立從應(yīng)用程序到PgBouncer的連接的過程比連接到真實數(shù)據(jù)庫要快得多,因為PgBouncer不需要初始化會話的數(shù)據(jù)庫后端進程。
PgBouncer可以創(chuàng)建多個連接池,它們可以在以下三種模式之一中工作:
· 會話模式:與PostgreSQL服務(wù)器的連接用于與PgBouncer的客戶端連接的生命周期。這種設(shè)置可用于加速應(yīng)用程序端的連接過程。這是默認模式。
· 事務(wù)模式:與PostgreSQL的連接用于客戶端執(zhí)行的單個事務(wù)。當僅同時執(zhí)行少量翻譯時,這可用于減少PostgreSQL端的連接數(shù)。
· 語句模式:數(shù)據(jù)庫連接用于單個語句。然后將它返回到池中,并為下一個語句使用不同的連接。此模式類似于交易模式,但更具侵略性。請注意,使用語句模式時,無法進行多語句事務(wù)。
可以設(shè)置不同的池以在不同模式下工作。
可以讓PgBouncer連接到多個PostgreSQL服務(wù)器,從而起到反向代理的作用。
可以使用PgBouncer的方式如下圖所示:
PgBouncer建立了與數(shù)據(jù)庫的多個連接。當應(yīng)用程序連接到PgBouncer并啟動事務(wù)時,PgBouncer會為該應(yīng)用程序分配現(xiàn)有數(shù)據(jù)庫連接,將所有SQL命令轉(zhuǎn)發(fā)到數(shù)據(jù)庫,然后將結(jié)果傳回。交易完成后,PgBouncer將斷開連接,但不關(guān)閉它們。如果另一個應(yīng)用程序啟動事務(wù),則可以使用相同的數(shù)據(jù)庫連接。這樣的設(shè)置需要配置PgBouncer以在事務(wù)模式下工作。
PostgreSQL提供了幾種實現(xiàn)復(fù)制的方法,這種方法可以維護來自另一個服務(wù)器或服務(wù)器上的數(shù)據(jù)庫的數(shù)據(jù)副本。這可以用作備份或備用解決方案,以便在主服務(wù)器崩潰時接管。通過使負載可以分布在多個數(shù)據(jù)庫服務(wù)器上,復(fù)制還可用于提高軟件系統(tǒng)的性能。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/17981.html
摘要:這可以通過負載平衡來實現(xiàn)數(shù)據(jù)分片當問題不是并發(fā)查詢的數(shù)量,而是數(shù)據(jù)庫的大小和單個查詢的速度時,可以實現(xiàn)不同的方法。 showImg(https://segmentfault.com/img/remote/1460000018875091); 來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯 愿碼Slogan | 連接每個程序員的故事 網(wǎng)站 | http://chaindesk.cn...
摘要:我們需要將業(yè)務(wù)或服務(wù)放置在網(wǎng)關(guān)背后,由網(wǎng)關(guān)統(tǒng)一處理請求入口,本身由多個入口的處理變成了一個入口,由網(wǎng)關(guān)進行統(tǒng)一調(diào)度。網(wǎng)關(guān)負責來搞這些事情,你只需要知道網(wǎng)關(guān)就好了。 構(gòu)建完成 API 服務(wù),配置中心之后,架構(gòu)圖大致如下: showImg(https://segmentfault.com/img/remote/1460000010676395); 我們?yōu)楹涡枰W(wǎng)關(guān) 引用 別人 的一句話: ...
閱讀 1453·2021-09-28 09:43
閱讀 4348·2021-09-04 16:41
閱讀 1980·2019-08-30 15:44
閱讀 3873·2019-08-30 15:43
閱讀 832·2019-08-30 14:21
閱讀 2084·2019-08-30 11:00
閱讀 3378·2019-08-29 16:20
閱讀 2005·2019-08-29 14:21