搭配多可用區域資料庫叢集使用 PostgreSQL 邏輯複寫 - Amazon Relational Database Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

搭配多可用區域資料庫叢集使用 PostgreSQL 邏輯複寫

透過搭配多可用區域資料庫叢集使用 PostgreSQL 邏輯複寫,您可以複寫和同步個別資料表,而不是整個資料庫執行個體。邏輯複寫會使用發佈與訂閱模型,將來源中的變更複寫到一或多個收件人。其運作方式為使用 PostgreSQL 預寫日誌 (WAL) 中的變更記錄。如需詳細資訊,請參閱 為 Amazon RDS for PostgreSQL 執行邏輯複寫

當您在多可用區域資料庫叢集的寫入器資料庫執行個體上建立新的邏輯複寫插槽時,插槽會以非同步方式複製到叢集中的每個讀取器資料庫執行個體。讀取器資料庫執行個體上的插槽會持續與寫入器資料庫執行個體上的插槽同步。

執行 RDS for PostgreSQL 14.8-R2 版及更新版本,以及 15.3-R2 版及更新版本的多可用區域資料庫叢集支援邏輯複寫。

注意

除了原生 PostgreSQL 邏輯複寫功能之外,執行 RDS for PostgreSQL 的多可用區域資料庫叢集也支援 pglogical 延伸模組。

如需 PostgreSQL 邏輯複寫的詳細資訊,請參閱 PostgreSQL 文件中的邏輯複寫

必要條件

若要為多可用區域資料庫叢集設定 PostgreSQL 邏輯複寫,您必須符合下列先決條件。

設定邏輯複寫

若要為多可用區域資料庫叢集設定邏輯複寫,請在相關聯的資料庫叢集參數群組內啟用特定參數,然後建立邏輯複寫插槽。

注意

從 PostgreSQL 第 16 版開始,您可以使用異地同步備份資料庫叢集的讀取器資料庫執行個體進行邏輯複寫。

為 RDS for PostgreSQL 多可用區域資料庫叢集設定邏輯複寫
  1. 開啟與 RDS for PostgreSQL 多可用區域資料庫叢集相關聯的自訂資料庫叢集參數群組。

  2. 參數搜尋欄位中,找出 rds.logical_replication 靜態參數並將其值設為 1。此參數變更可能會增加 WAL 產生,因此只有在使用邏輯插槽時才啟用該變更。

  3. 做為此變更的一部分,請設定下列資料庫叢集參數。

    • max_wal_senders

    • max_replication_slots

    • max_connections

    根據您預期的用量,您可能也需要變更下列參數的值。不過,在許多情況下,預設值就足夠了。

    • max_logical_replication_workers

    • max_sync_workers_per_subscription

  4. 重新啟動多可用區域資料庫叢集,讓參數值生效。如需說明,請參閱重新啟機多可用區域資料庫叢集和讀取器資料庫執行個體

  5. 使用邏輯複寫槽 中所述,在多可用區域資料庫叢集的寫入器資料庫執行個體上建立邏輯複寫插槽。此程序要求您指定解碼外掛程式。目前,RDS for PostgreSQL 支援隨附於 PostgreSQL 的 test_decodingwal2jsonpgoutput 外掛程式。

    插槽會以非同步方式複製到叢集中的每個讀取器資料庫執行個體。

  6. 驗證多可用區域資料庫叢集的所有讀取器資料庫執行個體上的插槽狀態。若要這麼做,請檢查所有讀取器資料庫執行個體上的 pg_replication_slots 檢視,並確定當應用程式主動取用邏輯變更時,confirmed_flush_lsn 狀態正在進行。

    下列命令示範如何檢查讀取器資料庫執行個體上的複寫狀態。

    % psql -h test-postgres-instance-2.abcdefabcdef.us-west-2.rds.amazonaws.com postgres=> select slot_name, slot_type, confirmed_flush_lsn from pg_replication_slots; slot_name | slot_type | confirmed_flush_lsn --------------+-----------+--------------------- logical_slot | logical | 32/D0001700 (1 row) postgres=> select slot_name, slot_type, confirmed_flush_lsn from pg_replication_slots; slot_name | slot_type | confirmed_flush_lsn --------------+-----------+--------------------- logical_slot | logical | 32/D8003628 (1 row) % psql -h test-postgres-instance-3.abcdefabcdef.us-west-2.rds.amazonaws.com postgres=> select slot_name, slot_type, confirmed_flush_lsn from pg_replication_slots; slot_name | slot_type | confirmed_flush_lsn --------------+-----------+--------------------- logical_slot | logical | 32/D0001700 (1 row) postgres=> select slot_name, slot_type, confirmed_flush_lsn from pg_replication_slots; slot_name | slot_type | confirmed_flush_lsn --------------+-----------+--------------------- logical_slot | logical | 32/D8003628 (1 row)

在完成複寫任務之後,您應該停止複寫程序、捨棄複寫插槽,並關閉邏輯複寫。若要關閉邏輯複寫,請修改您的資料庫叢集參數群組,並將 rds.logical_replication 的值設回 0。重新啟動叢集,讓參數變更生效。

限制與建議

下列限制和建議適用於將邏輯複寫與執行 PostgreSQL 第 16 版的異地同步備份資料庫叢集搭配使用:

  • 您只能使用寫入器資料庫執行個體來建立或卸除邏輯複寫插槽。例如,CREATE SUBSCRIPTION命令必須使用主機連接字串中的叢集寫入器端點。

  • 您必須在任何資料表同步處理或重新同步處理期間使用叢集寫入器端點。例如,您可以使用下列命令重新同步處理新增的資料表:

    Postgres=>ALTER SUBSCRIPTION subscription-name CONNECTION host=writer-endpoint Postgres=>ALTER SUBSCRIPTION subscription-name REFRESH PUBLICATION
  • 您必須等待表格同步處理完成,才能使用讀取器資料庫執行個體進行邏輯複寫。您可以使用目pg_subscription_rel錄表格來監視表格同步化。srsubstate資料行設定為 ready (r) 時,表格同步處理即完成。

  • 我們建議在初始資料表同步處理完成後,針對邏輯複寫連線使用執行個體端點。下列指令可將複寫卸載至其中一個讀取器資料庫執行個體,以減少寫入器資料庫執行個體的負載:

    Postgres=>ALTER SUBSCRITPION subscription-name CONNECTION host=reader-instance-endpoint

    您不能一次在多個資料庫執行個體上使用相同的插槽。當兩個或兩個以上的應用程式從叢集中的不同資料庫執行個體複製邏輯變更時,某些變更可能會因叢集容錯移轉或網路問題而遺失。在這些情況下,您可以在主機連接字串中使用執行個體端點進行邏輯複寫。使用相同組態的其他應用程式會顯示下列錯誤訊息:

    replication slot slot_name is already active for PID x providing immediate feedback.
  • 使用pglogical擴充功能時,您只能使用叢集寫入器端點。延伸模組具有已知的限制,可在資料表同步處理期間建立未使用的邏輯複寫 過時的複寫插槽會保留預寫記錄 (WAL) 檔案,並可能導致磁碟空間問題。