如果您的系統(tǒng)依賴PostgreSQL數(shù)據(jù)庫并且您正在尋找HA的集群解決方案,我們希望提前告知您這是一項復(fù)雜的任務(wù),但并非不可能實現(xiàn)。
我們將討論一些解決方案,您可以從中選擇對您的容錯要求。
PostgreSQL本身不支持任何多主群集解決方案,例如MySQL或Oracle。盡管如此,仍有許多商業(yè)和社區(qū)產(chǎn)品提供此實現(xiàn),以及其他產(chǎn)品,例如PostgreSQL的復(fù)制或負(fù)載平衡。
首先,讓我們回顧一些基本概念:
什么是高可用性?
它是服務(wù)可用的時間量,通常由企業(yè)定義。
冗余是高可用性的基礎(chǔ);萬一發(fā)生事故,我們可以繼續(xù)毫無問題地運轉(zhuǎn)。
持續(xù)恢復(fù)
如果發(fā)生事件,則必須還原備份,然后應(yīng)用wal日志;恢復(fù)時間將非常長,我們不會談?wù)摳呖捎眯浴?/p>
但是,如果我們將備份和日志存檔在應(yīng)急服務(wù)器中,則可以在日志到達(dá)時應(yīng)用它們。
如果日志每隔1分鐘發(fā)送和應(yīng)用一次,則應(yīng)急基礎(chǔ)將處于連續(xù)恢復(fù)狀態(tài),并且到生產(chǎn)的時間最多為1分鐘。
備用數(shù)據(jù)庫
備用數(shù)據(jù)庫的想法是保留生產(chǎn)數(shù)據(jù)庫的副本,該副本始終具有相同的數(shù)據(jù),并且可以在發(fā)生事件時使用。
有幾種方法可以對備用數(shù)據(jù)庫進(jìn)行分類:
根據(jù)復(fù)制的性質(zhì):
- 物理備用數(shù)據(jù)庫:復(fù)制磁盤塊。
- 邏輯備用數(shù)據(jù)庫:流式傳輸數(shù)據(jù)更改。
通過事務(wù)的同步性:
- 異步:可能會丟失數(shù)據(jù)。
- 同步:不會丟失數(shù)據(jù);主服務(wù)器中的提交等待備用服務(wù)器的響應(yīng)。
通過用法:
- 熱備用:它們不支持連接。
- 熱備用:支持只讀連接。

集群
群集是一組一起工作的主機,被視為一個主機。
這提供了一種實現(xiàn)水平可伸縮性的方法,并提供了通過添加服務(wù)器來處理更多工作的能力。
它可以抵抗節(jié)點的故障并繼續(xù)透明地工作。
根據(jù)共享的內(nèi)容,有兩種模型:

- 共享存儲:所有節(jié)點都使用相同的信息訪問相同的存儲。
- 不共享:每個節(jié)點都有自己的存儲,取決于我們系統(tǒng)的結(jié)構(gòu),該存儲可能與其他節(jié)點具有相同的信息。
現(xiàn)在讓我們回顧一下PostgreSQL中的一些集群選項。
分布式復(fù)制塊設(shè)備 (Distributed Replicated Block Device)
DRBD是一個linux內(nèi)核模塊,可使用網(wǎng)絡(luò)實現(xiàn)同步塊復(fù)制。 它實際上不實現(xiàn)群集,也不處理故障轉(zhuǎn)移或監(jiān)視。 為此,您需要補充軟件,例如Corosync + Pacemaker + DRBD。

例:
- Corosync:處理主機之間的消息。
- Pacemaker:啟動和停止服務(wù),確保它們僅在一臺主機上運行。
- DRBD:在塊設(shè)備級別同步數(shù)據(jù)。

集群控制(ClusterControl)
ClusterControl是用于數(shù)據(jù)庫集群的無代理管理和自動化軟件。 它可直接從其用戶界面幫助部署,監(jiān)視,管理和擴展數(shù)據(jù)庫服務(wù)器/集群。
ClusterControl能夠處理維護數(shù)據(jù)庫服務(wù)器或群集所需的大多數(shù)管理任務(wù)。

使用ClusterControl,您可以:
- 在您選擇的技術(shù)堆棧上部署獨立的,復(fù)制的或群集的數(shù)據(jù)庫。
- 跨多語言數(shù)據(jù)庫和動態(tài)基礎(chǔ)架構(gòu)統(tǒng)一自動化故障轉(zhuǎn)移,恢復(fù)和日常任務(wù)。
- 您可以創(chuàng)建完整或增量備份并計劃它們。
- 對整個數(shù)據(jù)庫和服務(wù)器基礎(chǔ)結(jié)構(gòu)進(jìn)行統(tǒng)一和全面的實時監(jiān)控。
- 只需一個操作即可輕松添加或刪除節(jié)點。
在PostgreSQL上,如果發(fā)生事件,可以自動將您的從屬提升為主狀態(tài)。
它是一個非常完整的工具,帶有免費的社區(qū)版本(還包括免費的企業(yè)試用版)。


紅寶石 (Rubyrep)
異步,多主機,多平臺復(fù)制(在Ruby或JRuby中實現(xiàn))和多DBMS(MySQL或PostgreSQL)的解決方案。
基于觸發(fā)器,它不支持DDL,用戶或授權(quán)。
使用和管理的簡單性是其主要目標(biāo)。
一些功能:
- 配置簡單
- 安裝簡單
- 平臺獨立,表格設(shè)計獨立。
Pgpool II
它是一種在PostgreSQL服務(wù)器和PostgreSQL數(shù)據(jù)庫客戶端之間工作的中間件。
一些功能:
- 連接池
- 復(fù)寫
- 負(fù)載均衡
- 自動故障轉(zhuǎn)移
- 并行查詢

Bucardo
基于行的異步級聯(lián)主從復(fù)制,使用觸發(fā)器在數(shù)據(jù)庫中排隊;基于行的異步主-主復(fù)制,基于行,使用觸發(fā)器和自定義沖突解決方案。
Bucardo需要專用的數(shù)據(jù)庫并作為Perl守護程序運行,該守護程序與此數(shù)據(jù)庫以及復(fù)制中涉及的所有其他數(shù)據(jù)庫進(jìn)行通信。它可以作為多主機或多從機運行。
主從復(fù)制涉及到一個或多個目標(biāo)的一個或多個源。源必須是PostgreSQL,但是目標(biāo)可以是PostgreSQL,MySQL,redis,Oracle,MariaDB,SQLite或MongoDB。
一些功能:
- 負(fù)載均衡
- 從站不受限制,可以寫
- 部分復(fù)制
- 按需復(fù)制(更改可以自動或在需要時推送)
- 從站可以“預(yù)熱”以快速設(shè)置
缺點:
- 無法處理DDL
- 無法處理大物件
- 沒有唯一鍵無法增量復(fù)制表
- 不適用于Postgres 8之前的版本
Postgres-XC
Postgres-XC是一個開源項目,旨在提供可寫擴展,同步,對稱和透明的PostgreSQL集群解決方案。它是緊密耦合的數(shù)據(jù)庫組件的集合,可以將其安裝在多個硬件或虛擬機中。
寫可伸縮性意味著Postgres-XC可以配置任意數(shù)量的數(shù)據(jù)庫服務(wù)器,并且與單個數(shù)據(jù)庫服務(wù)器相比,可以處理更多的寫操作(更新SQL語句)。
您可以有多個客戶端連接到的數(shù)據(jù)庫服務(wù)器,該服務(wù)器提供數(shù)據(jù)庫的單個一致的群集范圍視圖。
來自任何數(shù)據(jù)庫服務(wù)器的任何數(shù)據(jù)庫更新對于在不同主服務(wù)器上運行的任何其他事務(wù)都是立即可見的。
透明意味著您不必?fù)?dān)心內(nèi)部如何將數(shù)據(jù)存儲在多個數(shù)據(jù)庫服務(wù)器中。
您可以配置Postgres-XC在多個服務(wù)器上運行。您為每個表選擇的數(shù)據(jù)以分布式方式存儲,即分區(qū)或復(fù)制。發(fā)出查詢時,Postgres-XC會確定目標(biāo)數(shù)據(jù)的存儲位置,并向包含目標(biāo)數(shù)據(jù)的服務(wù)器發(fā)出相應(yīng)的查詢。

Citus
Citus用內(nèi)置的高可用性功能(例如自動分片和復(fù)制)替代了PostgreSQL。 Citus分片將您的數(shù)據(jù)庫分片,并在整個商品節(jié)點集群中復(fù)制每個分片的多個副本。如果群集中的任何節(jié)點不可用,Citus會將所有寫入或查詢透明地重定向到其他一個包含受影響的分片副本的節(jié)點。
一些功能:
- 自動邏輯分片
- 內(nèi)置復(fù)制
- 用于災(zāi)難恢復(fù)的數(shù)據(jù)中心感知復(fù)制
- 具有高級負(fù)載平衡功能的中查詢?nèi)蒎e
您可以增加由PostgreSQL支持的實時應(yīng)用程序的正常運行時間,并最大程度地減少硬件故障對性能的影響。您可以使用內(nèi)置的高可用性工具來實現(xiàn)此目標(biāo),從而最大程度地減少成本高昂且易于出錯的手動干預(yù)。
PostgresXL
它是一種無共享的多主群集解決方案,可以透明地在一組節(jié)點上分配表,并并行執(zhí)行這些節(jié)點的查詢。它具有一個稱為全局事務(wù)管理器(GTM)的附加組件,用于提供群集的全局一致視圖。該項目基于PostgreSQL 9.5版本。一些公司,例如2ndQuadrant,為該產(chǎn)品提供商業(yè)支持。
PostgresXL是可水平擴展的開源SQL數(shù)據(jù)庫集群,具有足夠的靈活性來處理各種數(shù)據(jù)庫工作負(fù)載:
- OLTP寫密集型工作負(fù)載
- 需要MPP并行性的商業(yè)智能
- 運營數(shù)據(jù)存儲
- 鍵值存儲
- GIS地理空間
- 混合工作負(fù)載環(huán)境
- 多租戶提供商托管環(huán)境
組件:
- 全局事務(wù)監(jiān)視器(GTM):全局事務(wù)監(jiān)視器確保群集范圍內(nèi)的事務(wù)一致性。
- 協(xié)調(diào)器:協(xié)調(diào)器管理用戶會話并與GTM和數(shù)據(jù)節(jié)點進(jìn)行交互。
- 數(shù)據(jù)節(jié)點:數(shù)據(jù)節(jié)點是存儲實際數(shù)據(jù)的位置。
結(jié)論
還有許多其他產(chǎn)品可以為PostgreSQL創(chuàng)建我們的高可用性環(huán)境,但是您必須注意以下幾點:
- 新產(chǎn)品,未經(jīng)充分測試
- 停產(chǎn)項目
- 局限性
- 許可費用
- 非常復(fù)雜的實現(xiàn)
- 不安全的解決方案
您還必須考慮您的基礎(chǔ)架構(gòu)。如果只有一臺應(yīng)用程序服務(wù)器,那么無論您配置了多少數(shù)據(jù)庫的高可用性,如果應(yīng)用程序服務(wù)器發(fā)生故障,則將無法訪問。您必須很好地分析基礎(chǔ)架構(gòu)中的單點故障,并嘗試解決它們。
考慮到這些要點,您可以找到一種適合您的需求和要求的解決方案,而不會產(chǎn)生麻煩,并且能夠?qū)嵤┠母呖捎眯匀杭鉀Q方案。來吧,祝你好運!
原文:
https://severalnines.com/database-blog/top-pg-clustering-high-availability-ha-solutions-postgresql
本文:
http://jiagoushi.pro/top-pg-clustering-high-availability-ha-solutions-postgresql
討論:請加入知識星球或者微信圈子【首席架構(gòu)師圈】