pglogical
複製功能進行切換和容錯移轉。
事前準備
設定 pglogical
複寫後,如果高可用性 (HA) 和災害復原 (DR) 解決方案可行,且您瞭解邏輯複寫無法提供 true
,也無法全面複寫所有資料庫物件,就必須先測試這項設定,再開始使用。
如要進一步瞭解 pglogical
擴充功能,請參閱「關於 pglogical
」。
如要瞭解如何使用 pglogical
複製資料,請參閱「在 PostgreSQL 適用的 AlloyDB 和 AlloyDB Omni 之間複製資料」和「在 AlloyDB Omni 和其他資料庫之間複製資料」。
使用 pglogical 複製功能進行切換
切換是受控程序,用於在供應商和訂閱者資料庫之間切換角色。執行切換作業時,兩個資料庫 (供應者和訂閱者) 的角色會反轉。提供者會成為訂閱者,訂閱者則會成為提供者。
這項切換功能對於作業系統升級、PostgreSQL 升級或容錯移轉測試非常重要。
如要在單向複製設定中達成此目的,您必須設定新的供應商/訂閱者關係,並移除舊的供應商/訂閱者關係。
建構新的提供者/訂閱者設定
停止應用程式寫入供應商系統,避免資料庫進一步變更,並檢查複製延遲,確保所有交易都在訂閱者節點上重新執行:
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
將訂閱者資料庫轉換為供應商資料庫:
- 停止現有訂閱者的訂閱方案。
- 視需要新增複寫集。
- 將必要資料表新增至複寫集。
- 在新訂閱者資料庫中建立新的訂閱者訂閱項目。
- 將應用程式重新導向至新供應商。
在現有訂閱者資料庫中停止訂閱,該資料庫會成為新供應商:
SELECT pglogical.alter_subscription_disable(SUBSCRIPTION_NAME);
(選用) 建立與原始供應商資料庫定義相符的複寫集。如果您使用預設的複寫集,則不需要執行這項操作:
SELECT pglogical.create_replication_set(REPLICATION_SET_NAME);
將資料表新增至該複寫集:
SELECT pglogical.replication_set_add_table(REPLICATION_SET_NAME, TABLE_NAME);
更改下列內容:
- REPLICATION_SET_NAME:複製集名稱。
- TABLE_NAME:結構定義擁有者的資料表名稱。例如:
ARRAY['public']
。
在新的訂閱者資料庫 (先前為供應商資料庫) 中,建立新的訂閱項目,並將
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>');
檢查訂閱項目是否能在供應商節點上運作:
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;
如果複製作業正常運作,請變更應用程式連線字串,改用新的供應商資料庫,然後重新啟動應用程式層。
如果停止訂閱者後變更舊供應商節點上的資料,這些變更不會複製,導致資料遺失。如果原始供應商資料庫有未複製的資料變更,或原始供應商 (即新的訂閱者) 的狀態與新的供應商資料庫 (即舊的訂閱者) 不一致,您就必須完整建構新的訂閱者資料庫。
移除舊的供應商和訂閱方案
如要進行單向複製,請移除舊的供應商/訂閱者設定。
向新供應商取消舊訂閱方案:
SELECT pglogical.drop_subscription('<subscription name>')
在新訂閱者上移除複寫集,或從複寫集中移除所有資料表:
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_subscription
的 synchronize_data
參數設為 false
。這樣可避免資料的初始資料表副本。
使用 pglogical 複製功能進行容錯移轉
當供應商資料庫因任何原因無法使用時,就會發生容錯移轉,您必須切換應用程式以使用訂閱者資料庫。
為避免系統不慎將重複資料套用至容錯移轉的訂閱者資料庫,您必須停用訂閱。這樣做可確保供應商恢復服務後,系統不會誤用還原的供應商資料。
停止訂閱者
test_sub_1
:SELECT pglogical.alter_subscription_disable(`test_sub_1`);
確認狀態是否設為「
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})
在狀態輸出內容中檢查已停用的關鍵字。
建立新的供應商/訂閱者設定,維持高可用性並確保災難復原能力。
建立新的複寫集,其中包含原本複寫的所有資料表,以便在舊供應商資料庫復原並轉換為新訂閱者或建立新訂閱者時,建構新的訂閱者。
如果可以將舊供應商資料庫還原至發生故障時的狀態,請將這個資料庫設為新的訂閱者。按照相同步驟建立訂閱項目,並將
pglogical.create_subscription
指令的synchronize_data
參數設為false
,避免複製初始資料表。移除復原節點上的舊供應商設定,避免 WAL 檔案累積。
如果您使用舊的供應商資料庫,請捨棄整個複製集,或逐一從複製集中移除所有資料表:
SELECT pglogical.drop_replication_set('<replication set name>')
SELECT pglogical.replication_set_remove_table('<replication set name>','<table name>')
將應用程式切換為寫入新節點。