為了使訂閱者節點在釋出者節點宕機時能夠繼續從釋出者節點複製資料,必須有一個對應於釋出者節點的物理備用節點。透過在建立訂閱時指定 failover = true
,可以將主伺服器上對應於訂閱的邏輯槽同步到備用伺服器。有關詳細資訊,請參閱 第 47.2.3 節。啟用 failover
引數可確保在備用節點被提升為主節點後,這些訂閱能夠無縫切換。它們可以繼續訂閱新主伺服器上的釋出。
由於槽同步邏輯是非同步複製的,因此在故障轉移發生之前,有必要確認複製槽已同步到備用伺服器。為了確保故障轉移成功,備用伺服器必須領先於訂閱者。這可以透過配置 synchronized_standby_slots
來實現。
為了確認備用伺服器確實已準備好為給定訂閱者進行故障轉移,請按照以下步驟驗證該訂閱者所需的所有邏輯複製槽是否已同步到備用伺服器。
在訂閱者節點上,使用以下 SQL 來確定哪些複製槽應同步到我們計劃提升的備用節點。此查詢將返回與啟用了故障轉移的訂閱相關的複製槽。
/* sub # */ SELECT array_agg(quote_literal(s.subslotname)) AS slots FROM pg_subscription s WHERE s.subfailover AND s.subslotname IS NOT NULL; slots ------- {'sub1','sub2','sub3'} (1 row)
在訂閱者節點上,使用以下 SQL 來確定哪些表同步槽應同步到我們計劃提升的備用節點。此查詢需要在包含啟用了故障轉移的訂閱的每個資料庫上執行。請注意,僅當表複製完成後(參見 第 52.55 節),表同步槽才應同步到備用伺服器。在其他情況下,我們不需要確保表同步槽已同步,因為它們將在新主伺服器上被刪除或重新建立。
/* sub # */ SELECT array_agg(quote_literal(slot_name)) AS slots FROM ( SELECT CONCAT('pg_', srsubid, '_sync_', srrelid, '_', ctl.system_identifier) AS slot_name FROM pg_control_system() ctl, pg_subscription_rel r, pg_subscription s WHERE r.srsubstate = 'f' AND s.oid = r.srsubid AND s.subfailover ); slots ------- {'pg_16394_sync_16385_7394666715149055164'} (1 row)
檢查上述確定的邏輯複製槽是否存在於備用伺服器上並且已準備好進行故障轉移。
/* standby # */ SELECT slot_name, (synced AND NOT temporary AND invalidation_reason IS NULL) AS failover_ready FROM pg_replication_slots WHERE slot_name IN ('sub1','sub2','sub3', 'pg_16394_sync_16385_7394666715149055164'); slot_name | failover_ready --------------------------------------------+---------------- sub1 | t sub2 | t sub3 | t pg_16394_sync_16385_7394666715149055164 | t (4 rows)
如果所有槽都存在於備用伺服器上,並且上述 SQL 查詢的結果(failover_ready
)為 true,那麼現有訂閱可以繼續訂閱新主伺服器上的釋出。
上述過程中的前兩個步驟是為 PostgreSQL 訂閱者設計的。建議在將被指定的備用節點提供服務的每個訂閱者節點上執行這些步驟,以獲取複製槽的完整列表。然後可以在第 3 步中驗證此列表,以確保故障轉移就緒。另一方面,非 PostgreSQL 訂閱者可能使用自己的方法來識別其各自訂閱所使用的複製槽。
在某些情況下,例如在計劃的故障轉移期間,需要確認所有訂閱者(無論是 PostgreSQL 訂閱者還是非 PostgreSQL 訂閱者)都將能夠在新主伺服器上繼續複製。在這種情況下,請使用以下 SQL(而不是執行上述前兩個步驟)來確定主伺服器上哪些邏輯複製槽需要同步到計劃提升的備用節點。此查詢返回與所有啟用了故障轉移的訂閱相關的複製槽。
/* primary # */ SELECT array_agg(quote_literal(r.slot_name)) AS slots FROM pg_replication_slots r WHERE r.failover AND NOT r.temporary; slots ------- {'sub1','sub2','sub3', 'pg_16394_sync_16385_7394666715149055164'} (1 row)
如果您在文件中發現任何不正確、與您使用該特定功能時的體驗不符或需要進一步澄清的內容,請使用 此表單 來報告文件問題。