CentOS8でPostgreSQL12ストリーミングレプリケーションを構成する方法


PostgreSQLデータベースは、高可用性、スケーラブル、フォールトトレラントなアプリケーションを構築するためのいくつかのレプリケーションソリューションをサポートしています。その1つがログ先行書き込み(WAL)シッピングです。このソリューションでは、ファイルベースのログ配布またはストリーミングレプリケーション、あるいは可能な場合は両方のアプローチの組み合わせを使用して、スタンバイサーバーを実装できます。

ストリーミングレプリケーションでは、スタンバイ(レプリケーションスレーブ)データベースサーバーがマスター/プライマリサーバーに接続するように構成されます。マスター/プライマリサーバーは、WALファイルがいっぱいになるのを待たずに、生成時にWALレコードをスタンバイにストリーミングします。

デフォルトでは、ストリーミングレプリケーションは非同期であり、プライマリサーバーでトランザクションがコミットされた後にデータがスタンバイサーバーに書き込まれます。これは、マスターサーバーでトランザクションをコミットしてからスタンバイサーバーで変更が表示されるまでにわずかな遅延があることを意味します。このアプローチの欠点の1つは、マスターサーバーがクラッシュした場合、コミットされていないトランザクションが複製されない可能性があり、これによりデータが失われる可能性があることです。

このガイドでは、CentOS8でPostgresql12マスタースタンバイストリーミングレプリケーションを設定する方法を示します。スタンバイが古いWALセグメントを受信する前に、マスターサーバーが古いWALセグメントをリサイクルしないようにするソリューションとして、スタンバイに「レプリケーションスロット」を使用します。

他の方法と比較して、レプリケーションスロットは必要であることがわかっているセグメントの数だけを保持することに注意してください。

このガイドでは、SSH経由でマスターおよびスタンバイデータベースサーバーにルートとして接続していることを前提としています(管理者権限を持つ通常のユーザーとして接続している場合は、必要に応じてSudoコマンドを使用します)。

Postgresql master database server: 		10.20.20.9
Postgresql standby database server:		10.20.20.8

両方のデータベースサーバーにPostgresql12がインストールされている必要があります。そうでない場合は、「CentOS8にPostgreSQLとpgAdminをインストールする方法」を参照してください。

注:PostgreSQL 12には、recovery.confの置き換えや、recovery.confパラメーターの通常のPostgreSQL構成パラメーターへの変換など、レプリケーションの実装と構成に大きな変更が加えられているため、クラスターレプリケーションの構成がはるかに簡単になります。

ステップ1:PostgreSQLマスター/プライマリデータベースサーバーを構成する

1.マスターサーバーで、postgresシステムアカウントに切り替えて、マスターサーバーがクライアントからの接続をリッスンするIPアドレスを構成します。

この場合、すべてを意味する * を使用します。

# su - postgres
$ psql -c "ALTER SYSTEM SET listen_addresses TO '*';"

ALTER SYSTEM SET SQLコマンドは、SQLクエリを使用してサーバーの構成パラメーターを直接変更するための強力な機能です。構成は、データフォルダーのルートにあるpostgresql.conf.autoファイル(例:/ var/lib/pgsql/12/data /)に保存され、postgresql.confに保存されているものに加えて読み取ります。ただし、前者の構成は、後者およびその他の関連ファイルの構成よりも優先されます。

2.次に、createuserプログラムを使用して、スタンバイサーバーからマスターサーバーへの接続に使用されるレプリケーションロールを作成します。次のコマンドでは、 -P フラグが新しいロールのパスワードの入力を求め、 -e がcreateuserが生成してデータベースサーバーに送信するコマンドをエコーします。

# su – postgres
$ createuser --replication -P -e replicator
$ exit

3.次に、スクリーンショットに示すように、データベースフィールドをレプリケーションに設定して、/ var/lib/pgsql/12/data /pg_hba.confクライアント認証設定ファイルの最後に次のエントリを入力します。

host    replication     replicator      10.20.20.8/24     md5

4.次に、次のsystemctlコマンドを使用してPostgres12サービスを再起動し、変更を適用します。

# systemctl restart postgresql-12.service

5.次に、firewalldサービスを実行している場合は、Firewalld構成にPostgresqlサービスを追加して、スタンバイサーバーからマスターへのリクエストを許可する必要があります。

# firewall-cmd --add-service=postgresql --permanent
# firewall-cmd --reload

ステップ2:スタンバイサーバーをブートストラップするためのベースバックアップを作成する

6.次に、スタンバイサーバーからマスターサーバーのベースバックアップを作成する必要があります。これは、スタンバイサーバーをブートストラップするのに役立ちます。ベースを取得する前に、スタンバイサーバーでpostgresql 12サービスを停止し、postgresユーザーアカウントに切り替えて、データディレクトリ(/ var/lib/pgsql/12/data /)をバックアップし、その下にあるすべてのものを削除する必要があります。バックアップ。

# systemctl stop postgresql-12.service
# su - postgres
$ cp -R /var/lib/pgsql/12/data /var/lib/pgsql/12/data_orig
$ rm -rf /var/lib/pgsql/12/data/*

7.次に、pg_basebackupツールを使用して、適切な所有権(データベースシステムユーザー、つまりPostgresユーザーアカウント内のPostgres)と適切な権限で基本バックアップを作成します。

次のコマンドでは、オプションは次のとおりです。

  • -h – specifies the host which is the master server.
  • -D – specifies the data directory.
  • -U – specifies the connection user.
  • -P – enables progress reporting.
  • -v – enables verbose mode.
  • -R – enables the creation of recovery configuration: Creates a standby.signal file and append connection settings to postgresql.auto.conf under the data directory.
  • -X – used to include the required write-ahead log files (WAL files) in the backup. A value of stream means to stream the WAL while the backup is created.
  • -C – enables the creation of a replication slot named by the -S option before starting the backup.
  • -S – specifies the replication slot name.
$ pg_basebackup -h 10.20.20.9 -D /var/lib/pgsql/12/data -U replicator -P -v  -R -X stream -C -S pgstandby1
$ exit

8.バックアッププロセスが完了すると、スタンバイサーバー上の新しいデータディレクトリはスクリーンショットのようになります。スタンバイ信号が作成され、接続設定がpostgresql.auto.confに追加されます。 lsコマンドを使用してその内容を一覧表示できます。

# ls -l /var/lib/pgsql/12/data/

postgresql.confでhot_standbyパラメータがon(デフォルト値)に設定されていて、データディレクトリにstandby.signalファイルが存在する場合、レプリケーションスレーブは「ホットスタンバイ」モードで実行されます。

9.マスターサーバーに戻ると、次のようにpg_replication_slotsビューを開くと、pgstandby1というレプリケーションスロットが表示されるはずです。

# su - postgres
$ psql -c "SELECT * FROM pg_replication_slots;"
$ exit

10. postgresql.auto.confファイルに追加された接続設定を表示するには、catコマンドを使用します。

# cat /var/lib/pgsql/12/data/postgresql.auto.conf

11.次に、次のようにPostgreSQLサービスを開始して、スタンバイサーバーで通常のデータベース操作を開始します。

# systemctl start postgresql-12

ステップ3:PostgreSQLストリーミングレプリケーションをテストする

12.マスターとスタンバイの間で接続が正常に確立されると、スタンバイサーバーにストリーミングステータスのWALレシーバープロセスが表示されます。これは、pg_stat_wal_receiverビューを使用して確認できます。

$ psql -c "\x" -c "SELECT * FROM pg_stat_wal_receiver;"

ストリーミングの状態と非同期のsync_stateを持つマスター/プライマリサーバーの対応するWAL送信者プロセスでは、このpg_stat_replicationpg_stat_replicationビューを確認できます。

$ psql -c "\x" -c "SELECT * FROM pg_stat_replication;"

上のスクリーンショットから、ストリーミングレプリケーションは非同期です。次のセクションでは、オプションで同期レプリケーションを有効にする方法を示します。

[スタンバイ] postgres u003d#\ l

オプション:同期レプリケーションの有効化

14.同期レプリケーションは、トランザクションをプライマリデータベースとスタンバイ/レプリカに同時にコミット(またはデータを書き込む)する機能を提供します。トランザクションによって行われたすべての変更が1つ以上の同期スタンバイサーバーに転送された場合にのみ、トランザクションが成功したことを確認します。

同期レプリケーションを有効にするには、synchronous_commitもonに設定する必要があり(これはデフォルト値であるため、変更する必要はありません)、synchronous_standby_namesパラメーターを空でない値に設定する必要もあります。このガイドでは、すべてに設定します。

$ psql -c "ALTER SYSTEM SET synchronous_standby_names TO  '*';"

15.次に、PostgreSQL 12サービスをリロードして、新しい変更を適用します。

# systemctl reload postgresql-12.service

16.これで、プライマリサーバーでWAL送信者プロセスにもう一度クエリを実行すると、ストリーミングの状態とsync_stateの同期が表示されます。

$ psql -c "\x" -c "SELECT * FROM pg_stat_replication;"

このガイドは終わりです。 CentOS8でPostgreSQL12マスタースタンバイデータベースストリーミングレプリケーションを設定する方法を示しました。また、PostgreSQLデータベースクラスターで同期レプリケーションを有効にする方法についても説明しました。

レプリケーションには多くの用途があり、IT環境やアプリケーション固有の要件を満たすソリューションをいつでも選択できます。詳細については、PostgreSQL12のドキュメントの「Log-ShippingStandbyServers」を参照してください。