Instiq
第1章 · 運用管理·v1.0.0·更新 2026/7/8·読了目安 約15分

変更要約: 初版(主題G1・G1.1〜G1.4)

1.4レプリケーション運用

この節の要点

ストリーミングレプリケーションとロジカルレプリケーションの構築・監視を深掘りします。wal_levelmax_wal_senderssynchronous_standby_namessynchronous_commithot_standby_feedbackによるストリーミング構成、ロジカルレプリケーションのCREATE/ALTER/DROP PUBLICATIONSUBSCRIPTION、監視ビューのpg_stat_replicationpg_stat_wal_receiver、送受信プロセスのwalsenderwalreceiver、専用受信ツールのpg_receivewalを押さえます。

Silver でレプリケーションは「基礎知識」の対象でしたが、Gold では実際に構築し、同期方式を選び、遅延やギャップを監視する運用者の視点が求められます。可用性要件(どこまで止まってよいか)とデータ損失許容度(どこまで失ってよいか)のトレードオフを、パラメータ選択として具体的に判断できる深さが問われます。

1.4.1ストリーミングレプリケーションの構築パラメータ

  • wal_level=WALにどこまでの情報を書き込むかを決める設定。レプリケーションには最低でも replica が必要(ロジカルレプリケーションを使うなら logical)。max_wal_senders=同時に接続できるスタンバイ/レプリケーションクライアントの上限数(walsenderプロセスの上限)。
  • synchronous_standby_names=どのスタンバイを同期レプリケーションの対象にするかを名前・優先順位・グループで指定するパラメータ(例:'FIRST 1 (standby1, standby2)')。synchronous_commit=コミット確定までにどの段階の確認を待つかを制御する(on=同期スタンバイのWAL書き込み確認まで待つ・remote_write=スタンバイのOS書き込みまで・off=ローカルのみ)。
  • hot_standby_feedback=スタンバイ側で実行中の長時間クエリの情報をプライマリへフィードバックし、プライマリの VACUUM がそのクエリに必要な古い行バージョンを消してしまう(レプリケーション競合によるクエリキャンセル)のを防ぐ設定。副作用としてプライマリ側の肥大化が進みやすくなるトレードオフがある。

1.4.2ロジカルレプリケーションの操作

  • パブリッシャ側CREATE PUBLICATION(レプリケーション対象のテーブル集合を定義:CREATE PUBLICATION pub1 FOR TABLE orders, customers;FOR ALL TABLES)。ALTER PUBLICATION(対象テーブルの追加/削除)・DROP PUBLICATION(削除)。
  • サブスクライバ側SUBSCRIPTIONCREATE SUBSCRIPTION sub1 CONNECTION '...' PUBLICATION pub1; で接続先とパブリケーションを指定して購読を開始。作成時に初期データコピーも自動実行される)。物理レプリケーションと異なりテーブル単位で選択的に同期でき、双方向・複数ソースからの集約も構成できる。
  • ロジカルレプリケーションは DDL を自動伝播しない(スキーマ変更は手動で両側に適用)・シーケンス値やLARGE OBJECTは対象外、という物理レプリケーションとの違いを押さえる。

1.4.3監視ビューとプロセス

  • pg_stat_replication=プライマリ側で確認するビュー。接続中の各スタンバイについて sent_lsn(送信済みWAL位置)・write_lsnflush_lsnreplay_lsn(適用済み位置)・sync_statesync/potential/async)を1行ずつ表示し、遅延量やどのスタンバイが同期対象かを確認できる。
  • pg_stat_wal_receiver=スタンバイ側で確認するビュー。受信元プライマリの接続情報や受信済みWAL位置(received_lsn)を表示する。プライマリ視点の pg_stat_replication と対をなす。
  • プロセス=walsender(プライマリ側でスタンバイごとにフォークされ WAL を送信するプロセス。max_wal_senders の上限に含まれる)・walreceiver(スタンバイ側で WAL を受信し適用するプロセス)。pg_receivewal=WALをストリーミングで受信してファイルとして保存する専用クライアントツール(アーカイブ用途・スタンバイを構築せずWALだけ集めたい場合に使う)。
試験ポイント

「レプリケーション最低要件=wal_level=replica(ロジカルはlogical)」「コミット確認の深さ=synchronous_commit」「同期対象の指定=synchronous_standby_names」「レプリケーション競合の防止=hot_standby_feedback」 の対応が最頻出です。プライマリ側監視=pg_stat_replication/スタンバイ側監視=pg_stat_wal_receiverという視点の違いも定番の対比です。ロジカルレプリケーションはDDLを自動伝播しない点も繰り返し問われます。

ゼロからストリーミングレプリケーションを構築する流れを追いましょう。まずプライマリの postgresql.confwal_level = replicamax_wal_senders = 10 程度を設定し、pg_hba.conf にスタンバイからの replication 接続を許可する行を追加します。スタンバイの作成は pg_basebackup -h primary_host -D /var/lib/pgsql/data -U replicator -P -R のように行い、-R オプションで standby.signal と接続情報(primary_conninfo)が自動生成されます。可用性要件が高く「1件もデータを失いたくない」場合は、synchronous_standby_names = 'FIRST 1 (standby1)' を設定し、synchronous_commit = on のままにすることで、プライマリのコミットは standby1 がWALを書き込み確認するまで応答を返さない同期レプリケーションにします(代償としてコミットのレイテンシが増える)。逆に性能優先なら synchronous_commit = off や非同期構成を選びます。スタンバイで長時間の集計クエリを流す運用があるなら、プライマリの VACUUM がそのクエリに必要な行を消してクエリがキャンセルされるレプリケーション競合を避けるため hot_standby_feedback = on を設定します。 構築後の監視はプライマリで SELECT application_name, sync_state, replay_lsn FROM pg_stat_replication; を定期実行し、sync_state が期待通り sync になっているか、sent_lsnreplay_lsn の差から遅延が大きくなっていないかを確認します。スタンバイ側では SELECT status, received_lsn FROM pg_stat_wal_receiver; で受信状況を確認します。ロジカルレプリケーションで特定テーブルだけを別システムへ流したい場合は、パブリッシャ側で CREATE PUBLICATION sales_pub FOR TABLE orders; を作成し、サブスクライバ側で CREATE SUBSCRIPTION sales_sub CONNECTION 'host=pub_host dbname=sales user=repl' PUBLICATION sales_pub; を実行すると、作成時点の初期データコピーに続けて継続的な変更が流れ始めます。後で対象テーブルを追加したいときは ALTER PUBLICATION sales_pub ADD TABLE customers; としますが、新しい列を追加するような DDL 変更はロジカルレプリケーションでは自動伝播されないため、パブリッシャ・サブスクライバの両方に個別に適用する運用ルールを徹底します。WALだけを専用にアーカイブしたい場合は pg_receivewal -D /archive/wal -h primary_host のようにストリーミング受信を回しっぱなしにします。

パラメータ/コマンド分類要点
wal_levelWAL情報量replica=物理/logical=ロジカルも可
synchronous_standby_names同期対象の指定名前・優先順位・グループで指定
synchronous_commitコミット確認の深さon/remote_write/off
hot_standby_feedback競合防止プライマリのVACUUMを抑制
pg_stat_replication監視(プライマリ側)sync_state・各lsnを表示
pg_stat_wal_receiver監視(スタンバイ側)received_lsnを表示
注意

ひっかけ: 「ロジカルレプリケーションはDDL変更も自動的にサブスクライバへ伝播する」は誤りです。DDLは自動伝播されず、パブリッシャ・サブスクライバ双方に手動で適用する必要があります。また「pg_stat_wal_receiverはプライマリ側で確認するビューである」も誤り=pg_stat_wal_receiverはスタンバイ側、pg_stat_replicationがプライマリ側という対応が逆です。

wal_level等の構築パラメータ、PUBLICATION/SUBSCRIPTIONのロジカルレプリケーション、pg_stat_replication監視、walsender/walreceiverの流れを示す図。
walsender が WAL を送り、walreceiver が受け取って適用する

1.4.4この節のまとめ

  • ストリーミング構築=wal_level=replica(ロジカルはlogical)・max_wal_senders・synchronous_standby_names・synchronous_commit・hot_standby_feedbackの組み合わせで可用性/性能/データ損失許容度を調整
  • ロジカルはパブリッシャ側CREATE/ALTER/DROP PUBLICATION・サブスクライバ側SUBSCRIPTIONDDLは自動伝播しない
  • 監視はプライマリ側pg_stat_replication/スタンバイ側pg_stat_wal_receiver。プロセスはwalsender/walreceiver、WAL専用収集はpg_receivewal

進捗の記録にはログインが必要です。

理解度チェック

(軽い確認用)

Q1. 可用性要件が非常に厳しく、コミットされたデータを1件も失いたくない。この要件を満たすために設定すべき組み合わせはどれ?

Q2. スタンバイ側で長時間実行される分析クエリが、プライマリのVACUUMによって必要な行が削除されクエリキャンセルされる現象(レプリケーション競合)が頻発している。緩和のために有効化すべき設定はどれ?

Q3. ロジカルレプリケーションでパブリッシャ側のテーブルに新しい列を追加した。サブスクライバ側にこの変更を反映する適切な方法はどれ?

理解度を確認第1章「運用管理」の問題を解く