【PostgreSQL】2025年最新版 ストリーミングレプリケーション構築手順(Windows対応)

はじめに

本ブログでは、初心者〜中級者向けにPostgreSQLのレプリケーション構築手順を紹介します。レプリケーションは大きく分けると、

  • データベースクラスタを一括して複製する「ストリーミングレプリケーション(物理レプリケーション)」
  • テーブル単位やデータベース単位に複製する「ロジカルレプリケーション(論理レプリケーション)」

があります。ここでは「ストリーミングレプリケーション」の構築を中心に紹介します。

PostgreSQLレプリケーションとは? なぜ必要?

レプリケーションとは、1つのデータベース(プライマリ)から別のデータベース(スタンバイ)へリアルタイムでデータを複製する仕組みです。

複製を作成するメリットは、

  • 障害時の迅速な復旧(フェイルオーバー)
    プライマリが故障した場合、複製のスタンバイを使用する
  • 読み取り負荷の分散(参照系クエリの負荷分散)
    ユーザーからの多くのクエリ(参照系)スタンバイに分散させる事で、全体として処理能力を高める
  • 災害対策(DR)
    スタンバイを遠くの地域に置く事で、災害からのデータ損失のリスクを減少させる

等です。

レプリケーションのフェイルオーバーと負荷分散の画像

レプリケーションのアーキテクチャ

ストリーミングでもロジカルでも、基本的な仕組みは「WAL」を使用している事です。

「WAL」(Write Ahead Log)とは、データベースへの変更内容が全て記録されているログの事で、この「WAL」を別のPostgreSQLに転送・リカバリして複製を作成し、レプリケーションを実現しています。

レプリケーションのアーキテクチャ図
  • ①クエリにより「WAL」が生成され、テーブルが更新される。
  • ②スタンバイに転送されてきた「WAL」をそのまま「WAL」ファイルに書き込み、「WAL」の内容で、テーブルを更新する。

※プライマリから送られてきた「WAL」をそのまま適用する為、以下の条件が必要となります。

  • PostgreSQLのメジャーバージョンが同じであること
    • マスタとスタンバイは同じWALフォーマット・バージョンである必要あり
  • ハードウェアやOSのアーキテクチャが同じである事

ストリーミングレプリケーションの特徴

ストリーミングレプリケーションは、WAL(Write-Ahead Logging)ファイルをリアルタイムでスタンバイサーバに転送することで、プライマリとスタンバイ間のデータ同期を実現します。

  • 特徴
    • プライマリで生成されたWALファイルを、TCP接続を通じてスタンバイに送信
    • ファイルコピーではなく、ストリーム転送なので即時性が高い
    • スタンバイ側はSELECTのみ可能(書き込み不可)

使用環境

  • Windows 11 Pro 24H2
  • PostgreSQL 17.6
  • プライマリサーバのIP :192.168.0.80
  • スタンバイサーバーのIP:192.168.0.60

ストリーミングレプリケーションの設定

プライマリサーバの設定

postgresql.confの設定

postgresql.confはメイン設定ファイルであり、データベースの動作に関するさまざまなパラメータを定義する重要な役割を担っています

先ずは、postgresql.confをプライマリサーバ用に設定します。

  • 基本接続
listen_addresses = '*'       #外部からの全ての接続を許可
port = 5432             #デフォルトの待ち受けポート
  • WAL(Write-Ahead Logging)関連設定
wal_level = replica        #レプリケーション用にreplicaを指定
                  #ロジカルなら logical を指定
max_wal_senders = 5        #スタンバイ接続数の上限(必要に応じて設定)
wal_keep_size = '256MB'      #WALファイルの保持サイズ。遅延対策に有効。
  • 同期レプリケーション設定
synchronous_commit = on                        #同期レプリケーションを明示的に指定
                        #標準は、on
synchronous_standby_names = 'standby01'    #同期レプリケーションを使用する場合の
                        #スタンバイ側の名称を指定
  • ログ出力設定(トラブルシューティング)
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_connections = on
log_disconnections = on
  • メモリ・パフォーマンス関連(環境に応じて調整)
shared_buffers = '512MB'    #PostgreSQLが使用するメモリ領域。物理メモリの
                                #25〜40%が目安。
effective_cache_size = '1GB'  #OS側のキャッシュ見積もり。クエリプランに影響。
work_mem = '4MB'        #ソートやハッシュ処理に使うメモリ。
                                #複雑なクエリが多い場合は増やす。
maintenance_work_mem = '64MB'   #PostgreSQLが「メンテナンス系の処理」を
                                #行うときに使うメモリの上限

上記の値は必要に応じて設定してください。

pg_hba.confファイルの設定

pg_hba.confは接続認証の制御ファイルで、誰が・どこから・どの方法で接続できるかを定義します。

インストールされたファイルはUNIX用なので、以下の様にWndows用に書き換えます。

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# IPv4 local connections:
host    all             all             127.0.0.1/32         scram-sha-256


# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256

# Allow replication connections from localhost, by a user with the replication privilege.
host    replication     replicator      192.168.0.60/24         scram-sha-256
  • host all all 127.0.0.1/24 scram-sha-256
    すべてのデータベースに対して、全てのユーザーから接続を許可しています。
  • host replication replicator 192.168.0.60/24 scram-sha-256
    レプリケーション専用接続で、ID:replicatorで(192.168.0.1~254:スタンバイサーバー)からプライマリサーバ(192.168.0.80)にアクセスを許可しています。

レプリケーション権限を持つユーザーの作成

  • 下記コマンドで作成します。
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'reppass';

PostgreSQLサービス再起動(PowerShell)

  • PostgreSQLが正常に再起動するか確認します。
Restart-Service -Name postgresql-x64-17

スタンバイサーバーの設定

初期同期の実行

pg_basebackupでプライマリからデータを取得し、初期同期を実行します。

  • C:\pgsql フォルダを作成
mkdir C:\pgsql
  • 下記コマンドで初期同期を実行
cd "C:\Program Files\PostgreSQL\bin"
.\pg_basebackup.exe -h 192.168.0.80 -D "C:\pgsql\standby_data" -U replicator -P -R -W

これから以後のファイル設定は、”C:\pgsql\standby_data” 内のファイルに対して行います。

postgresql.auto.conf の内容追加

postgresql.auto.conf に下記の内容を追加します。application_name はプライマリ側の synchronous_standby_names に一致させると同期レプリケーションが可能となります。

primary_conninfo = 'host=192.168.0.80 port=5432 user=replicator password=reppass application_name=standby01'

standby.signal ファイルの作成(自動作成されていない場合)

内容は無くてもよいが、このファイルが存在することで、PostgreSQLはスタンバイモードで起動します。作成方法は下記コマンドを実行。

New-Item -Path "C:\pgsql\standby_data\standby.signal" -ItemType File

postgresql.conf の調整

postgresql.conf ファイルの内容が、下記のようになるよう調整します。

# 接続関連
listen_addresses = '*'                 # 外部からの接続を許可
port = 5432                            # 通常のPostgreSQLポート

# WAL受信と適用
wal_level = replica                    # WALを受信する最低レベル
hot_standby = on                       # スタンバイでもSELECTなどの読み取りを許可
wal_receiver_status_interval = 1s     # プライマリへの受信状況報告間隔
wal_retrieve_retry_interval = 3s      # WAL取得失敗時の再試行間隔

# ログ出力(トラブル時の診断に必須)
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_min_messages = info
log_connections = on
log_disconnections = on

hot_standby = on により、スタンバイでも読み取りクエリが可能になります。

サービスの登録と起動(初回のみ)

  • サービスの登録
    スタンバイ側で下記のコマンドを実行して「pgsql-standby」サービスを登録します。 C:\Program Files\PostgreSQL\17\bin にパスを通すか、ディレクトリに移動して実行。
cd "C:\Program Files\PostgreSQL\bin"
./pg_ctl register -N "pgsql-standby" -D "C:\pgsql\standby_data"
  • サービスの起動
    下記コマンドを実行
Start-Service -Name pgsql-standby
  • 動作確認
    下記SELECT文で、trueが返ればスタンバイとして動作中です。
SELECT pg_is_in_recovery();

レプリケーション動作の確認

プライマリ側のテーブルに1件のレコードを追加した場合、スタンバイ側にも同様に追加されるか確認してみます。

  • プライマリ側の操作
    articlesテーブルに1件のレコードを追加
プライマリ側のレコード追加画面。
  • スタンドバイ側の状態
    プライマリ側に追加されたレコードが、スタンドバイ側にも追加され、同期している事が確認できます。
スタンドバイ側の同期状態の画像

ストリーミングレプリケーションのまとめ

ストリーミングレプリケーションは、基本的にデータベース全体を複製します。レプリケーションの元となるサーバーは1台だけ設定できますが、スタンバイは複数台設定できます。又、スタンバイサーバーで実行できるのは参照系のクエリのみです。

冒頭でも述べましたが、ストリーミングレプリケーションは、PostgreSQLの高可用性を実現する重要な機能です。設定はシンプルですが、細部の確認が成功の鍵。この記事を参考に、安全で再現性の高い構成を作成して下さい。

タイトルとURLをコピーしました