Postgresql副cersa的複制
我有兩台 Linux 伺服器,每台伺服器上都有 Postgresql-10。在他們兩個上,都有一個數據庫,比如 dbexample,具有相同的模式、表和所有內容。它們都從應用程序擷取數據並將它們儲存在數據庫中(dbexample)。讓我告訴你,由於兩者都是從同一個應用程序擷取數據,因此一次沒有數據不匹配。
現在,我的問題是什麼?由於任何原因,伺服器“A”有時會失敗。那一刻,它無法從應用程序中擷取數據。但是由於第二個是 UP,它必須在伺服器 A 關閉時擷取所有數據。
現在,當伺服器 A 啟動時,我希望所有數據都從伺服器 B 複製到伺服器 A 上,這樣我就可以在兩台伺服器上擁有相同的所有數據。
考慮到伺服器 B 發生故障時的相同情況,我希望反之亦然,即將伺服器 A 的數據複製到伺服器 B。
我已經閱讀了許多教程並提出了以下解決方案:
- 設置兩台伺服器之間的邏輯複製,並使發布者和訂閱者互為對方。(但這可能是一種方法,反之亦然,如果我沒記錯的話)。因此,請提出可能的解決方案。
- 安排一台伺服器C,只恢復數據庫的schema,使伺服器A成為發布者,伺服器C成為訂閱者。伺服器 C 的發布者和伺服器 B 的訂閱者。伺服器 B 發布者和伺服器 A 其訂閱者。它會像: -
A將從B中提取數據,
B將從C中提取數據,並且
C 將從 A 中提取數據。
當 A 和 B 的數據庫中已經有數據時是否可行?
請建議哪種方法更好或您擁有的任何其他解決方案。如果我無法表達我的問題,請原諒我的語言。問我任何澄清。
您想要做的通常是使用多主機設置(同時寫入兩台伺服器)。Postgresql-10 預設沒有這個特性,所以你試圖做的總是一種 hack。
通常,您設置一個主伺服器和一個從伺服器,然後使用類似 wal-shipping(流式複制)的方式複制數據,然後使用類似 repmgr 的方式進行監控。啟用同步複製將確保兩台伺服器具有相同的資訊,但您只將其寫入主伺服器!
當repmgr檢測到master失效時,可以自動將slave提升為master(反之亦然)。如果您使用同步複製,它們將擁有完全相同的數據。Repmgr 可以自動進行故障轉移。
我還將使用keepalived在作為 postgresql 主伺服器的主機上使用特定的 IP 地址,並且您將將此 IP 配置為客戶端的目標。最重要的是,您還可以添加類似pgpool2的東西來負載平衡讀取並將查詢自動路由到主伺服器,但請注意,有很多組件需要正確設置和管理。
如果這還不夠,並且您真的只對 Master/Master 設置感到滿意,那麼您將需要使用一些商業解決方案,例如Postgresql BDR,它可以為您處理複雜性。