支援的版本:目前 (17)
開發版本:devel

29.3. 邏輯複製故障轉移 #

為了讓訂閱者節點即使在發布者節點發生故障時也能繼續複製來自發布者節點的資料,必須有一個對應於發布者節點的實體備援節點。 primary 伺服器上對應於訂閱的邏輯槽可以通過在創建訂閱時指定 failover = true 來同步到備援伺服器。有關詳細資訊,請參閱第 47.2.3 節。啟用 failover 參數可確保在備援節點升級後,這些訂閱能無縫轉移。它們可以繼續訂閱新 primary 伺服器上的發布。

由於槽同步邏輯是異步複製的,因此在發生故障轉移之前,有必要確認複製槽已同步到備援伺服器。為了確保故障轉移成功,備援伺服器必須領先於訂閱者。這可以通過配置 synchronized_standby_slots 來實現。

要確認備援伺服器確實已準備好進行故障轉移,請按照以下步驟驗證所有必要的邏輯複製槽都已同步到備援伺服器

  1. 在訂閱者節點上,使用以下 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)
    
  2. 在訂閱者節點上,使用以下 SQL 語句來識別哪些表格同步槽應同步到我們計劃升級的備援伺服器。此查詢需要在包含啟用故障轉移的訂閱的每個資料庫上執行。請注意,只有在表格複製完成後,表格同步槽才應同步到備援伺服器(請參閱第 51.55 節)。在其他情況下,我們不需要確保表格同步槽已同步,因為在這些情況下,它們將在新 primary 伺服器上被刪除或重新創建。

    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)
    
  3. 檢查上述識別的邏輯複製槽是否存在於備援伺服器上,並且已準備好進行故障轉移。

    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,則現有訂閱現在可以繼續訂閱新 primary 伺服器上的發布。

提交更正

如果您在文件中發現任何不正確、與特定功能的使用經驗不符或需要進一步澄清的地方,請使用此表單來報告文件問題。