

# Amazon RDS のマルチ AZ DB クラスターを使用した PostgreSQL 論理レプリケーションの設定
<a name="USER_MultiAZDBCluster_LogicalRepl"></a>

マルチ AZ DB クラスターとの PostgreSQL 論理レプリケーションを使用することで、データベースインスタンス全体ではなく、個々のテーブルをレプリケートおよび同期できます。論理レプリケーションでは、パブリケーションおよびサブスクリプションモデルを使用して、ソースからの変更を 1 人または複数の受信者にレプリケートします。これは、PostgreSQL のログ先行書き込み (WAL) の変更レコードを使用することで動作します。詳細については、「[Amazon RDS for PostgreSQL の論理レプリケーションの実行](PostgreSQL.Concepts.General.FeatureSupport.LogicalReplication.md)」を参照してください。

マルチ AZ DB クラスターのライター DB インスタンスに新しい論理レプリケーションスロットを作成すると、そのスロットはクラスター内の各リーダー DB インスタンスに非同期でコピーされます。リーダー DB インスタンスのスロットは、ライター DB インスタンスのスロットと継続的に同期されます。

論理レプリケーションは、RDS for PostgreSQL バージョン 14.8-R2 以降および 15.3-R2 以降を実行しているマルチ AZ DB クラスターでサポートされています。

**注記**  
ネイティブの PostgreSQL 論理レプリケーション機能に加えて、RDS for PostgreSQL を実行しているマルチ AZ DB クラスターは `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>

マルチ AZ DB クラスターの PostgreSQL 論理レプリケーションを設定するには、次の前提条件を満たす必要があります。
+ ユーザーアカウントは `rds_superuser` グループのメンバーであり、`rds_superuser` 権限を持っている必要があります。詳細については、「[PostgreSQL のロールとアクセス権限について](Appendix.PostgreSQL.CommonDBATasks.Roles.md)」を参照してください。
+ 次の手順で説明するパラメータ値を設定できるように、マルチ AZ DB クラスターをカスタム DB クラスターパラメータグループに関連付ける必要があります。詳細については、「[マルチ AZ DB クラスターの DB クラスターパラメータグループを使用する](USER_WorkingWithDBClusterParamGroups.md)」を参照してください。

## 論理レプリケーションの設定
<a name="multi-az-db-clusters-logical-replication"></a>

マルチ AZ DB クラスターの論理レプリケーションを設定するには、関連する DB クラスターパラメータグループ内の特定のパラメータを有効にしてから、論理レプリケーションスロットを作成します。

**注記**  
PostgreSQL バージョン 16 から、マルチ AZ DB クラスターのリーダー DB インスタンスを論理レプリケーションに使用できます。

**RDS for PostgreSQL マルチ AZ DB クラスターの論理レプリケーションをセットアップするには**

1. RDS for PostgreSQL マルチ AZ DB クラスターに関連付けられているカスタム DB クラスターパラメータグループを開きます。

1. **[パラメータ]** 検索フィールドで、`rds.logical_replication` 静的パラメータを探し、その値を `1` に設定します。このパラメータの変更により、WAL の生成量が増える可能性があるため、論理スロットを使用している場合にのみ有効にしてください。

1. この変更の一環として、次の DB クラスターパラメータを設定します。
   + `max_wal_senders`
   + `max_replication_slots`
   + `max_connections`

   予想される使用状況に応じて、次のパラメータの値を変更しなければならない場合があります。ただし、多くの場合はデフォルト値で十分です。
   + `max_logical_replication_workers`
   + `max_sync_workers_per_subscription`

1. マルチ AZ DB クラスターを再起動して、パラメータ値を有効にします。手順については、「[Amazon RDS のマルチ AZ DB クラスターとリーダー DB インスタンスの再起動](multi-az-db-clusters-concepts-rebooting.md)」を参照してください。

1. [論理的なレプリケーションスロットの使用](PostgreSQL.Concepts.General.FeatureSupport.LogicalReplication.md#PostgreSQL.Concepts.General.FeatureSupport.LogicalReplicationSlots) で説明されているように、マルチ AZ DB クラスターのライター DB インスタンスに論理レプリケーションスロットを作成します。このプロセスでは、デコードプラグインを指定する必要があります。現在、RDS for PostgreSQL は、PostgreSQL に付属する `test_decoding`、`wal2json`、および `pgoutput` プラグインをサポートしています。

   スロットは、クラスター内の各リーダー DB インスタンスに非同期でコピーされます。

1. マルチ AZ DB クラスターのすべてのリーダー DB インスタンスのスロットの状態を確認します。そのためには、すべてのリーダー DB インスタンスの `pg_replication_slots` ビューを調べて、アプリケーションが論理的な変更を積極的に行っている間に `confirmed_flush_lsn` 状態が進行していることを確認します。

   以下のコマンドは、リーダー DB インスタンスのレプリケーション状態を調べる方法を示しています。

   ```
   % 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)
   ```

レプリケーションタスクが完了したら、レプリケーションプロセスを停止し、レプリケーションスロットを削除して、論理レプリケーションをオフにします。論理レプリケーションをオフにするには、DB クラスターのパラメータグループを変更し、`rds.logical_replication` の値を `0` に戻します。クラスターを再起動して、パラメータの変更を有効にします。

## 制限と推奨事項
<a name="multi-az-db-clusters-logical-replication-limitations"></a>

PostgreSQL 16 を実行するマルチ AZ DB クラスターでの論理レプリケーションの使用には、以下の制限事項と推奨事項があります。
+ 論理レプリケーションスロットを作成または削除するには、ライター DB インスタンのみを使用できます。例えば、`CREATE SUBSCRIPTION` コマンドでは、ホスト接続文字列にクラスターライターエンドポイントを使用する必要があります。
+ テーブルの同期または再同期中にクラスターライターエンドポイントを使用する必要があります。例えば、以下のコマンドを使用して、新しく追加されたテーブルを再同期できます。

  ```
  Postgres=>ALTER SUBSCRIPTION subscription-name CONNECTION host=writer-endpoint
  Postgres=>ALTER SUBSCRIPTION subscription-name REFRESH PUBLICATION
  ```
+ 論理レプリケーションにリーダー DB インスタンスを使用する前に、テーブルの同期が完了するのを待つ必要があります。テーブルの同期は、`[pg\$1subscription\$1rel](https://www.postgresql.org/docs/current/catalog-pg-subscription-rel.html)` カタログテーブルを使用して監視できます。テーブルの同期が完了すると、`srsubstate` 列が ready (`r`) に設定されます。
+ 最初のテーブル同期が完了したら、論理レプリケーション接続にインスタンスエンドポイントを使用することをお勧めします。次のコマンドは、いずれかのリーダー DB インスタンスにレプリケーションをオフロードすることで、ライター DB インスタンスの負荷を軽減します。

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

  一度に複数の DB インスタンスで同じスロットを使用することはできません。2 つ以上のアプリケーションがクラスターの異なる DB インスタンスから論理的な変更をレプリケートしている場合、クラスターのフェイルオーバーやネットワークの問題により、一部の変更が失われる可能性があります。このような状況では、ホスト接続文字列で論理レプリケーションのインスタンスエンドポイントを使用できます。同じ設定を使用している他のアプリケーションには、次のエラーメッセージが表示されます。

  ```
  replication slot slot_name is already active for PID x providing immediate feedback.
  ```
+ `pglogical` 拡張機能を使用している間は、クラスターライターエンドポイントのみを使用できます。拡張機能には、テーブルの同期中に未使用の論理レプリケーションスロットが作成される可能性がある既知の制限があります。古いレプリケーションスロットによって WAL ファイルが予約され、ディスク容量の問題を引き起こす可能性があります。