本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
搭配多可用區域資料庫叢集使用 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 邏輯複寫,您必須符合下列先決條件。
-
您的使用者帳戶必須是
rds_superuser
群組的成員並具有rds_superuser
權限。如需詳細資訊,請參閱 了解 PostgreSQL 角色和許可。 -
您的多可用區域資料庫叢集必須與自訂資料庫叢集參數群組相關聯,以便您可以設定下列程序中所述的參數值。如需詳細資訊,請參閱 使用多可用區域資料庫叢集的資料庫叢集參數群組。
設定邏輯複寫
若要為多可用區域資料庫叢集設定邏輯複寫,請在相關聯的資料庫叢集參數群組內啟用特定參數,然後建立邏輯複寫插槽。
注意
從 PostgreSQL 第 16 版開始,您可以使用異地同步備份資料庫叢集的讀取器資料庫執行個體進行邏輯複寫。
為 RDS for PostgreSQL 多可用區域資料庫叢集設定邏輯複寫
-
開啟與 RDS for PostgreSQL 多可用區域資料庫叢集相關聯的自訂資料庫叢集參數群組。
在參數搜尋欄位中,找出
rds.logical_replication
靜態參數並將其值設為1
。此參數變更可能會增加 WAL 產生,因此只有在使用邏輯插槽時才啟用該變更。-
做為此變更的一部分,請設定下列資料庫叢集參數。
-
max_wal_senders
-
max_replication_slots
-
max_connections
根據您預期的用量,您可能也需要變更下列參數的值。不過,在許多情況下,預設值就足夠了。
-
max_logical_replication_workers
-
max_sync_workers_per_subscription
-
-
重新啟動多可用區域資料庫叢集,讓參數值生效。如需說明,請參閱重新啟機多可用區域資料庫叢集和讀取器資料庫執行個體。
-
如 使用邏輯複寫槽 中所述,在多可用區域資料庫叢集的寫入器資料庫執行個體上建立邏輯複寫插槽。此程序要求您指定解碼外掛程式。目前,RDS for PostgreSQL 支援隨附於 PostgreSQL 的
test_decoding
、wal2json
和pgoutput
外掛程式。插槽會以非同步方式複製到叢集中的每個讀取器資料庫執行個體。
-
驗證多可用區域資料庫叢集的所有讀取器資料庫執行個體上的插槽狀態。若要這麼做,請檢查所有讀取器資料庫執行個體上的
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 SUBSCRIPTIONsubscription-name
CONNECTION host=writer-endpoint
Postgres=>
ALTER SUBSCRIPTIONsubscription-name
REFRESH PUBLICATION -
您必須等待表格同步處理完成,才能使用讀取器資料庫執行個體進行邏輯複寫。您可以使用目
pg_subscription_rel
錄表格來監視表格同步化。srsubstate
資料行設定為 ready (r
) 時,表格同步處理即完成。 -
我們建議在初始資料表同步處理完成後,針對邏輯複寫連線使用執行個體端點。下列指令可將複寫卸載至其中一個讀取器資料庫執行個體,以減少寫入器資料庫執行個體的負載:
Postgres=>
ALTER SUBSCRITPIONsubscription-name
CONNECTION host=reader-instance-endpoint
您不能一次在多個資料庫執行個體上使用相同的插槽。當兩個或兩個以上的應用程式從叢集中的不同資料庫執行個體複製邏輯變更時,某些變更可能會因叢集容錯移轉或網路問題而遺失。在這些情況下,您可以在主機連接字串中使用執行個體端點進行邏輯複寫。使用相同組態的其他應用程式會顯示下列錯誤訊息:
replication slot
slot_name
is already active for PIDx
providing immediate feedback. -
使用
pglogical
擴充功能時,您只能使用叢集寫入器端點。延伸模組具有已知的限制,可在資料表同步處理期間建立未使用的邏輯複寫 過時的複寫插槽會保留預寫記錄 (WAL) 檔案,並可能導致磁碟空間問題。