論理レプリケーションは、パブリッシャー側のデータベース上のデータのスナップショットをコピーすることから始まります。 それが完了したあとは、パブリッシャーにおける変更は、発生した時にリアルタイムでサブスクライバーに送られます。 サブスクライバーはパブリッシャーでコミットが発生した順にデータを適用します。 そのため、どの単一のサブスクリプションにおいても、パブリケーションに対するトランザクションの一貫性が保証されます。
論理レプリケーションは物理ストリーミングレプリケーション(27.2.5参照)と似たアーキテクチャで構成されています。 「WAL送信」プロセスと「適用」プロセスで実装されています。 walsenderプロセスはWALのロジカルデコーディング(第49章に記載)を開始し、標準のロジカルデコーディングプラグイン(pgoutput)をロードします。 このプラグインは、WALから読み込んだ更新を論理レプリケーションプロトコル(53.5参照)に変換します。 そして、パブリケーションの指定にしたがってフィルターします。 データは次に、ストリーミングレプリケーションプロトコルを使って継続的に適用ワーカーに転送されます。 適用ワーカーは、データをローカルテーブルにマップし、更新を受信すると正しいトランザクション順に個々の更新を適用します。
サブスクライバーデータベースの適用プロセスは、常にsession_replication_role
をreplica
にセットして実行されます。
これによりトリガーと制約で通常の効果を生成します。
今のところ、論理レプリケーション適用プロセスは行トリガーだけを起動し、文トリガーは起動しません。
ただし、初期テーブル同期はCOPY
コマンドのように実装されているので、INSERT
の行と文トリガーの両方を起動します。
既存のサブスクライブされたテーブル中の初期データのスナップショットが取得され、特殊な適用プロセスの並列インスタンスにコピーされます。 このプロセスは自身のレプリケーションスロットを作成し、既存のデータをコピーします。 コピーが終わるとすぐにテーブル内容が他のバックエンドから見えるようになります。 既存のデータのコピーが終わると、ワーカーは同期モードに入ります。 このモードでは、初期データのコピー中に起こった更新を標準の論理レプリケーションを使ってストリーミングすることにより、テーブルが主適用プロセスと同期状態になることを保証します。 この同期フェーズの間、パブリッシャで発生したのと同じ順序で変更が適用され、コミットされます。 ひとたび同期が完了すれば、テーブルのレプリケーションの制御は主適用プロセスに戻され、レプリケーションは通常通り継続されます。