跳至內容

如何對 Amazon Aurora PostgreSQL 相容版來源資料庫叢集的邏輯複寫問題進行疑難排解?

2 分的閱讀內容
0

我想對 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,並監控 CPUUtilizationFreeableMemorySwapUsageNetworkThroughput設定 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,請完成以下步驟:

  1. 執行以下 SQL 命令以暫時關閉訂閱:

    ALTER SUBSCRIPTION subscription_name DISABLE;

    **注意:**如果您使用 disable_on_error 選項設定訂閱,則在發生錯誤後訂閱會自動關閉。

  2. 使用以下 pg_replication_origin_advance() 函式將來源推進至 Finish_LSN+1

    SELECT pg_replication_origin_advance('node_name','Finish_LSN+1'::pg_lsn);

    **注意:**將 node_name 替換為您的節點名稱。

  3. 執行以下命令以開啟訂閱。:

    ALTER SUBSCRIPTION subscription-name ENABLE;

    **注意:**將 subscription-name 替換為您的訂閱名稱。

若要解決多個資料不一致問題,您可能需要清除目標資料表,並重新設定發佈項目和訂閱。

相關資訊

使用 Amazon Aurora PostgreSQL 進行複寫

PostgreSQL 網站上的 PostgreSQL 邏輯複寫

為您的 Aurora PostgreSQL 資料庫叢集設定邏輯複寫

使用 Amazon CloudWatch 監控 Amazon Aurora 指標

AWS 官方已更新 6 個月前