使用 pglogical 複寫功能進行切換和容錯移轉

選取說明文件版本:

本頁說明如何使用pglogical複製功能進行切換和容錯移轉。

事前準備

設定 pglogical 複寫後,如果高可用性 (HA) 和災害復原 (DR) 解決方案可行,且您瞭解邏輯複寫無法提供 true,也無法全面複寫所有資料庫物件,就必須先測試這項設定,再開始使用。

如要進一步瞭解 pglogical 擴充功能,請參閱「關於 pglogical」。

如要瞭解如何使用 pglogical 複製資料,請參閱「在 PostgreSQL 適用的 AlloyDB 和 AlloyDB Omni 之間複製資料」和「在 AlloyDB Omni 和其他資料庫之間複製資料」。

使用 pglogical 複製功能進行切換

切換是受控程序,用於在供應商和訂閱者資料庫之間切換角色。執行切換作業時,兩個資料庫 (供應者和訂閱者) 的角色會反轉。提供者會成為訂閱者,訂閱者則會成為提供者。

這項切換功能對於作業系統升級、PostgreSQL 升級或容錯移轉測試非常重要。

如要在單向複製設定中達成此目的,您必須設定新的供應商/訂閱者關係,並移除舊的供應商/訂閱者關係。

建構新的提供者/訂閱者設定

  1. 停止應用程式寫入供應商系統,避免資料庫進一步變更,並檢查複製延遲,確保所有交易都在訂閱者節點上重新執行:

    SELECT application_name,
        state,
        sync_state,
        client_addr,
        client_hostname,
        pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) AS sent_lag,
        pg_wal_lsn_diff(sent_lsn,flush_lsn) AS receiving_lag,
        pg_wal_lsn_diff(flush_lsn,replay_lsn) AS replay_lag,
        pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn) AS total_lag,
        now()-reply_time AS reply_delay
    FROM pg_stat_replication
    ORDER BY client_hostname;
    

    當所有延遲欄位都顯示零時,表示複製作業已完成,資料庫已準備好進行切換。

    輸出結果會與下列內容相似:

    -[ RECORD 1 ]----+------------------------------
    application_name | test_sub_1
    state            | streaming
    sync_state       | async
    client_addr      | 10.45.0.80
    client_hostname  | 
    sent_lag         | 0
    receiving_lag    | 0
    replay_lag       | 0
    total_lag        | 0
    reply_delay      | 00:00:26.203433
    
  2. 將訂閱者資料庫轉換為供應商資料庫:

    1. 停止現有訂閱者的訂閱方案。
    2. 視需要新增複寫集。
    3. 將必要資料表新增至複寫集。
    4. 在新訂閱者資料庫中建立新的訂閱者訂閱項目。
    5. 將應用程式重新導向至新供應商。
  3. 在現有訂閱者資料庫中停止訂閱,該資料庫會成為新供應商:

    SELECT pglogical.alter_subscription_disable(SUBSCRIPTION_NAME);
    
  4. (選用) 建立與原始供應商資料庫定義相符的複寫集。如果您使用預設的複寫集,則不需要執行這項操作:

    SELECT pglogical.create_replication_set(REPLICATION_SET_NAME);
    
  5. 將資料表新增至該複寫集:

    SELECT pglogical.replication_set_add_table(REPLICATION_SET_NAME, TABLE_NAME);
    

    更改下列內容:

    • REPLICATION_SET_NAME:複製集名稱。
    • TABLE_NAME:結構定義擁有者的資料表名稱。例如:ARRAY['public']
  6. 在新的訂閱者資料庫 (先前為供應商資料庫) 中,建立新的訂閱項目,並將 synchronize_data 選項設為 false,避免載入初始資料表:

    SELECT pglogical.create_subscription (
               subscription_name := '<subscription name>',
               replication_sets := array['default'],
               synchronize_data := false,
               provider_dsn := 'host=<hostname or IP> port=5432 
               dbname=<db name> user=pglogical_replication password=<password>');
    
  7. 檢查訂閱項目是否能在供應商節點上運作:

    SELECT application_name,
        state,
        sync_state,
        client_addr,
        client_hostname,
        pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) AS sent_lag,
        pg_wal_lsn_diff(sent_lsn,flush_lsn) AS receiving_lag,
        pg_wal_lsn_diff(flush_lsn,replay_lsn) AS replay_lag,
        pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn) AS total_lag,
        now()-reply_time AS reply_delay
    FROM pg_stat_replication
    ORDER BY client_hostname;
    
  8. 如果複製作業正常運作,請變更應用程式連線字串,改用新的供應商資料庫,然後重新啟動應用程式層。

如果停止訂閱者後變更舊供應商節點上的資料,這些變更不會複製,導致資料遺失。如果原始供應商資料庫有未複製的資料變更,或原始供應商 (即新的訂閱者) 的狀態與新的供應商資料庫 (即舊的訂閱者) 不一致,您就必須完整建構新的訂閱者資料庫。

移除舊的供應商和訂閱方案

如要進行單向複製,請移除舊的供應商/訂閱者設定。

  1. 向新供應商取消舊訂閱方案:

    SELECT pglogical.drop_subscription('<subscription name>')
    
  2. 在新訂閱者上移除複寫集,或從複寫集中移除所有資料表:

    SELECT pglogical.drop_replication_set('<replication set name>')
    
    SELECT pglogical.replication_set_remove_table('<replication set name>','<table name>')
    

雙向複製

如要切換而不停機,或確保不會因非預期的資料變更而遺失資料,請務必使用雙向複製功能。實作雙向複寫時,請考慮衝突解決方式,除非您已採取嚴格控管措施,防止同時寫入兩個節點。

您可以使用下列 pglogical.conflict_resolution 設定,設定衝突解決設定:

  • error:偵測到衝突時,訂閱者會停止。
  • apply_remote:一律套用傳入的變更,無論訂閱者資料庫中的資料為何。這是預設設定。
  • keep_local:一律忽略衝突的傳入資料,並捨棄衝突的變更。
  • last_update_wins:具有最新提交時間戳記的資料版本,就是已提交的資料
  • first_update_wins:時間戳記最舊的資料版本就是已提交的資料

如要設定雙向複製,請設定供應商和訂閱者,讓複製作業雙向進行。原始訂閱者也會成為供應商,並與原始供應商使用相同的複寫集。請參閱「在 PostgreSQL 適用的 AlloyDB 供應商資料庫中建立資料表,並新增至預設複製集」,建立複製集,複製初始供應商資料庫中的原始複製集。

你必須在原供應商新增訂閱者。請參閱「在 AlloyDB Omni 訂閱端資料庫上建立節點和訂閱項目」,建立新的訂閱端,並確保指令 pglogical.create_subscriptionsynchronize_data 參數設為 false。這樣可避免資料的初始資料表副本。

使用 pglogical 複製功能進行容錯移轉

當供應商資料庫因任何原因無法使用時,就會發生容錯移轉,您必須切換應用程式以使用訂閱者資料庫。

為避免系統不慎將重複資料套用至容錯移轉的訂閱者資料庫,您必須停用訂閱。這樣做可確保供應商恢復服務後,系統不會誤用還原的供應商資料。

  1. 停止訂閱者 test_sub_1

    SELECT pglogical.alter_subscription_disable(`test_sub_1`);
    
  2. 確認狀態是否設為「disabled」:

    SELECT pglogical.show_subscription_status('test_sub_1');
    

    輸出結果會與下列內容相似:

    show_subscription_status                                                                           
    ----------------------------------------------------------------------------
    (test_sub1,disabled,subscriber,"host=10.45.0.108 port=5432 dbname=my_test_db user=pglogical_replication",subscriber,{failover_set},{all})
    
  3. 在狀態輸出內容中檢查已停用的關鍵字。

  4. 建立新的供應商/訂閱者設定,維持高可用性並確保災難復原能力。

  5. 建立新的複寫集,其中包含原本複寫的所有資料表,以便在舊供應商資料庫復原並轉換為新訂閱者或建立新訂閱者時,建構新的訂閱者。

  6. 設定訂閱者

  7. 如果可以將舊供應商資料庫還原至發生故障時的狀態,請將這個資料庫設為新的訂閱者。按照相同步驟建立訂閱項目,並將 pglogical.create_subscription 指令的 synchronize_data 參數設為 false,避免複製初始資料表。

  8. 移除復原節點上的舊供應商設定,避免 WAL 檔案累積。

  9. 如果您使用舊的供應商資料庫,請捨棄整個複製集,或逐一從複製集中移除所有資料表:

    SELECT pglogical.drop_replication_set('<replication set name>')
    
    SELECT pglogical.replication_set_remove_table('<replication set name>','<table name>')
    
  10. 將應用程式切換為寫入新節點。

後續步驟