為了讓訂閱節點即使在發布節點發生故障時也能繼續從發布節點複製資料,必須有一個對應於發布節點的實體備援。通過在創建訂閱時指定 failover = true
,主伺服器上對應於訂閱的邏輯槽可以同步到備援伺服器。 有關詳細訊息,請參閱第 47.2.3 節。啟用 failover
參數可確保在備援升級後,這些訂閱能夠無縫過渡。它們可以繼續訂閱新主伺服器上的發布。
由於槽同步邏輯是異步複製的,因此有必要在發生故障轉移之前確認複製槽已同步到備援伺服器。 為了確保故障轉移成功,備援伺服器必須領先於訂閱者。這可以通過配置 synchronized_standby_slots
來實現。
要確認備援伺服器確實已準備好進行故障轉移,請按照以下步驟驗證所有必要的邏輯複製槽是否已同步到備援伺服器。
在訂閱節點上,使用以下 SQL 語法來識別應同步到我們計劃升級的備援伺服器的複製槽。此查詢將傳回與啟用故障轉移的訂閱相關的相關複製槽。
test_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 語法來識別應同步到我們計劃升級的備援伺服器的表同步槽。此查詢需要在包含啟用故障轉移的訂閱的每個資料庫上執行。請注意,只有在表複製完成後,表同步槽才應同步到備援伺服器(請參閱第 51.55 節)。 在其他情況下,我們不需要確保表同步槽已同步,因為在這些情況下,它們將在新主伺服器上被刪除或重新建立。
test_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)
檢查以上識別的邏輯複製槽是否存在於備援伺服器上,並且已準備好進行故障轉移。
test_standby=# SELECT slot_name, (synced AND NOT temporary AND NOT conflicting) 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,則現有訂閱現在可以繼續訂閱新主伺服器上的發布。
如果您在文件中發現任何不正確、與特定功能的使用體驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。