如何對 Amazon Aurora PostgreSQL 相容版來源資料庫叢集的邏輯複寫問題進行疑難排解?
我想對 Amazon Aurora PostgreSQL 相容版本來源資料庫叢集的邏輯複寫問題進行疑難排解。
解決方法
設定複寫參數
在您疑難排解邏輯複寫問題之前,請先設定資料庫叢集參數群組的以下參數:
- 將 rds.logical_replication 的值設為 1,以在您的資料庫叢集上啟用邏輯複寫。
- 為 max_replication_slots 設定一個值,該值需包含足夠的插槽數量,以支援您預期的訂閱數量及額外的資料表同步處理程序。
- 將 max_wal_senders 設為可支援您 max_replication_slots 配額及目前實體複本的值。
- 將 max_logical_replication_workers 設為可支援您的訂閱數量,以及複寫系統進行資料表同步所需額外工作程序數量的值。
- 將 max_worker_processes 的值設為至少比 max_logical_replication_workers 多 1。例如,如果 max_logical_replication_workers 為 25,則將 max_worker_processes 設為 26。
- 如果資料複製速度緩慢,請提高 max_sync_workers_per_subscription 的值,以控制處理訂閱設定及新增資料表的同步工作程序數量。
**重要:**若要套用上述變更,您必須重新啟動您的 Aurora PostgreSQL 相容版資料庫叢集。
檢查發佈項目與訂閱組態
在您設定邏輯複寫參數之後,請確認您已正確設定發佈項目與訂閱。請確保發佈項目包含所有預期的資料表、訂閱參數正確,且複寫使用者具有適當的權限。
連線至您的來源資料庫,然後執行以下命令。
若要檢查您的發佈項目組態,請執行以下命令:
SELECT * FROM pg_publication; SELECT * FROM pg_publication_tables;
若要檢查您的訂閱組態,請執行以下命令:
SELECT * FROM pg_subscription; SELECT * FROM pg_subscription_rel;
確認複寫插槽為作用中
連線至您的來源資料庫,然後執行以下命令:
SELECT slot_name, plugin, slot_type, active, restart_lsn, confirmed_flush_lsn, pg_current_wal_lsn(), pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn)) AS lag FROM pg_replication_slots;
如果插槽未啟用或顯示過度延遲,請檢查複寫工作程序以疑難排解問題。
確認複寫工作程序為作用中
連線至您的目標資料庫,然後執行以下命令:
SELECT pid, state, query, wait_event, backend_type FROM pg_stat_activity WHERE backend_type LIKE 'logical replication%';
如果沒有複寫工作程序,請重新啟動您的訂閱。
若要關閉您的訂閱,請執行以下命令:
ALTER SUBSCRIPTION subscription_name DISABLE;
若要開啟您的訂閱,請執行以下命令:
ALTER SUBSCRIPTION subscription_name ENABLE;
如果您在重新啟動訂閱之後仍然沒有複寫工作程序,請查看 PostgreSQL 錯誤日誌中的錯誤訊息。
監控複寫進度與延遲
由於發佈項目交易量高或存在大型交易,您的複寫可能會發生延遲。或者,發佈項目或訂閱上可能存在限制條件。
若要判斷複寫是否已停止或速度緩慢,請在數個時間間隔內監控複寫進度。
連線至您的資料庫叢集,然後執行以下命令。
若要檢查您發佈項目的複寫進度,請執行以下命令:
SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn)) AS lag, active FROM pg_replication_slots WHERE slot_type = 'logical';
若要檢查您訂閱的複寫進度,請執行以下命令:
SELECT subname, pid, received_lsn, latest_end_lsn, pg_size_pretty(pg_wal_lsn_diff(latest_end_lsn, received_lsn)) AS lag FROM pg_stat_subscription;
若要將複寫延遲降至最低,請監控直寫式快取。如果快取大小不足以支援您的工作負載,您可以手動變更 rds.logical_wal_cache 的值。如需更多資訊,請參閱 Aurora PostgreSQL 的新直寫式快取可將複寫延遲最多降低至 17 倍。
監控資源限制
若要疑難排解發佈者與訂閱者上的資源限制,請開啟 Enhanced Monitoring,並監控 CPUUtilization、FreeableMemory、SwapUsage 及 NetworkThroughput。設定 Amazon CloudWatch 警示,以在發生複寫問題時接收通知。
如需更多資訊,請參閱如何在 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 相容版資料庫執行個體中,識別與疑難排解效能問題及執行緩慢的查詢?
識別結構描述不相符並解決資料不一致問題
連線至您的來源資料庫與目標資料庫。然後確認複寫的資料表中包含欄位,且資料類型相容。同時確保主索引鍵和唯一限制條件一致。
若要開啟您的訂閱,請執行以下命令:
ALTER SUBSCRIPTION subscription_name ENABLE;
若要比較資料表定義,請在兩個資料庫上執行以下命令:
SELECT column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_name = 'your_table_name' ORDER BY ordinal_position;
**注意:**將 your_table_name 替換為您的資料表名稱。
解決衝突
原生 PostgreSQL 邏輯複寫無法偵測來自多個發佈者的資料衝突,也無法偵測與您在本機變更資料發生衝突的複寫修改。如果目前資料列具有相同的索引鍵,則 Aurora 會套用更新,而插入會失敗。
若要識別衝突原因,請檢查 PostgreSQL 日誌。
以下範例日誌顯示複寫失敗,因為它嘗試插入一筆在目標資料庫中已存在資產 ID 的記錄:
ERROR: 23505: duplicate key value violates unique constraint "asset_pkey" DETAIL: Key (asset_id)=(7) already exists. CONTEXT: processing remote data for replication origin "pg_32796" during message type "INSERT" for replication target relation "public.asset" in transaction 315434, finished at 0/6A12458
複寫來源為 pg_32796,並於邏輯序號 (LSN) 0/6A12458 結束。
若要手動修正資料,您可以在發生衝突時停止複寫,或使用 disable_on_error 選項設定訂閱。
或者,您可以查看來源和目標上的資料,確定是否可以略過導致衝突的 LSN。然後使用 pg_replication_origin_advance() 函式略過導致衝突的 LSN。如需更多資訊,請參閱 PostgreSQL 網站上的 pg_replication_origin_advance (node_name text, lsn pg_lsn)。
**注意:**Aurora PostgreSQL 相容版 15 及更新版本支援 pg_replication_origin_advance() 函式。
若要略過 LSN,請完成以下步驟:
-
執行以下 SQL 命令以暫時關閉訂閱:
ALTER SUBSCRIPTION subscription_name DISABLE;**注意:**如果您使用 disable_on_error 選項設定訂閱,則在發生錯誤後訂閱會自動關閉。
-
使用以下 pg_replication_origin_advance() 函式將來源推進至 Finish_LSN+1:
SELECT pg_replication_origin_advance('node_name','Finish_LSN+1'::pg_lsn);**注意:**將 node_name 替換為您的節點名稱。
-
執行以下命令以開啟訂閱。:
ALTER SUBSCRIPTION subscription-name ENABLE;**注意:**將 subscription-name 替換為您的訂閱名稱。
若要解決多個資料不一致問題,您可能需要清除目標資料表,並重新設定發佈項目和訂閱。
相關資訊
使用 Amazon Aurora PostgreSQL 進行複寫
PostgreSQL 網站上的 PostgreSQL 邏輯複寫
相關內容
- 已提問 10 天前
- 已提問 3 年前
