

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 論理レプリケーション
<a name="logical-replication-considerations"></a>

論理レプリケーションは、オブジェクトのレプリケーション ID とその変更に基づいて、データオブジェクトとその変更をレプリケートする方法です。論理レプリケーションは、1 つ以上のサブスクライバーがパブリッシャーノード上の 1 つ以上のパブリケーションにサブスクライブする*パブリッシュ*および*サブスクライブ*モデルを使用します。サブスクライバーは、サブスクライブしているパブリケーションからデータを取得します。

論理レプリケーションを使用すると、データレプリケーションとセキュリティの両方をきめ細かく制御できます。論理レプリケーションは、次のユースケースで使用できます。
+ PostgreSQL のさまざまなメジャーバージョン間のレプリケーション
+ 異なるプラットフォーム上の PostgreSQL インスタンス間のレプリケーション (Linux から Windows など)

## アーキテクチャ
<a name="architecture-logical-replication"></a>

以下のワークフローステップは、論理レプリケーションアーキテクチャの仕組みを示しています。

1. パブリッシャーデータベース上のデータのスナップショットを作成し、そのデータをサブスクライバーデータベースにコピーします。

1. パブリッシャーデータベースの変更は、リアルタイムでサブスクライバーに送信されます。

1. サブスクライバーはパブリッシャーと同じ順序でデータを適用するため、単独のサブスクリプション内のパブリケーションに対するトランザクションの一貫性が保証されます。

*パブリケーション*は、プライマリインスタンス (パブリッシャー) で定義できます。パブリケーションは、1 つのテーブルまたはテーブルのグループから生成される変更のセットです。INSERT、UPDATE、DELETE、TRUNCATE オペレーションの組み合わせから変更を選択できます。デフォルトでは、これらの変更はすべてサブスクライバーデータベースにレプリケートされます。これは、正確なブロックアドレスがバイト単位のレプリケーションに使用される物理レプリケーションとは対照的です。

パブリッシュされたテーブルでは、UPDATE オペレーションと DELETE オペレーションをレプリケートするように [REPLICA IDENTITY](https://www.postgresql.org/docs/current/sql-altertable.html#SQL-ALTERTABLE-REPLICA-IDENTITY) を設定して、更新または削除する適切な行をサブスクライバー側で識別できるようにする必要があります。ほとんどの場合、レプリカ ID はプライマリキーまたは一意のキーのいずれかによって決定されます。プライマリキーがなく、作成できない場合は、レプリカ ID を `full` に設定できます。つまり、行全体がキーになります。この設定は非効率であるため、レプリカ ID を `full` に設定するのは最後の手段とすることをお勧めします。

*サブスクリプション*は、論理レプリケーションのダウンストリーム側です。サブスクリプションが定義されているノードは、*サブスクライバー*と呼ばれます。サブスクリプションは、別のデータベースへの接続と、サブスクライブする 1 つ以上のパブリケーションのセットを定義します。

## 構成設定
<a name="config-settings"></a>

パブリッシャー設定には、次の設定が必要です。
+ `wal_level` を `logical` に設定します。
+ `max_replication_slots` を、少なくとも接続を想定するサブスクリプションの数と、テーブル同期用のいくつかの予約スロットに対応するように設定します。
+ `max_replication_slots` と物理レプリカの数に対応するように `max_wal_senders` を設定します。

サブスクライバー設定には、次の設定が必要です。
+ サブスクライバーに追加する予定のサブスクリプションの最小数と、テーブル同期のいくつかの予約サブスクリプションの数に対応するように `max_replication_slots` を設定します。
+ `max_logical_replication_workers` を、少なくともサブスクリプションの数と、テーブル同期のいくつかの予約ワーカー数に対応するように設定します。
+ `max_worker_processes` を (`max_logical_replication_workers` \+ `1`) 以上に設定します。

各サブスクリプションは、1 つのレプリケーションスロットを通じて変更を受け取ります。

次の手順は、論理レプリケーションを実行する方法を示しています。

1. ソースデータベース内のテーブルのテーブルのグループ (レプリケーションの一部になる) に [CREATE PUBLICATION](https://www.postgresql.org/docs/10/sql-createpublication.html) コマンドを使用してパブリッシャーを作成します。

1. [CREATE SUBSCRIPTION](https://www.postgresql.org/docs/10/sql-createsubscription.html) コマンドを使用してサブスクライバーを作成し、その後サブスクライバーの作成時にパブリケーションの詳細を指定します。

1. 最初のデータロードは、ソースデータベースからターゲットデータベースに自動的に開始されます。

1. レプリケーションスロットによってキャプチャされた変更データは、ターゲットデータベースにレプリケートされます。

1. [pg\_stat\_replication](https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-REPLICATION-VIEW) (カタログテーブル) を使用して、レプリケーションのステータスを確認します。[pg\_stat\_replication\_slots](https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-REPLICATION-SLOTS-VIEW) を使用してレプリケーションスロットを確認します。

詳細については、AWS データベースブログの記事「[Using logical replication to replicate managed Amazon RDS for PostgreSQL and Amazon Aurora to self-managed PostgreSQL](https://aws.amazon.com/blogs/database/using-logical-replication-to-replicate-managed-amazon-rds-for-postgresql-and-amazon-aurora-to-self-managed-postgresql/)」を参照してください。

## 制限
<a name="limitations-logical-replication"></a>

移行を開始する前に、論理レプリケーション方法に関する次の制限事項を考慮することをお勧めします。
+ 論理レプリケーションには、現在、制限事項と機能ギャップが非常に多くあります。
+ 論理レプリケーションでは、データ定義言語 (DDL)、シーケンス、大規模なオブジェクト操作をレプリケートできません。切り捨てアクション (外部キーを持つテーブルに適用される) には、同じサブスクリプション内の関連テーブルを含める必要があります。

論理レプリケーションの制限事項の詳細については、PostgreSQL ドキュメントの「[31.6. Restrictions](https://www.postgresql.org/docs/current/logical-replication-restrictions.html)」を参照してください。