

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

# 為 Amazon RDS 的多可用區域資料庫叢集設定 PostgreSQL 邏輯複寫
<a name="USER_MultiAZDBCluster_LogicalRepl"></a>

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

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

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

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

如需 PostgreSQL 邏輯複寫的詳細資訊，請參閱 PostgreSQL 文件中的[邏輯複寫](https://www.postgresql.org/docs/current/logical-replication.html)。

**Topics**
+ [先決條件](#multi-az-db-clusters-logical-replication-prereqs)
+ [設定邏輯複寫](#multi-az-db-clusters-logical-replication)
+ [限制與建議](#multi-az-db-clusters-logical-replication-limitations)

## 先決條件
<a name="multi-az-db-clusters-logical-replication-prereqs"></a>

若要為多可用區域資料庫叢集設定 PostgreSQL 邏輯複寫，您必須符合下列先決條件。
+ 您的使用者帳戶必須是 `rds_superuser` 群組的成員並具有 `rds_superuser` 權限。如需詳細資訊，請參閱[了解 PostgreSQL 角色和許可](Appendix.PostgreSQL.CommonDBATasks.Roles.md)。
+ 您的多可用區域資料庫叢集必須與自訂資料庫叢集參數群組相關聯，以便您可以設定下列程序中所述的參數值。如需詳細資訊，請參閱[使用多可用區域資料庫叢集的資料庫叢集參數群組](USER_WorkingWithDBClusterParamGroups.md)。

## 設定邏輯複寫
<a name="multi-az-db-clusters-logical-replication"></a>

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

**注意**  
從 PostgreSQL 第 16 版開始，您可以使用多可用區域資料庫叢集的讀取器資料庫執行個體進行邏輯複寫。

**為 RDS for PostgreSQL 多可用區域資料庫叢集設定邏輯複寫**

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

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

1. 做為此變更的一部分，請設定下列資料庫叢集參數。
   + `max_wal_senders`
   + `max_replication_slots`
   + `max_connections`

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

1. 重新啟動多可用區域資料庫叢集，讓參數值生效。如需說明，請參閱[重新啟動 Amazon RDS 的多可用區域資料庫叢集和讀取器資料庫執行個體](multi-az-db-clusters-concepts-rebooting.md)。

1. 如 [使用邏輯複寫槽](PostgreSQL.Concepts.General.FeatureSupport.LogicalReplication.md#PostgreSQL.Concepts.General.FeatureSupport.LogicalReplicationSlots) 中所述，在多可用區域資料庫叢集的寫入器資料庫執行個體上建立邏輯複寫插槽。此程序要求您指定解碼外掛程式。目前，RDS for PostgreSQL 支援隨附於 PostgreSQL 的 `test_decoding`、`wal2json` 和 `pgoutput` 外掛程式。

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

1. 驗證多可用區域資料庫叢集的所有讀取器資料庫執行個體上的插槽狀態。若要這麼做，請檢查所有讀取器資料庫執行個體上的 `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`。重新啟動叢集，讓參數變更生效。

## 限制與建議
<a name="multi-az-db-clusters-logical-replication-limitations"></a>

將邏輯複寫用於執行 PostgreSQL 第 16 版的多可用區域資料庫叢集時，適用下列限制和建議：
+ 您只能使用寫入器資料庫執行個體來建立或捨棄邏輯複寫插槽。例如，`CREATE SUBSCRIPTION` 命令必須在主機連接字串中使用叢集寫入器端點。
+ 在任何資料表同步或重新同步期間，都必須使用叢集寫入器端點。例如，您可以使用下列命令來重新同步新增的資料表：

  ```
  Postgres=>ALTER SUBSCRIPTION subscription-name CONNECTION host=writer-endpoint
  Postgres=>ALTER SUBSCRIPTION subscription-name REFRESH PUBLICATION
  ```
+ 您必須等待資料表同步完成，才能使用讀取器資料庫執行個體進行邏輯複寫。您可以使用 `[pg\$1subscription\$1rel](https://www.postgresql.org/docs/current/catalog-pg-subscription-rel.html)` 目錄資料表來監控資料表同步。當 `srsubstate` 欄設定為就緒 (`r`) 時，表示資料表同步完成。
+ 建議您在初始資料表同步完成後，使用執行個體端點進行邏輯複寫連線。下列命令會將複寫卸載至其中一個讀取器資料庫執行個體，以減輕寫入器資料庫執行個體的負載：

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

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

  ```
  replication slot slot_name is already active for PID x providing immediate feedback.
  ```
+ 使用 `pglogical` 延伸模組時，您只能使用叢集寫入器端點。延伸模組有其已知限制，可能會在資料表同步期間建立未使用的邏輯複寫插槽。過時的複寫插槽會保留預先寫入日誌 (WAL) 檔案，而可能導致磁碟空間問題。