© 2025 NTT DATA Group Corporation © 2025 NTT DATA Group Corporation 第52回 PostgreSQLアンカンファレンス 論理レプリケーション アーキテクチャ 2025年3月27日 株式会社NTTデータグループ 松永 創
© 2025 NTT DATA Group Corporation 2 はじめに 本資料では、論理レプリケーションの以下について、整理しています。 • 論理レプリケーションの概要 • 論理レプリケーションの仕組み 尚、本資料は、鳥越 淳さん が PostgreSQL Conference Japan 2022 にて講演された 『 【B1】 速習!論理レプリケーション ~基礎から最新動向まで~』 の資料※を、許可を頂いて加筆・修正したものです。 資料の利用をご快諾いただき、この場を借りてお礼申し上げます。 ※ 速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料) | PPT https://www.slideshare.net/slideshow/postgresql-logical-replication-postgresql-conference-japan-2022-nttdata/254219341
© 2025 NTT DATA Group Corporation 3 論理レプリケーションの概要
© 2025 NTT DATA Group Corporation 4 論理レプリケーションの前に.. 物理レプリケーションの復習 • 概要: 全DBのレプリケーション • 仕組み: WAL転送・リカバリDB • クラスタの一部レプリケーションは不可 例.×特定のテーブルのみレプリケーション • PostgreSQLのメジャーバージョンは同じである必要 • 下流側は参照のみ可能 • ユースケース: HA, 参照分散 上流 DB1 DB2 下流 上流のWAL を転送 レプリケーション対象 DB2 〇参照, ×更新 DB1
© 2025 NTT DATA Group Corporation 5 論理レプリケーション • 概要: DB単位以下の粒度でレプリケーションの対象を指定できるレプリケーション • 仕組み: WALをデコードして送信 • 対象や操作を絞ったレプリケーションが可能 例. テーブルAのINSERTだけレプリケーション • 異なるメジャーバージョン間でのレプリケーションも可能 • 下流側でも更新が可能 上流 DB1 DB2 table2 下流 DB2 table1 2.下流側へ送信 table1 table3 table2 1.WALを デコード レプリケーション対象 〇参照, 〇更新
© 2025 NTT DATA Group Corporation 6 柔軟なレプリケーション対象の指定 • 行フィルタ • PUBLICATION定義にWHERE句を指定し、レプリケーション対象行を選択可能 (pub)=# CREATE PUBLICATION pub1 FOR TABLE t1 WHERE (i > 3); • UPDATE、DELETEをレプリケーションする場合、WHERE句はREPLICA IDENTITYに含まれるカラムのみ指定可 • INSERTの場合、この制約はない (pub)=# CREATE PUBLICATION pub1 FOR TABLE t1 WHERE (i > 3 AND t = 'aaa’); (pub)=# INSERT INTO t1 VALUES (13, 'insert’), (15, ‘aaa’); INSERT 0 2 (pub)=# UPDATE t1 SET i = 6 WHERE i = 5; ERROR: cannot update table "t1" DETAIL: Column used in the publication WHERE expression is not part of the replica identity. • WHERE句内では単純な式のみ利用可。ユーザ定義関数などは利用不可 v.15
© 2025 NTT DATA Group Corporation 7 論理レプリケーションのしくみ
© 2025 NTT DATA Group Corporation 8 アーキテクチャの概要 • 上流 • walsender: WALの読み取り・デコード、データを送信※ • 下流 • apply worker: データを受信、適用※ 上流 walsender WAL 1. WAL読込 下流 apply worker※ 2. デコード 3. データ送信 4. データ受信 5. データ適用 ※ walsender・apply worker は、SUBSCRIPTION 単位に生成される ※ streaming=parallel の場合、 apply worker の後ろで parallel apply worker が動作する
© 2025 NTT DATA Group Corporation 9 初期同期 • レプリケーション開始時に上流側にあったデータをCOPYする • 初期同期用のwalsender, table synchronization worker が起動 • SUBSCRIPTION1つあたり同時に実行できるワーカー数:max_sync_workers_per_subscription 上流 walsender WAL 下流 apply worker※ 初期データを COPY walsender logical replication worker sync table synchronization worker walsender max_sync_workers_per_subscription max_logical_replication_workers TBL TBL ※ streaming=parallel の場合、 apply worker の後ろで parallel apply worker が動作する
© 2025 NTT DATA Group Corporation 10 初期同期後のレプリケーション • 上流側でWALを読み込み、デコードした内容をトランザクション単位で変更を管理 上流 walsender WAL 1. WAL読込 下流 apply worker begin_cb change_cb … commit_cb outputプラグイン。論理レプリケーションでは pgoutput ReorderBuffer INSERT.. DELETE.. INSERT.. UPDATE.. INSERT..
© 2025 NTT DATA Group Corporation 11 初期同期後のレプリケーション • 上流側でWALを読み込み、デコードした内容をトランザクション単位で変更を管理 上流 walsender WAL 下流 apply worker begin_cb change_cb … commit_cb outputプラグイン。論理レプリケーションでは pgoutput ReorderBuffer INSERT.. UPDATE.. DELETE.. INSERT.. UPDATE.. INSERT.. 2. デコードし、トランザ クション単位で管理
© 2025 NTT DATA Group Corporation 12 初期同期後のレプリケーション • COMMITをデコードすると、下流側に送信 上流 walsender WAL 下流 apply worker begin_cb change_cb … commit_cb 3. COMMITされると、各 種コールバック関数が実 行され、下流への送信 outputプラグイン。論理レプリケーションでは pgoutput ReorderBuffer INSERT.. UPDATE.. COMMIT DELETE.. INSERT.. UPDATE.. INSERT.. 行フィルタやカラムリスト、パーティ ション、オリジンフィルタの判定は pgoutput側で実施
© 2025 NTT DATA Group Corporation 13 変更量の大きいトランザクションの扱い(SUBSCRIPTIONのオプションstreaming=offの場合) • 1レプリケーションが使用するメモリ量がlogical_decoding_work_memを超過した場合、 ファイルに変更を出力し、メモリ逼迫を予防 • 書き出すのは、最もメモリ使用量が大きいトランザクション 上流 walsender WAL 下流 apply worker outputプラグイン。論理レプリケーションでは pgoutput ReorderBuffer INSERT.. UPDATE.. DELETE.. INSERT.. .spill 2. PGDATA/pg_replslot 以下に出力 begin_cb change_cb … commit_cb DELETE.. INSERT.. DELETE.. INSERT.. 1.メモリ使用量が増加し、 Logical_decoding_work_mem を超過
© 2025 NTT DATA Group Corporation 14 変更量の大きいトランザクションの扱い(SUBSCRIPTIONのオプションstreaming=onの場合) • 1レプリケーションが使用するメモリ量がlogical_decoding_work_memを超過した場合、下流側に送信 • streaming = offの場合に比べ、変更量の大きいトランザクションの下流側への反映が遅延しにくい • ただし、ABORTされた場合は下流側へ送信されたデータは利用されない 上流 walsender WAL 下流 apply worker outputプラグイン。論理レプリケーションでは pgoutput ReorderBuffer INSERT.. UPDATE.. DELETE.. INSERT.. Stream用のコールバック 関数が呼び出され、下 流側へ送信 DELETE.. INSERT.. DELETE.. INSERT.. stream_start_cb stream_stop_cb … stream_commit_cb 受信した変更内容は、 base/pgsql_tmp以下に出力 .cha nges
© 2025 NTT DATA Group Corporation 15 変更量の大きいトランザクションの扱い(SUBSCRIPTIONのオプションstreaming=parallel) • 1レプリケーションが使用するメモリ量がlogical_decoding_work_memを超過した場合、 下流側に送信し、並列適用 • streaming=on に比べて、変更量の大きいトランザクションの下流側への反映がより遅延しにくい 上流 walsender WAL 下流 apply worker outputプラグイン。論理レプリケーションでは pgoutput ReorderBuffer INSERT.. UPDATE.. DELETE.. INSERT.. DELETE.. INSERT.. DELETE.. INSERT.. stream_start_cb stream_stop_cb … stream_commit_cb v.16 worker pool parallel apply workers parallel apply workers parallel apply worker ※ 割当て可能な parallel apply worker がない場合、変更は下流側で一時ファイルに書き込まれ、コミットされた後に適用 トランザクションの最初のストリーム を受信すると、parallel apply worker を(可能なら)割り当てる※ 受信データを 即時適用
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)

論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)

  • 1.
    © 2025 NTTDATA Group Corporation © 2025 NTT DATA Group Corporation 第52回 PostgreSQLアンカンファレンス 論理レプリケーション アーキテクチャ 2025年3月27日 株式会社NTTデータグループ 松永 創
  • 2.
    © 2025 NTTDATA Group Corporation 2 はじめに 本資料では、論理レプリケーションの以下について、整理しています。 • 論理レプリケーションの概要 • 論理レプリケーションの仕組み 尚、本資料は、鳥越 淳さん が PostgreSQL Conference Japan 2022 にて講演された 『 【B1】 速習!論理レプリケーション ~基礎から最新動向まで~』 の資料※を、許可を頂いて加筆・修正したものです。 資料の利用をご快諾いただき、この場を借りてお礼申し上げます。 ※ 速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料) | PPT https://www.slideshare.net/slideshow/postgresql-logical-replication-postgresql-conference-japan-2022-nttdata/254219341
  • 3.
    © 2025 NTTDATA Group Corporation 3 論理レプリケーションの概要
  • 4.
    © 2025 NTTDATA Group Corporation 4 論理レプリケーションの前に.. 物理レプリケーションの復習 • 概要: 全DBのレプリケーション • 仕組み: WAL転送・リカバリDB • クラスタの一部レプリケーションは不可 例.×特定のテーブルのみレプリケーション • PostgreSQLのメジャーバージョンは同じである必要 • 下流側は参照のみ可能 • ユースケース: HA, 参照分散 上流 DB1 DB2 下流 上流のWAL を転送 レプリケーション対象 DB2 〇参照, ×更新 DB1
  • 5.
    © 2025 NTTDATA Group Corporation 5 論理レプリケーション • 概要: DB単位以下の粒度でレプリケーションの対象を指定できるレプリケーション • 仕組み: WALをデコードして送信 • 対象や操作を絞ったレプリケーションが可能 例. テーブルAのINSERTだけレプリケーション • 異なるメジャーバージョン間でのレプリケーションも可能 • 下流側でも更新が可能 上流 DB1 DB2 table2 下流 DB2 table1 2.下流側へ送信 table1 table3 table2 1.WALを デコード レプリケーション対象 〇参照, 〇更新
  • 6.
    © 2025 NTTDATA Group Corporation 6 柔軟なレプリケーション対象の指定 • 行フィルタ • PUBLICATION定義にWHERE句を指定し、レプリケーション対象行を選択可能 (pub)=# CREATE PUBLICATION pub1 FOR TABLE t1 WHERE (i > 3); • UPDATE、DELETEをレプリケーションする場合、WHERE句はREPLICA IDENTITYに含まれるカラムのみ指定可 • INSERTの場合、この制約はない (pub)=# CREATE PUBLICATION pub1 FOR TABLE t1 WHERE (i > 3 AND t = 'aaa’); (pub)=# INSERT INTO t1 VALUES (13, 'insert’), (15, ‘aaa’); INSERT 0 2 (pub)=# UPDATE t1 SET i = 6 WHERE i = 5; ERROR: cannot update table "t1" DETAIL: Column used in the publication WHERE expression is not part of the replica identity. • WHERE句内では単純な式のみ利用可。ユーザ定義関数などは利用不可 v.15
  • 7.
    © 2025 NTTDATA Group Corporation 7 論理レプリケーションのしくみ
  • 8.
    © 2025 NTTDATA Group Corporation 8 アーキテクチャの概要 • 上流 • walsender: WALの読み取り・デコード、データを送信※ • 下流 • apply worker: データを受信、適用※ 上流 walsender WAL 1. WAL読込 下流 apply worker※ 2. デコード 3. データ送信 4. データ受信 5. データ適用 ※ walsender・apply worker は、SUBSCRIPTION 単位に生成される ※ streaming=parallel の場合、 apply worker の後ろで parallel apply worker が動作する
  • 9.
    © 2025 NTTDATA Group Corporation 9 初期同期 • レプリケーション開始時に上流側にあったデータをCOPYする • 初期同期用のwalsender, table synchronization worker が起動 • SUBSCRIPTION1つあたり同時に実行できるワーカー数:max_sync_workers_per_subscription 上流 walsender WAL 下流 apply worker※ 初期データを COPY walsender logical replication worker sync table synchronization worker walsender max_sync_workers_per_subscription max_logical_replication_workers TBL TBL ※ streaming=parallel の場合、 apply worker の後ろで parallel apply worker が動作する
  • 10.
    © 2025 NTTDATA Group Corporation 10 初期同期後のレプリケーション • 上流側でWALを読み込み、デコードした内容をトランザクション単位で変更を管理 上流 walsender WAL 1. WAL読込 下流 apply worker begin_cb change_cb … commit_cb outputプラグイン。論理レプリケーションでは pgoutput ReorderBuffer INSERT.. DELETE.. INSERT.. UPDATE.. INSERT..
  • 11.
    © 2025 NTTDATA Group Corporation 11 初期同期後のレプリケーション • 上流側でWALを読み込み、デコードした内容をトランザクション単位で変更を管理 上流 walsender WAL 下流 apply worker begin_cb change_cb … commit_cb outputプラグイン。論理レプリケーションでは pgoutput ReorderBuffer INSERT.. UPDATE.. DELETE.. INSERT.. UPDATE.. INSERT.. 2. デコードし、トランザ クション単位で管理
  • 12.
    © 2025 NTTDATA Group Corporation 12 初期同期後のレプリケーション • COMMITをデコードすると、下流側に送信 上流 walsender WAL 下流 apply worker begin_cb change_cb … commit_cb 3. COMMITされると、各 種コールバック関数が実 行され、下流への送信 outputプラグイン。論理レプリケーションでは pgoutput ReorderBuffer INSERT.. UPDATE.. COMMIT DELETE.. INSERT.. UPDATE.. INSERT.. 行フィルタやカラムリスト、パーティ ション、オリジンフィルタの判定は pgoutput側で実施
  • 13.
    © 2025 NTTDATA Group Corporation 13 変更量の大きいトランザクションの扱い(SUBSCRIPTIONのオプションstreaming=offの場合) • 1レプリケーションが使用するメモリ量がlogical_decoding_work_memを超過した場合、 ファイルに変更を出力し、メモリ逼迫を予防 • 書き出すのは、最もメモリ使用量が大きいトランザクション 上流 walsender WAL 下流 apply worker outputプラグイン。論理レプリケーションでは pgoutput ReorderBuffer INSERT.. UPDATE.. DELETE.. INSERT.. .spill 2. PGDATA/pg_replslot 以下に出力 begin_cb change_cb … commit_cb DELETE.. INSERT.. DELETE.. INSERT.. 1.メモリ使用量が増加し、 Logical_decoding_work_mem を超過
  • 14.
    © 2025 NTTDATA Group Corporation 14 変更量の大きいトランザクションの扱い(SUBSCRIPTIONのオプションstreaming=onの場合) • 1レプリケーションが使用するメモリ量がlogical_decoding_work_memを超過した場合、下流側に送信 • streaming = offの場合に比べ、変更量の大きいトランザクションの下流側への反映が遅延しにくい • ただし、ABORTされた場合は下流側へ送信されたデータは利用されない 上流 walsender WAL 下流 apply worker outputプラグイン。論理レプリケーションでは pgoutput ReorderBuffer INSERT.. UPDATE.. DELETE.. INSERT.. Stream用のコールバック 関数が呼び出され、下 流側へ送信 DELETE.. INSERT.. DELETE.. INSERT.. stream_start_cb stream_stop_cb … stream_commit_cb 受信した変更内容は、 base/pgsql_tmp以下に出力 .cha nges
  • 15.
    © 2025 NTTDATA Group Corporation 15 変更量の大きいトランザクションの扱い(SUBSCRIPTIONのオプションstreaming=parallel) • 1レプリケーションが使用するメモリ量がlogical_decoding_work_memを超過した場合、 下流側に送信し、並列適用 • streaming=on に比べて、変更量の大きいトランザクションの下流側への反映がより遅延しにくい 上流 walsender WAL 下流 apply worker outputプラグイン。論理レプリケーションでは pgoutput ReorderBuffer INSERT.. UPDATE.. DELETE.. INSERT.. DELETE.. INSERT.. DELETE.. INSERT.. stream_start_cb stream_stop_cb … stream_commit_cb v.16 worker pool parallel apply workers parallel apply workers parallel apply worker ※ 割当て可能な parallel apply worker がない場合、変更は下流側で一時ファイルに書き込まれ、コミットされた後に適用 トランザクションの最初のストリーム を受信すると、parallel apply worker を(可能なら)割り当てる※ 受信データを 即時適用