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