Skip to main content
© 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アンカンファレンス@オンライン 発表資料)