正確管理 PGPool II
目前我有一個站點,有一個 Postgres 數據庫伺服器。它僅適用於選定數量的使用者(少於 10 個),但它需要盡可能長的正常執行時間。
我想對數據庫進行某種自動故障轉移。
所以我在想這樣的事情:一台執行 PGPool II 的伺服器,一台執行 Postgres 作為主伺服器,一台執行 Postgres 作為從伺服器。但是,如果 PGPool 執行的任何地方突然斷電(或當機,或其他),就會出現單點故障,整個事情就會崩潰。
假設不可能將其外包給其他人,是否有解決方案?
可以確定的一件事是,必須至少有兩台機器在執行
pgpool
。您如何實現這一點取決於 - 沒有普遍適用於所有情況的解決方案。如果您擁有的是一個 Web 應用程序,那麼您還必須在至少兩台機器上執行該 Web 應用程序,這樣您就可以進行如下操作:+----------+ +---------+ | pgmaster | | pgslave | +----------+ +---------+ | | +----------+-------------+-----------+ | | +-----|----+ +-----|----+ | pgpool | | pgpool | | | | | | | | webapp | | webapp | +-----|----+ +-----|----+ | | internet internet
(在這種情況下,您還需要在客戶端進行某種故障轉移——我標記為“網際網路”的那個。)
另一方面,如果您確實需要的不是高可用性 Web 應用程序(或類似服務),而是高可用性 postgresql(任何客戶端都可以隨時連接),那麼另一種選擇是
+----------+ +---------+ | pgmaster | | pgslave | +----------+ +---------+ | | +----------+-------------+-----------+ | | +-----|----+ +-----|----+ | pgpool | | pgpool | (standby) +-----|----+ +-----|----+ | | Failover IP address | client
在這種
pgpool
情況下, 也可以與數據庫在同一台機器上。重要的是,如果 IP 地址故障轉移,您需要某種方式,這keepalived
可能keepalived
是切換故障轉移 IP 的不同方式)。另請注意,在這種情況下,連接的客戶端可能會在故障轉移的情況下斷開連接,但它們將能夠立即重新連接。另請注意,還有其他困難,其中之一是您不能排除網路分區,其中兩台 PostgreSQL 機器都將工作並連接,但它們會以某種方式失去彼此的連接,所以他們每個人都會認為另一個死了,因此每個人都會決定成為大師。為了解決這個問題,我知道三種解決方案: 1)STONITH,需要特殊的硬體;2)Quorums,需要特殊軟體(如corosync/pacemaker);3) 手動故障轉移(管理員收到通知,系統崩潰,直到他們決定如何修復它)。但是,如果你使用我上面提出的方案,設置一個法定人數可能不是太難,但是用三個
pgpool
而不是兩個;但我不記得是否pgpool
支持。底線:高可用性可能既困難又昂貴。仔細檢查完全避免它的可能性。如果你做不到,請準備好多學習、多設計和重新設計,並意識到這將花費大量時間。