PostgreSQLストリーミングレプリケーション設定のステップバイステップガイド

pg_basebackup、pg_hba.conf、standby.signal、および確認クエリを使用してPostgreSQLストリーミングレプリケーションを構成します。

PostgreSQLストリーミングレプリケーション設定のステップバイステップガイド

ストリーミングレプリケーションは、PostgreSQL環境で高可用性(HA)と読み取りスケーラビリティを実現するための基本的なメカニズムです。プライマリ(マスター)サーバーがライトアヘッドログ(WAL)レコードを1つ以上のスタンバイ(レプリカ)サーバーに継続的にストリーミングするように構成することで、最小限の遅延でデータ同期を確保します。

このガイドでは、pg_basebackuppg_hba.conf、およびスタンバイシグナルファイルを使用した非同期ストリーミングレプリケーションについて説明します。最終的には、動作するプライマリ-スタンバイペアと、実際にストリーミングされていることを確認するためのチェックが完了します。

前提条件と環境設定

開始する前に、以下の前提条件が満たされていることを確認してください。このガイドでは、同じメジャーバージョンのPostgreSQL(バージョン12以降を推奨)を実行している2台のサーバー、プライマリとスタンバイを想定しています。

サーバー 役割 IPアドレス(例)
プライマリ 信頼できる情報源 192.168.1.10
スタンバイ レプリカ 192.168.1.11
  • ユーザー: 両方のサーバーで管理アクセス権(例:sudoまたはpostgresシステムユーザー)が必要です。
  • ネットワーク: スタンバイサーバーは、PostgreSQLポート(デフォルト5432)でプライマリサーバーに接続できる必要があります。

ステップ1:プライマリサーバーの構成

プライマリサーバーは、レプリケーション用のWALファイルを生成して提供するように構成する必要があります。

1.1 postgresql.confの変更

メイン設定ファイルを編集します。DebianおよびUbuntuパッケージでは、これは多くの場合/etc/postgresql/<version>/main/postgresql.confにあります。多くのソースまたはコンテナインストールでは、データディレクトリにあります。以下のパラメータを設定します。

# 他のホストからの接続を許可
listen_addresses = '*'

# WALレベルを'replica'以上に設定
wal_level = replica

# スタンバイサーバーからの同時接続の最大数
max_wal_senders = 5 

# 同時にアクティブにできるスタンバイ接続の数を制御
max_replication_slots = 5

# スタンバイでの読み取り専用クエリを許可
hot_standby = on

1.2 専用のレプリケーションユーザーの作成

セキュリティのために、REPLICATION属性を持つ特定のユーザーを作成します。このユーザーは、スタンバイサーバーがWALレコードをプルするためにのみ使用されます。

# PostgreSQLに接続
sudo -u postgres psql -c "CREATE ROLE replica_user WITH REPLICATION LOGIN PASSWORD '実際の秘密のパスワードを使用';"

1.3 クライアント認証の更新(pg_hba.conf

スタンバイサーバーのIPアドレスからのレプリケーションユーザーが、特別なreplication疑似データベースに接続できるようにします。

# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    replication     replica_user    192.168.1.11/32         md5

1.4 プライマリサーバーの再起動

構成の変更を適用します。listen_addressesを変更した後は、再起動が簡単なオプションです。pg_hba.confのみを変更した場合は、リロードで十分です。

sudo systemctl restart postgresql

ステップ2:スタンバイサーバーの準備

データをクローンする前に、スタンバイのPostgreSQLサービスが停止し、既存のデータディレクトリがクリアされていることを確認します。

2.1 スタンバイPostgreSQLサービスの停止

sudo systemctl stop postgresql

2.2 データディレクトリのクリア

警告: この手順では、スタンバイのデータディレクトリ内のすべてのデータが完全に削除されます。実行前にパスを確認してください。

# PG 14のパス例
PG_DATA=/var/lib/postgresql/14/main

sudo rm -rf $PG_DATA/*

2.3 pg_basebackupを使用したデータのクローン

pg_basebackupを使用して、プライマリのデータディレクトリの正確なコピーを作成します。-Rフラグは、ストリーミングレプリケーション(PostgreSQL 12以降)に必要な設定ファイル(standby.signalおよびprimary_conninfo)を自動的に生成するため、重要です。

このコマンドをスタンバイサーバー上で実行します。

PG_DATA=/var/lib/postgresql/14/main

sudo -u postgres pg_basebackup -h 192.168.1.10 -D $PG_DATA -U replica_user -P -v -R
オプション 説明
-h プライマリサーバーのホスト名/IPアドレス。
-D ローカルデータディレクトリのパス。
-U レプリケーションユーザー名(replica_user)。
-P 進行状況を表示。
-v 詳細な出力。
-R レプリケーション設定ファイルを自動的に作成。

ステップ3:スタンバイの構成と起動

3.1 スタンバイ構成の確認

ステップ2.3で-Rフラグを使用した場合、pg_basebackupstandby.signalファイルを作成し、primary_conninfo設定を入力します。これは通常、データディレクトリ内の生成された設定ファイルpostgresql.auto.confにあります。

primary_conninfo文字列の内容を確認します。次のようになっているはずです($PG_DATA/postgresql.auto.conf内を確認)。

primary_conninfo = 'host=192.168.1.10 user=replica_user password=SuperSecurePassword123 application_name=standby_node'

ヒント: primary_conninfoにパスワードが含まれているか、証明書ベースの認証を使用していることを確認してください。pg_hba.conftrustまたはcertを使用している場合、パスワードは省略できます。

3.2 スタンバイサービスの起動

必要なシグナルファイル(standby.signal)がデータディレクトリに存在するため、サービスは読み取り専用のスタンバイモードで起動し、すぐにプライマリへの接続を試みます。

sudo systemctl start postgresql

ステップ4:ストリーミングレプリケーションの確認

スタンバイを起動した後、接続がアクティブでデータ同期が行われていることを確認する必要があります。

4.1 プライマリサーバーでの確認

プライマリサーバーに接続し、pg_stat_replicationビューをクエリします。スタンバイサーバーからの接続を表す行が表示されるはずです。

psql -c "SELECT client_addr, state, sync_state, sent_lsn, write_lsn, flush_lsn FROM pg_stat_replication;"

期待される出力(主要フィールド):

  • client_addr:スタンバイサーバーのIPと一致する必要があります(例:192.168.1.11)。
  • statestreamingである必要があります。startupまたはcatching upと表示される場合は、しばらく待ちます。walsenderが起動中と表示される場合は、もうすぐです。
  • sync_stateasyncである必要があります(標準の非同期レプリケーションの場合)。

4.2 データ同期のテスト

データフローを確認するには、プライマリで変更を実行し、すぐにスタンバイでその存在を確認します。

プライマリで:

CREATE TABLE replication_test (id serial primary key, message text);
INSERT INTO replication_test (message) VALUES ('データが正常に同期されました');

スタンバイ(読み取り専用)で:

-- これはエラーなしで成功する必要があります
psql -c "SELECT * FROM replication_test;"

データがスタンバイに表示される場合、ストリーミングレプリケーションが正常に構成され、アクティブになっています。

ベストプラクティスとトラブルシューティング

永続的な接続:レプリケーションスロット

オプションですが、レプリケーションスロットを強くお勧めします。レプリケーションスロットは、スタンバイが一時的に切断された場合でも、プライマリサーバーがスタンバイに必要なWALセグメントを早期に破棄しないようにします。

プライマリで:

SELECT * FROM pg_create_physical_replication_slot('standby_slot_name');

次に、スタンバイでprimary_slot_nameを設定します。スロット名をprimary_conninfo内に配置しないでください。

primary_conninfo = 'host=192.168.1.10 user=replica_user password=実際の秘密のパスワードを使用 application_name=standby_node'
primary_slot_name = 'standby_slot_name'

警告: レプリケーションスロットは注意深い監視が必要です。スタンバイが長期間障害が発生した場合、スロットによって保護された蓄積されたWALファイルにより、プライマリサーバーのディスク容量が急速に満杯になる可能性があります。

一般的な問題のトラブルシューティング

問題 潜在的な原因 解決策
スタンバイが接続できない ネットワークファイアウォール、誤ったlisten_addresses、またはプライマリのpg_hba.confが正しくない。 ポート5432に到達可能であることを確認。pg_hba.confがスタンバイIPとユーザーと一致していることを確認。
pg_basebackupが認証エラーで失敗する パスワードが正しくない、またはpg_hba.confにホストエントリがない。 replica_userのパスワードを再確認。pg_hba.confを変更した後、プライマリデータベースが再起動されていることを確認。
スタンバイが読み取り専用である これは期待される動作です。 standby.signalの存在により、サーバーがリカバリモードになります。

次のステップ

ストリーミングレプリケーションの設定は、復元力のあるPostgreSQLアーキテクチャを構築するための重要なステップです。これらの手順に従うことで、継続的なデータ同期を保証するプライマリ-スタンバイペアを正常に構成でき、システムの高可用性機能が大幅に向上します。次の論理的なステップは、監視ソリューションとフェイルオーバーメカニズム(PatroniやRepmgrなど)を統合して、HAセットアップを完全に自動化することです。