本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
透過搭配多可用區域資料庫叢集使用 PostgreSQL 邏輯複寫,您可以複寫和同步個別資料表,而不是整個資料庫執行個體。邏輯複寫會使用發佈與訂閱模型,將來源中的變更複寫到一或多個收件人。它的運作方式是使用 PostgreSQL 預先寫入日誌 () 中的變更記錄WAL。如需詳細資訊,請參閱執行 Amazon RDS for Postgre 的邏輯複寫SQL。
當您在多可用區域資料庫叢集的寫入器資料庫執行個體上建立新的邏輯複寫插槽時,插槽會以非同步方式複製到叢集中的每個讀取器資料庫執行個體。讀取器資料庫執行個體上的插槽會持續與寫入器資料庫執行個體上的插槽同步。
針對 PostgreSQL 版本 14.8-R2 及更高版本以及 15.3-R2 及更高版本執行RDS的多可用區域資料庫叢集支援邏輯複寫。
注意
除了原生 PostgreSQL 邏輯複寫功能之外,執行 RDS for PostgreSQL 的多可用區域資料庫叢集也支援 pglogical
擴充功能。
如需 PostgreSQL 邏輯複寫的詳細資訊,請參閱 PostgreSQL 文件中的邏輯複寫
必要條件
若要設定多可用區域資料庫叢集的 PostgreSQL 邏輯複寫,您必須符合下列先決條件。
-
您的使用者帳戶必須是
rds_superuser
群組的成員並具有rds_superuser
權限。如需詳細資訊,請參閱了解職員SQL角色和權限。 -
您的多可用區域資料庫叢集必須與自訂資料庫叢集參數群組相關聯,以便您可以設定下列程序中所述的參數值。如需詳細資訊,請參閱使用多可用區域資料庫叢集的資料庫叢集參數群組。
設定邏輯複寫
若要為多可用區域資料庫叢集設定邏輯複寫,請在相關聯的資料庫叢集參數群組內啟用特定參數,然後建立邏輯複寫插槽。
注意
從 PostgreSQL 第 16 版開始,您可以使用多可用區域資料庫叢集的讀取器資料庫執行個體進行邏輯複寫。
設定RDS適用於 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
-
-
重新啟動多可用區域資料庫叢集,讓參數值生效。如需說明,請參閱 重新啟動 Amazon 的多可用區域資料庫叢集和讀取器資料庫執行個體 RDS。
-
如 使用邏輯複寫槽 中所述,在多可用區域資料庫叢集的寫入器資料庫執行個體上建立邏輯複寫插槽。此程序要求您指定解碼外掛程式。目前, RDS for PostgreSQL
test_decoding
支援隨附 Postgre 的wal2json
、 和pgoutput
外掛程式SQL。插槽會以非同步方式複製到叢集中的每個讀取器資料庫執行個體。
-
驗證多可用區域資料庫叢集的所有讀取器資料庫執行個體上的插槽狀態。若要這麼做,請檢查所有讀取器資料庫執行個體上的
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
欄設定為就緒 () 時,資料表同步完成r
。 -
我們建議在初始資料表同步完成後,使用執行個體端點進行邏輯複寫連線。下列命令會將複寫卸載至其中一個讀取器資料庫執行個體,以降低寫入器資料庫執行個體的負載:
Postgres=>
ALTER SUBSCRIPTIONsubscription-name
CONNECTION host=reader-instance-endpoint
您無法一次在多個資料庫執行個體上使用相同的插槽。當兩個或多個應用程式從叢集中的不同資料庫執行個體複寫邏輯變更時,某些變更可能會因為叢集容錯移轉或網路問題而遺失。在這些情況下,您可以使用執行個體端點在主機連線字串中進行邏輯複寫。使用相同組態的其他應用程式會顯示下列錯誤訊息:
replication slot
slot_name
is already active for PIDx
providing immediate feedback. -
使用
pglogical
擴充功能時,您只能使用叢集寫入器端點。延伸模組具有已知限制,可在資料表同步期間建立未使用的邏輯複寫槽。過時的複寫槽會保留預先寫入日誌 (WAL) 檔案,並可能導致磁碟空間問題。