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