From b568e1c07c97c13339ce89a40e34ea25898f0013 Mon Sep 17 00:00:00 2001 From: Bo Peng Date: Mon, 10 Feb 2025 18:12:03 +0900 Subject: [PATCH] Doc: Update configuration example to 4.6 and PostgreSQL 17. This commit includes: - update configuration example to 4.6 and PostgreSQL 17 - update OS to Rocky Linux 9 --- doc.ja/src/sgml/example-cluster.sgml | 429 +++++++++++------------ doc/src/sgml/example-cluster.sgml | 489 ++++++++++++++------------- 2 files changed, 471 insertions(+), 447 deletions(-) diff --git a/doc.ja/src/sgml/example-cluster.sgml b/doc.ja/src/sgml/example-cluster.sgml index fbfd504a0..f22fc4ac7 100644 --- a/doc.ja/src/sgml/example-cluster.sgml +++ b/doc.ja/src/sgml/example-cluster.sgml @@ -7,7 +7,7 @@ この設定例では、3台のPgpool-IIを使ってPostgreSQL(プライマリ1台、スタンバイ2台)を管理し、単一障害点やスプリットブレインの起きない堅牢なクラスタを運用することが可能です。 - この設定例ではPostgreSQL 16を使っていますが、 + この設定例ではPostgreSQL 17を使っていますが、 各種スクリプトはPostgreSQL 10以降での動作確認を行っています。 @@ -22,7 +22,7 @@ 全体構成 今回は、Linuxサーバを3台用意し、それぞれのホスト名はserver1、server2、server3とします。 - 使用するOSはすべてRocky Linux 8とします。 + 使用するOSはすべてRocky Linux 9とします。 それぞれのサーバにPostgreSQLとPgpool-IIをインストールします。 3台のPostgreSQLがストリーミングレプリケーション構成になります。全体構成図は以下の通りです。 @@ -83,7 +83,7 @@ PostgreSQLバージョン - 16.0 + 17.0 - @@ -93,13 +93,13 @@ $PGDATA - /var/lib/pgsql/16/data + /var/lib/pgsql/17/data - アーカイブモード - 有効 - /var/lib/pgsql/archivedir + 無効 + - レプリケーションスロット @@ -131,7 +131,7 @@ Pgpool-IIバージョン - 4.5.0 + 4.6.0 - @@ -188,25 +188,25 @@ 自動フェイルオーバ - /etc/pgpool-II/sample_scripts/failover.sh.sample + /etc/pgpool-II/sample_scripts/failover.sh.sample フェイルオーバを実行するスクリプト。で使用します。 - /etc/pgpool-II/sample_scripts/follow_primary.sh.sample + /etc/pgpool-II/sample_scripts/follow_primary.sh.sample 上記フェイルオーバスクリプトが実行された後に、新しいプライマリサーバとスタンバイサーバを同期させるスクリプト。で使用します。 PostgreSQLサーバが2台の場合はこのスクリプトの設定は不要です。 オンラインリカバリ - /etc/pgpool-II/sample_scripts/recovery_1st_stage.sample + /etc/pgpool-II/sample_scripts/recovery_1st_stage.sample スタンバイサーバをリカバリするスクリプト。で使用します。 - /etc/pgpool-II/sample_scripts/pgpool_remote_start.sample + /etc/pgpool-II/sample_scripts/pgpool_remote_start.sample 上記が実行された後に、スタンバイノードを起動させるスクリプト。 Watchdog - /etc/pgpool-II/sample_scripts/escalation.sh.sample + /etc/pgpool-II/sample_scripts/escalation.sh.sample 任意の設定。Pgpool-IIのリーダー/スタンバイ切り替え時に、旧Watchdogリーダープロセスの異常終了によって旧Watchdogリーダーで仮想IPが起動したまま、新しいリーダーノードで仮想IPが起動されることを防ぐために、新しいリーダー以外で起動している仮想IPを停止するスクリプト。で使用します。 @@ -228,9 +228,9 @@ PostgreSQLのインストールはPostgreSQLコミュニティのリポジトリを使います。 -[全サーバ]# dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm +[全サーバ]# dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm [全サーバ]# dnf -qy module disable postgresql -[全サーバ]# dnf install -y postgresql16-server +[全サーバ]# dnf install -y postgresql17-server @@ -252,6 +252,10 @@ exclude=pgpool* +[pgdg17] +... +exclude=pgpool* + [pgdg16] ... exclude=pgpool* @@ -270,19 +274,18 @@ exclude=pgpool* [pgdg12] ... -exclude=pgpool* - -[pgdg11] -... exclude=pgpool* Pgpool-IIをインストールします。 + Pgpool-IIのインストールに必要なlibmemcachedライブラリをインストールするために、crbリポジトリを有効にする必要があります。 + Rocky Linux 8を使用する場合、crbリポジトリではなく、powertoolsリポジトリを使用してください。 + -[全サーバ]# dnf install -y https://www.pgpool.net/yum/rpms/4.5/redhat/rhel-8-x86_64/pgpool-II-release-4.5-1.noarch.rpm -[全サーバ]# dnf install -y pgpool-II-pg16-* +[全サーバ]# dnf install -y https://www.pgpool.net/yum/rpms/4.6/redhat/rhel-9-x86_64/pgpool-II-release-4.6-1.noarch.rpm +[全サーバ]# dnf install -y --enablerepo=crb pgpool-II-pg17-* @@ -292,49 +295,103 @@ exclude=pgpool* Pgpool-IIの設定の前に、以下の設定を行ってください。 - - プライマリのセットアップ + + SSH公開鍵認証の設定 + + 自動フェイルオーバ、オンラインリカバリ機能を利用するには、すべてのPgpool-IIノード間でpostgresユーザ(Pgpool-IIのデフォルトの起動ユーザ。Pgpool-II 4.0以前、デフォルトの起動ユーザはroot)として双方向にSSH公開鍵認証(パスワードなし)で接続できるように設定する必要があります。 + - PostgreSQLプライマリサーバでストリーミングレプリケーションの設定を行います。 - この設定の例ではアーカイブリカバリを行うように設定します。 - まず、すべてのサーバにてWALを格納するディレクトリ/var/lib/pgsql/archivedirを事前に作成します。この設定例では、プライマリサーバのみでWALアーカイブをローカルで実施します。 + まず、全サーバで以下のコマンドを実行し、SSH鍵ファイルを作成します。 + この設定例では生成される鍵ファイル名はid_rsa_pgpoolとします。 [全サーバ]# su - postgres -[全サーバ]$ mkdir /var/lib/pgsql/archivedir +[全サーバ]$ mkdir ~/.ssh && chmod 700 ~/.ssh +[全サーバ]$ ssh-keygen -t rsa -f ~/.ssh/id_rsa_pgpool + + 次に、公開鍵id_rsa_pgpool.pubを各サーバの/var/lib/pgsql/.ssh/authorized_keysファイルに追加します。 + + + 設定後、postgresユーザでssh postgres@serverX -i ~/.ssh/id_rsa_pgpoolコマンドを実行し、パスワードなしでログインできることを確認してください。 + + + + 公開鍵認証によるログインに失敗した場合には、以下を確認してください。 + + + + /etc/ssh/sshd_configで公開鍵認証が許可されていることを確認します。 + + + + +PubkeyAuthentication yes + + + + + SELinuxを有効化している場合は、SSH公開鍵認証(パスワードなし)が失敗する可能性があるので、すべてのサーバで以下のコマンドを実行する必要があります。 + + + + +[全サーバ]# su - postgres +[全サーバ]$ restorecon -Rv ~/.ssh + + + + + + + firewallの設定 + + Pgpool-IIやPostgreSQLに接続する際には、ファイアーウォールによって目的のポートが開けられていなければなりません。 + Rocky Linux 9/RHEL 9の場合、以下のように設定します。 + + +[全サーバ]# firewall-cmd --permanent --zone=public --add-service=postgresql +[全サーバ]# firewall-cmd --permanent --zone=public --add-port=9999/tcp --add-port=9898/tcp --add-port=9000/tcp --add-port=9694/udp +[全サーバ]# firewall-cmd --reload + + + + + プライマリのセットアップ - server1でPostgreSQLプライマリサーバの初期化を行います。 + server1でPostgreSQLプライマリサーバのセットアップを行います。 + + + まず、データベースクラスタの初期化を行います。 + PostgreSQL 17ではデータベースクラスタのデフォルトの作成先は/var/lib/pgsql/17/dataで、postgresユーザの設定ファイル~/.bash_profileで環境変数PGDATAに指定されています。 + 必要に応じて変更してください。 + + + initdbコマンドを実行して、データベースクラスタの初期化を行います。 + 必要に応じて、--encodingや--localeオプションを指定して、データベースのエンコーディングやロケールを設定してください。 -[server1]# su - postgres -[server1]$ /usr/pgsql-16/bin/initdb -D $PGDATA +[root@server1 ~]# su - postgres +[postgres@server1 ~]$ /usr/pgsql-17/bin/initdb 次にserver1で設定ファイル$PGDATA/postgresql.confを以下のように編集します。 - pg_rewindを使うためにwal_log_hintsを有効にしておきます。 - プライマリが後でスタンバイになる可能性があるので、hot_standby = onにしておきます。 + pg_rewindを使うためにwal_log_hintsを有効にします。 +[postgres@server1 ~]$ vi $PGDATA/postgresql.conf listen_addresses = '*' -archive_mode = on -archive_command = 'cp "%p" "/var/lib/pgsql/archivedir/%f"' -max_wal_senders = 10 -max_replication_slots = 10 -wal_level = replica -hot_standby = on wal_log_hints = on - server1でPostgreSQLプライマリを起動します。 + 最後に、server1でPostgreSQLを起動します。 -[server1]# su - postgres -[server1]$ /usr/pgsql-16/bin/pg_ctl start -D $PGDATA +[postgres@server1 ~]$ /usr/pgsql-17/bin/pg_ctl start @@ -375,7 +432,7 @@ wal_log_hints = on - ユーザ + PostgreSQLユーザ @@ -408,7 +465,7 @@ wal_log_hints = on
-[server1]# psql -U postgres -p 5432 +[postgres@server1 ~]$ psql postgres=# SET password_encryption = 'scram-sha-256'; postgres=# CREATE ROLE pgpool WITH LOGIN; postgres=# CREATE ROLE repl WITH REPLICATION LOGIN; @@ -422,7 +479,8 @@ postgres=# \password postgres 以下のコマンドでpgpoolユーザをそのグループに所属させます。 -GRANT pg_monitor TO pgpool; +postgres=# GRANT pg_monitor TO pgpool; +postgres=# \q @@ -432,66 +490,15 @@ GRANT pg_monitor TO pgpool; - Pgpool-IIサーバとPostgreSQLバックエンドサーバが同じサブネットワークにあることを想定し、各ユーザがscram-sha-256認証方式で接続するように、pg_hba.confを編集しておきます。 + この設定例では、Pgpool-IIサーバとPostgreSQLバックエンドサーバが同じサブネットワークにあることを想定し、各ユーザがscram-sha-256認証方式で接続するように、$PGDATA/pg_hba.confを編集しておきます。 +[postgres@server1 ~]$ vi $PGDATA/pg_hba.conf +(以下を追加) host all pgpool samenet scram-sha-256 host all postgres samenet scram-sha-256 -host replication all samenet scram-sha-256 - -
- - - SSH公開鍵認証の設定 - - 自動フェイルオーバ、オンラインリカバリ機能を利用するには、すべてのPgpool-IIノード間でpostgresユーザ(Pgpool-IIのデフォルトの起動ユーザ。Pgpool-II 4.0以前、デフォルトの起動ユーザはroot)として双方向にSSH公開鍵認証(パスワードなし)で接続できるように設定する必要があります。 - - - - - まず、全サーバで以下のコマンドを実行し、SSH鍵ファイルを作成します。 - この設定例では生成される鍵ファイル名はid_rsa_pgpoolとします。 - - -[全サーバ]# su - postgres -[全サーバ]$ mkdir ~/.ssh -[全サーバ]$ chmod 700 ~/.ssh -[全サーバ]$ cd ~/.ssh -[全サーバ]$ ssh-keygen -t rsa -f id_rsa_pgpool +host replication repl samenet scram-sha-256 - - 次に、公開鍵id_rsa_pgpool.pubを各サーバの/var/lib/pgsql/.ssh/authorized_keysファイルに追加します。 - - - 設定後、postgresユーザでssh postgres@serverX -i ~/.ssh/id_rsa_pgpoolコマンドを実行し、パスワードなしでログインできることを確認してください。 - - - - - 公開鍵認証によるログインに失敗した場合には、以下を確認してください。 - - - - /etc/ssh/sshd_configで公開鍵認証が許可されていることを確認します。 - - - - -PubkeyAuthentication yes - - - - - SELinuxを有効化している場合は、SSH公開鍵認証(パスワードなし)が失敗する可能性があるので、すべてのサーバで以下のコマンドを実行する必要があります。 - - - - -[全サーバ]# su - postgres -[全サーバ]$ restorecon -Rv ~/.ssh - - - @@ -500,31 +507,60 @@ PubkeyAuthentication yes パスワード入力なしで、ストリーミングレプリケーションやpg_rewindを実行するために、すべてのサーバでpostgresユーザのホームディレクトリ/var/lib/pgsqlに.pgpassを作成し、パーミッションを600に設定しておきます。 -[全サーバ]# su - postgres -[全サーバ]$ vi /var/lib/pgsql/.pgpass -(以下を追加) +[postgres@server1 ~]$ vi ~/.pgpass server1:5432:replication:repl:<replユーザのパスワード> server2:5432:replication:repl:<replユーザのパスワード> server3:5432:replication:repl:<replユーザのパスワード> server1:5432:postgres:postgres:<postgresユーザのパスワード> server2:5432:postgres:postgres:<postgresユーザのパスワード> server3:5432:postgres:postgres:<postgresユーザのパスワード> -[全サーバ]$ chmod 600 /var/lib/pgsql/.pgpass + +[postgres@server1 ~]$ chmod 600 ~/.pgpass + + + server2およびserver3のpostgresユーザのホームディレクトリにコピーします。 + + +[postgres@server1 ~]$ scp -i ~/.ssh/id_rsa_pgpool -p ~/.pgpass postgres@server2: +[postgres@server1 ~]$ scp -i ~/.ssh/id_rsa_pgpool -p ~/.pgpass postgres@server3: + - - firewallの設定 + + PCP接続認証の設定 + + PCPコマンドを使用するには、username:encryptedpassword形式のPCPユーザ名とmd5暗号化パスワードをpcp.confに登録する必要があります。 + + + この設定例では、PCPユーザ名をpgpool、パスワードをpgpool_passwordに設定します。 + 必要に応じて、ユーザ名とパスワードを変更してください。 + + + 以下のように、pg_md5を使用して、pcpユーザpgpoolの暗号化されたパスワードエントリを作成します。 + + +[postgres@server1 ~]$ echo 'pgpool:'`pg_md5 pgpool_password` >> /etc/pgpool-II/pcp.conf + +[postgres@server1 ~]$ cat /etc/pgpool-II/pcp.conf +# USERID:MD5PASSWD +pgpool:4aa0cb9673e84b06d4c8a848c80eb5d0 + + + 後述のfollow_primary.shのスクリプトでパスワード入力なしでPCPコマンドを実行する必要があるので、Pgpool-IIの起動ユーザ(postgresユーザ)のホームディレクトリに.pcppassを作成します。 + + +[postgres@server1 ~]$ echo 'localhost:9898:pgpool:pgpool_password' > ~/.pcppass +[postgres@server1 ~]$ chmod 600 ~/.pcppass + - Pgpool-IIやPostgreSQLに接続する際には、ファイアーウォールによって目的のポートが開けられていなければなりません。 - Rocky Linux 8/RHEL 8の場合、以下のように設定します。 + server2およびserver3のpostgresユーザのホームディレクトリにコピーします。 -[全サーバ]# firewall-cmd --permanent --zone=public --add-service=postgresql -[全サーバ]# firewall-cmd --permanent --zone=public --add-port=9999/tcp --add-port=9898/tcp --add-port=9000/tcp --add-port=9694/udp -[全サーバ]# firewall-cmd --reload - - +[postgres@server1 ~]$ scp -i ~/.ssh/id_rsa_pgpool -p ~/.pcppass postgres@server2: +[postgres@server1 ~]$ scp -i ~/.ssh/id_rsa_pgpool -p ~/.pcppass postgres@server3: +[postgres@server1 ~]$ exit + @@ -542,7 +578,8 @@ server3:5432:postgres:postgres:<postgresユーザのパスワード> server1 -[server1]# cat /etc/pgpool-II/pgpool_node_id +[root@server1 ~]# echo 0 > /etc/pgpool-II/pgpool_node_id +[root@server1 ~]# cat /etc/pgpool-II/pgpool_node_id 0 @@ -551,7 +588,8 @@ server3:5432:postgres:postgres:<postgresユーザのパスワード> server2 -[server2]# cat /etc/pgpool-II/pgpool_node_id +[root@server2 ~]# echo 1 > /etc/pgpool-II/pgpool_node_id +[root@server2 ~]# cat /etc/pgpool-II/pgpool_node_id 1 @@ -560,31 +598,14 @@ server3:5432:postgres:postgres:<postgresユーザのパスワード> server3 -[server3]# cat /etc/pgpool-II/pgpool_node_id +[root@server3 ~]# echo 2 > /etc/pgpool-II/pgpool_node_id +[root@server3 ~]# cat /etc/pgpool-II/pgpool_node_id 2 - - PCP接続認証の設定 - - PCPコマンドを使用するには、username:encryptedpassword形式のPCPユーザ名とmd5暗号化パスワードをpcp.confに登録する必要があります。 - - - この例では、PCPユーザ名をpgpool、パスワードをpgpool_passwordに設定します。 - 以下のように、pg_md5を使用して、pgpoolユーザの暗号化されたパスワードエントリを作成します。 - - -[全サーバ]# echo 'pgpool:'`pg_md5 pgpool_password` >> /etc/pgpool-II/pcp.conf - -[全サーバ]# cat /etc/pgpool-II/pcp.conf -# USERID:MD5PASSWD -pgpool:4aa0cb9673e84b06d4c8a848c80eb5d0 - - - <productname>Pgpool-II</productname>の設定 @@ -600,11 +621,12 @@ pgpool:4aa0cb9673e84b06d4c8a848c80eb5d0 クラスタリングモード - Pgpool-IIにはいくつかのクラスタリングモードがあります。 - クラスタリングモードの設定にはを使用します。 - 今回の設定例では、ストリーミングレプリケーションモードを設定します。 + Pgpool-IIにはいくつかのクラスタリングモードがあり、 + クラスタリングモードを設定するにはというパラメータを使用します。 + この設定例では、ストリーミングレプリケーションモードを使用します。 +[root@server1 ~]# vi /etc/pgpool-II/pgpool.conf backend_clustering_mode = 'streaming_replication' @@ -678,24 +700,22 @@ health_check_max_retries = 3 末尾にノードIDを表す数字を付加することで複数のバックエンドを指定することができます。 -# - Backend Connection Settings - - backend_hostname0 = 'server1' backend_port0 = 5432 backend_weight0 = 1 -backend_data_directory0 = '/var/lib/pgsql/16/data' +backend_data_directory0 = '/var/lib/pgsql/17/data' backend_flag0 = 'ALLOW_TO_FAILOVER' backend_hostname1 = 'server2' backend_port1 = 5432 backend_weight1 = 1 -backend_data_directory1 = '/var/lib/pgsql/16/data' +backend_data_directory1 = '/var/lib/pgsql/17/data' backend_flag1 = 'ALLOW_TO_FAILOVER' backend_hostname2 = 'server3' backend_port2 = 5432 backend_weight2 = 1 -backend_data_directory2 = '/var/lib/pgsql/16/data' +backend_data_directory2 = '/var/lib/pgsql/17/data' backend_flag2 = 'ALLOW_TO_FAILOVER' @@ -706,11 +726,8 @@ backend_flag2 = 'ALLOW_TO_FAILOVER' ここではそれぞれのホスト名を設定します。 backend_application_nameXに設定された値が、primary_conninfoのapplication_nameに設定された値と一致していることを確認してください。 -... backend_application_name0 = 'server1' -... backend_application_name1 = 'server2' -... backend_application_name2 = 'server3' @@ -752,27 +769,27 @@ follow_primary_command = '/etc/pgpool-II/follow_primary.sh %d %h %p %D %m %H %M - サンプルスクリプトfailover.sh及び - follow_primary.shは + サンプルスクリプトfailover.sh及び + follow_primary.shは /etc/pgpool-II/配下にインストールされていますので、これらのファイルをコピーして作成します。 -[全サーバ]# cp -p /etc/pgpool-II/sample_scripts/failover.sh.sample /etc/pgpool-II/failover.sh -[全サーバ]# cp -p /etc/pgpool-II/sample_scripts/follow_primary.sh.sample /etc/pgpool-II/follow_primary.sh -[全サーバ]# chown postgres:postgres /etc/pgpool-II/{failover.sh,follow_primary.sh} +[root@server1 ~]# cp -p /etc/pgpool-II/sample_scripts/failover.sh.sample /etc/pgpool-II/failover.sh +[root@server1 ~]# cp -p /etc/pgpool-II/sample_scripts/follow_primary.sh.sample /etc/pgpool-II/follow_primary.sh +[root@server1 ~]# chown postgres:postgres /etc/pgpool-II/{failover.sh,follow_primary.sh} 基本的にはPGHOMEを環境に合わせて変更すれば、動作します。 -[全サーバ]# vi /etc/pgpool-II/failover.sh +[root@server1 ~]# vi /etc/pgpool-II/failover.sh ... -PGHOME=/usr/pgsql-16 +PGHOME=/usr/pgsql-17 ... -[全サーバ]# vi /etc/pgpool-II/follow_primary.sh +[root@server1 ~]# vi /etc/pgpool-II/follow_primary.sh ... -PGHOME=/usr/pgsql-16 +PGHOME=/usr/pgsql-17 ... @@ -780,21 +797,10 @@ PGHOME=/usr/pgsql-16 この設定例では、前述のセクションですでに登録済みです。 -# cat /etc/pgpool-II/follow_primary.sh +[root@server1 ~]# vi /etc/pgpool-II/follow_primary.sh ... PCP_USER=pgpool ... - - - 前述のfollow_primary.shのスクリプトでパスワード入力なしでPCPコマンドを実行できるように、すべてのサーバでPgpool-IIの起動ユーザのホームディレクトリに.pcppassを作成します。 - - - この例では、PCPユーザがpgpoolで、パスワードがpgpool_passwordとします。 - - -[全サーバ]# su - postgres -[全サーバ]$ echo 'localhost:9898:pgpool:pgpool_password' > ~/.pcppass -[全サーバ]$ chmod 600 ~/.pcppass @@ -821,28 +827,27 @@ recovery_password = '' recovery_1st_stage_command = 'recovery_1st_stage' - オンラインリカバリ用のサンプルスクリプトrecovery_1st_stage - 及びpgpool_remote_startは + オンラインリカバリ用のサンプルスクリプトrecovery_1st_stage + 及びpgpool_remote_startは /etc/pgpool-II/配下にインストールされていますので、 これらのファイルをプライマリサーバ(server1)のデータベースクラスタ配下に配置します。 -[server1]# cp -p /etc/pgpool-II/sample_scripts/recovery_1st_stage.sample /var/lib/pgsql/16/data/recovery_1st_stage -[server1]# cp -p /etc/pgpool-II/sample_scripts/pgpool_remote_start.sample /var/lib/pgsql/16/data/pgpool_remote_start -[server1]# chown postgres:postgres /var/lib/pgsql/16/data/{recovery_1st_stage,pgpool_remote_start} +[root@server1 ~]# su - postgres -c "cp -p /etc/pgpool-II/sample_scripts/recovery_1st_stage.sample $PGDATA/recovery_1st_stage" +[root@server1 ~]# su - postgres -c "cp -p /etc/pgpool-II/sample_scripts/pgpool_remote_start.sample $PGDATA/pgpool_remote_start" 基本的にはPGHOMEを環境に合わせて変更すれば、動作します。 -[server1]# vi /var/lib/pgsql/16/data/recovery_1st_stage +[root@server1 ~]# vi /var/lib/pgsql/17/data/recovery_1st_stage ... -PGHOME=/usr/pgsql-16 +PGHOME=/usr/pgsql-17 ... -[server1]# vi /var/lib/pgsql/16/data/pgpool_remote_start +[root@server1 ~]# vi /var/lib/pgsql/17/data/pgpool_remote_start ... -PGHOME=/usr/pgsql-16 +PGHOME=/usr/pgsql-17 ... @@ -852,8 +857,7 @@ PGHOME=/usr/pgsql-16 server1のtemplate1にpgpool_recoveryをインストールしておきます。 -[server1]# su - postgres -[server1]$ psql template1 -c "CREATE EXTENSION pgpool_recovery" +[root@server1 ~]# psql -U postgres template1 -c "CREATE EXTENSION pgpool_recovery" @@ -887,6 +891,8 @@ enable_pool_hba = on この設定例では、Pgpool-IIに接続しているアプリケーションが同じサブネット内にあると想定しています。 +[root@server1 ~]# vi /etc/pgpool-II/pool_hba.conf +(以下を追加) host all pgpool samenet scram-sha-256 host all postgres samenet scram-sha-256 @@ -898,26 +904,28 @@ host all postgres samenet scram-sha-256 Pgpool-IIのクライアント認証で用いるデフォルトのパスワードファイル名はpool_passwdです。 scram-sha-256認証を利用する場合、Pgpool-IIはそれらのパスワードを復号化するために復号鍵が必要となります。 - 全サーバで復号鍵ファイルをPgpool-IIの起動ユーザpostgres (Pgpool-II 4.0以前のバージョンでは - root) のホームディレクトリ配下に作成します。 + 復号鍵ファイルをPgpool-IIの起動ユーザpostgres(Pgpool-II 4.0以前のバージョンではroot)のホームディレクトリ配下に作成し、server2およびserver3にコピーします。 -[全サーバ]# su - postgres -[全サーバ]$ echo '任意の文字列' > ~/.pgpoolkey -[全サーバ]$ chmod 600 ~/.pgpoolkey +[root@server1 ~]# su - postgres -c "echo '任意の文字列' > ~/.pgpoolkey" +[root@server1 ~]# su - postgres -c "chmod 600 ~/.pgpoolkey" +[root@server1 ~]# su - postgres -c "scp -i ~/.ssh/id_rsa_pgpool -p ~/.pgpoolkey postgres@server2:" +[root@server1 ~]# su - postgres -c "scp -i ~/.ssh/id_rsa_pgpool -p ~/.pgpoolkey postgres@server3:" pg_enc -m -k /path/to/.pgpoolkey -u username -pを実行すると、ユーザ名とAES256で暗号化したパスワードのエントリがに登録されます。 がまだ存在しなければ、pgpool.confと同じディレクトリ内に作成されます。 -[全サーバ]# su - postgres -[全サーバ]$ pg_enc -m -k ~/.pgpoolkey -u pgpool -p -db password: [pgpoolユーザのパスワード] -[全サーバ]$ pg_enc -m -k ~/.pgpoolkey -u postgres -p -db password: [postgresユーザのパスワード] +[root@server1 ~]# pg_enc -m -k /var/lib/pgsql/.pgpoolkey -u pgpool -p +db password: (pgpoolユーザのパスワードを入力) +trying to read key from file /var/lib/pgsql/.pgpoolkey + +[root@server1 ~]# pg_enc -m -k /var/lib/pgsql/.pgpoolkey -u postgres -p +db password: (postgresユーザのパスワードを入力) +trying to read key from file /var/lib/pgsql/.pgpoolkey -# cat /etc/pgpool-II/pool_passwd +[root@server1 ~]# cat /etc/pgpool-II/pool_passwd pgpool:AESheq2ZMZjynddMWk5sKP/Rw== postgres:AESHs/pWL5rtXy2IwuzroHfqg== @@ -941,7 +949,7 @@ delegate_ip = '192.168.100.50' 仮想IPの起動/停止、ARPリクエストの送信を行う設定パラメータ - 、、に、ネットワーク環境に合わせてネットワークインターフェース名を設定します。 + 、、に、ネットワーク環境に合わせてネットマスクおよびネットワークインターフェース名を設定します。 この設定例で使用しているネットワークインターフェースはenp0s8となります。 if_up/down_cmdやarping_cmdを実行するにはroot権限が必要となりますので、 一般ユーザで実行できるようにip/arpingコマンドにsetuidを設定するか、Pgpool-II起動ユーザ、デフォルトではpostgresユーザ (Pgpool-II 4.1以降) がパスワードなしにsudoを実行できるように設定する必要があります。 @@ -1049,23 +1057,24 @@ wd_heartbeat_deadtime = 30 wd_escalation_command = '/etc/pgpool-II/escalation.sh'   - サンプルスクリプトescalation.shは + サンプルスクリプトescalation.shは /etc/pgpool-II/配下にインストールされています。 -[全サーバ]# cp -p /etc/pgpool-II/sample_scripts/escalation.sh.sample /etc/pgpool-II/escalation.sh -[全サーバ]# chown postgres:postgres /etc/pgpool-II/escalation.sh +[root@server1 ~]# cp -p /etc/pgpool-II/sample_scripts/escalation.sh.sample /etc/pgpool-II/escalation.sh +[root@server1 ~]# chown postgres:postgres /etc/pgpool-II/escalation.sh サーバのホスト名、仮想IP、仮想IPを設定するネットワークインターフェース名を環境に合わせて変更してください。 -[全サーバ]# vi /etc/pgpool-II/escalation.sh +[root@server1 ~]# vi /etc/pgpool-II/escalation.sh ... PGPOOLS=(server1 server2 server3) VIP=192.168.100.50 DEVICE=enp0s8 +CIDR_NETMASK=24 ... @@ -1087,7 +1096,9 @@ DEVICE=enp0s8 ログの設定 Pgpool-II 4.2以降、ログ収集プロセスが追加されました。 - ここでは、ログ収集プロセス(logging_collector)を有効にします。 + RPM パッケージを使用してインストールした場合、ログ収集プロセス(logging_collector)はデフォルトで有効になっています。 + ログファイルはデフォルトで/var/log/pgpool_logに出力されます。 + 要件に合わせて、ログ関連の設定パラメータを適切に調整してください。 log_destination = 'stderr' @@ -1096,23 +1107,16 @@ log_directory = '/var/log/pgpool_log' log_filename = 'pgpool-%a.log' log_truncate_on_rotation = on log_rotation_age = 1d -log_rotation_size = 10MB - すべてのサーバでログファイルを格納するディレクトリを作成します。 - - -[全サーバ]# mkdir /var/log/pgpool_log/ -[全サーバ]# chown postgres:postgres /var/log/pgpool_log/ - - - - これで、server1でのpgpool.confの設定は完了です。 - 最後に、server1のpgpool.confを他のサーバserver2、server3にコピーします。 + これで、server1におけるPgpool-IIの設定は完了です。 + 最後に、設定ファイルを他のサーバserver2およびserver3にコピーします。 -[server1]# scp -p /etc/pgpool-II/pgpool.conf root@server2:/etc/pgpool-II/pgpool.conf -[server1]# scp -p /etc/pgpool-II/pgpool.conf root@server3:/etc/pgpool-II/pgpool.conf +[root@server1 ~]# scp -p /etc/pgpool-II/{*.conf,*.sh,pool_passwd} server2:/etc/pgpool-II/ +[root@server1 ~]# ssh server2 "chown postgres:postgres /etc/pgpool-II/{*.conf,*.sh,pool_passwd}" +[root@server1 ~]# scp -p /etc/pgpool-II/{*.conf,*.sh,pool_passwd} server3:/etc/pgpool-II/ +[root@server1 ~]# ssh server3 "chown postgres:postgres /etc/pgpool-II/{*.conf,*.sh,pool_passwd}" @@ -1137,8 +1141,7 @@ log_rotation_size = 10MB PostgreSQLプライマリサーバがまだ起動していない場合は、まず次のコマンドを実行してPostgreSQL起動します。 -[server1]# su - postgres -[server1]$ /usr/pgsql-16/bin/pg_ctl start -D $PGDATA +[root@server1 ~]# su - postgres -c "/usr/pgsql-17/bin/pg_ctl start" server1、server2およびserver3で以下のコマンドを実行し、Pgpool-IIを起動します。 @@ -1159,7 +1162,7 @@ log_rotation_size = 10MB Pgpool-IIが起動している状態でPostgreSQLを停止する、想定外のフェイルオーバが起きてしまうので、ご注意ください。 -# systemctl stop pgpool.service +[全サーバ]# systemctl stop pgpool.service @@ -1233,9 +1236,9 @@ server3:9999 Linux server3 server3 9999 9000 7 STANDBY 0 MEMBER # スタンバ server1のPgpool-IIを停止するにはPgpool-IIを停止するか、マシンをシャットダウンします。ここでは、Pgpool-IIを停止します。 -[server1]# systemctl stop pgpool.service +[root@server1 ~]# systemctl stop pgpool.service -[server1]# pcp_watchdog_info -p 9898 -h 192.168.100.50 -U pgpool -W +[root@server1 ~]# pcp_watchdog_info -p 9898 -h 192.168.100.50 -U pgpool -W Password: 3 3 YES server2:9999 Linux server2 server2 @@ -1247,9 +1250,9 @@ server3:9999 Linux server3 server3 9999 9000 7 STANDBY 0 MEMBER # server3が 先ほど停止したPgpool-IIを再起動し、スタンバイとして起動していることを確認します。 -[server1]# systemctl start pgpool.service +[root@server1 ~]# systemctl start pgpool.service -[server1]# pcp_watchdog_info -p 9898 -h 192.168.100.50 -U pgpool -W +[root@server1 ~]# pcp_watchdog_info -p 9898 -h 192.168.100.50 -U pgpool -W Password: 3 3 YES server2:9999 Linux server2 server2 @@ -1279,7 +1282,7 @@ Password for user pgpool: フェイルオーバするかどうか確認してみます。 -[server1]$ pg_ctl -D /var/lib/pgsql/16/data -m immediate stop +[root@server1 ~]# su - postgres -c "/usr/pgsql-17/bin/pg_ctl -m immediate stop" ノード1を停止した後に、フェイルオーバが発生し、server2が diff --git a/doc/src/sgml/example-cluster.sgml b/doc/src/sgml/example-cluster.sgml index 946cfdcda..99e579a07 100644 --- a/doc/src/sgml/example-cluster.sgml +++ b/doc/src/sgml/example-cluster.sgml @@ -7,7 +7,7 @@ servers to create a robust cluster system and avoid the single point of failure or split brain. - PostgreSQL 16 is used in this configuration example. + PostgreSQL 17 is used in this configuration example. All scripts have been tested with PostgreSQL 10 and later. @@ -20,7 +20,7 @@ Cluster System Configuration - We use three servers with Rocky Linux 8 installed and + We use three servers with Rocky Linux 9 installed and the hostnames of the three servers are server1 server2 and server3 respectively. We install PostgreSQL and Pgpool-II on each server. @@ -82,7 +82,7 @@ PostgreSQL Version - 16.0 + 17.0 - @@ -92,13 +92,13 @@ $PGDATA - /var/lib/pgsql/16/data + /var/lib/pgsql/17/data - Archive mode - on - /var/lib/pgsql/archivedir + off + - Replication Slots @@ -133,7 +133,7 @@ Pgpool-II Version - 4.5.0 + 4.6.0 - @@ -190,25 +190,25 @@ Failover - /etc/pgpool-II/sample_scripts/failover.sh.sample + /etc/pgpool-II/sample_scripts/failover.sh.sample Run by to perform failover - /etc/pgpool-II/sample_scripts/follow_primary.sh.sample + /etc/pgpool-II/sample_scripts/follow_primary.sh.sample Run by to synchronize the Standby with the new Primary after failover. Online recovery - /etc/pgpool-II/sample_scripts/recovery_1st_stage.sample + /etc/pgpool-II/sample_scripts/recovery_1st_stage.sample Run by to recovery a Standby node - /etc/pgpool-II/sample_scripts/pgpool_remote_start.sample + /etc/pgpool-II/sample_scripts/pgpool_remote_start.sample Run after to start the Standby node Watchdog - /etc/pgpool-II/sample_scripts/escalation.sh.sample + /etc/pgpool-II/sample_scripts/escalation.sh.sample Optional Configuration. Run by to switch the Leader/Standby Pgpool-II safely @@ -229,9 +229,9 @@ Install PostgreSQL from PostgreSQL YUM repository. -[all servers]# dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm +[all servers]# dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm [all servers]# dnf -qy module disable postgresql -[all servers]# dnf install -y postgresql16-server +[all servers]# dnf install -y postgresql17-server Since Pgpool-II related packages are also included in PostgreSQL YUM repository, @@ -249,6 +249,10 @@ ... exclude=pgpool* +[pgdg17] +... +exclude=pgpool* + [pgdg16] ... exclude=pgpool* @@ -267,19 +271,21 @@ exclude=pgpool* [pgdg12] ... -exclude=pgpool* - -[pgdg11] -... exclude=pgpool* - Install Pgpool-II from Pgpool-II YUM repository. + Install Pgpool-II from + Pgpool-II YUM repository. + To install the required libmemcached library for Pgpool-II, + you need to enable crb repository. + If you're using Rocky Linux 8, + use powertools repository instead of + crb repository. -[all servers]# dnf install -y https://www.pgpool.net/yum/rpms/4.5/redhat/rhel-8-x86_64/pgpool-II-release-4.5-1.noarch.rpm -[all servers]# dnf install -y pgpool-II-pg16-* +[all servers]# dnf install -y https://www.pgpool.net/yum/rpms/4.6/redhat/rhel-9-x86_64/pgpool-II-release-4.6-1.noarch.rpm +[all servers]# dnf install -y --enablerepo=crb pgpool-II-pg17-* @@ -289,63 +295,129 @@ exclude=pgpool* Before you start the configuration process, please check the following prerequisites. - - Setting up streaming replication on Primary + + Setting up SSH public key authentication - Set up PostgreSQL streaming replication on the primary server. - In this example, we use WAL archiving. + To use the automated failover and online recovery of Pgpool-II, + it is required to configure SSH public key authentication + (passwordless SSH login) to all backend servers using + postgres user (the default user Pgpool-II is running as. + Pgpool-II 4.0 or before, the default user is root). - First, we create the directory /var/lib/pgsql/archivedir to store - WAL segments on all servers. In this example, only Primary node archives - WAL locally. + Execute the following command on all servers to generate a key pair using + the RSA algorithm. In this example, we assume that the generated key file + name is id_rsa_pgpool. [all servers]# su - postgres -[all servers]$ mkdir /var/lib/pgsql/archivedir +[all servers]$ mkdir ~/.ssh && chmod 700 ~/.ssh +[all servers]$ ssh-keygen -t rsa -f ~/.ssh/id_rsa_pgpool + + Then add the public key id_rsa_pgpool.pub to + /var/lib/pgsql/.ssh/authorized_keys file + on each server. + + + After setting SSH, make sure that you can run + ssh postgres@serverX -i ~/.ssh/id_rsa_pgpool command + as postgres user to login to each server + without entering a password. + + + + If you failed to login using SSH public key authentication, please check the following: + + + + Ensure the public key authentication option PubkeyAuthentication are allowed in /etc/ssh/sshd_config: + + + + +PubkeyAuthentication yes + + + + + If SELinux is enabled, SSH public key authentication (passwordless SSH) may fail. + You need to run the following command on all servers. + + + + +[all servers]# su - postgres +[all servers]$ restorecon -Rv ~/.ssh + + + + + + + Setting up firewall - Initialize PostgreSQL on the primary server. + When connect to Pgpool-II and PostgreSQL servers, the target port must be accessible by enabling firewall management softwares. Following is an example for Rocky Linux 8/RHEL 8. -[server1]# su - postgres -[server1]$ /usr/pgsql-16/bin/initdb -D $PGDATA +[all servers]# firewall-cmd --permanent --zone=public --add-service=postgresql +[all servers]# firewall-cmd --permanent --zone=public --add-port=9999/tcp --add-port=9898/tcp --add-port=9000/tcp --add-port=9694/udp +[all servers]# firewall-cmd --reload + + + + + Setting up PostgreSQL primary + + Set up the PostgreSQL primary server on server1. + + + + First, initialize the database cluster. + In PostgreSQL 17, the default directory + for creating the database cluster is /var/lib/pgsql/17/data, + and this is specified in the environment variable PGDATA + in the ~/.bash_profile of the postgres + user. Modify it if you want to change the default path. + + + Run initdb to initialize the database cluster. + Specify options + such as --encoding and --locale + if you need to configure the database encoding and locale settings. + + +[root@server1 ~]# su - postgres +[postgres@server1 ~]$ /usr/pgsql-17/bin/initdb - Then we edit the configuration file $PGDATA/postgresql.conf - on server1 (primary) as follows. Enable wal_log_hints + Then edit the configuration file $PGDATA/postgresql.conf + on server1 as follows. Enable wal_log_hints to use pg_rewind. - Since the Primary may become a Standby later, we set hot_standby = on. +[postgres@server1 ~]$ vi $PGDATA/postgresql.conf listen_addresses = '*' -archive_mode = on -archive_command = 'cp "%p" "/var/lib/pgsql/archivedir/%f"' -max_wal_senders = 10 -max_replication_slots = 10 -wal_level = replica -hot_standby = on wal_log_hints = on - Start PostgreSQL primary server on server1. + Start PostgreSQL on server1. -[server1]# su - postgres -[server1]$ /usr/pgsql-16/bin/pg_ctl start -D $PGDATA +[postgres@server1 ~]$ /usr/pgsql-17/bin/pg_ctl start - Setting up streaming replication on Standby + Setting up PostgreSQL standby There are multiple methods to setup a standby server, such as: - use pg_basebackup to backup the data directory of the primary from the standby. + use pg_basebackup to backup the data directory of the primary from the standby. @@ -418,7 +490,7 @@ wal_log_hints = on -[server1]# psql -U postgres -p 5432 +[postgres@server1 ~]$ psql postgres=# SET password_encryption = 'scram-sha-256'; postgres=# CREATE ROLE pgpool WITH LOGIN; postgres=# CREATE ROLE repl WITH REPLICATION LOGIN; @@ -437,7 +509,8 @@ postgres=# \password postgres to pgpool: -GRANT pg_monitor TO pgpool; +postgres=# GRANT pg_monitor TO pgpool; +postgres=# \q @@ -447,79 +520,19 @@ GRANT pg_monitor TO pgpool; - Assuming that all the Pgpool-II servers and the + In this example, assuming that all the Pgpool-II servers and the PostgreSQL servers are in the same subnet and edit pg_hba.conf to enable scram-sha-256 authentication method. +[postgres@server1 ~]$ vi $PGDATA/pg_hba.conf +(Add the following entries) host all pgpool samenet scram-sha-256 host all postgres samenet scram-sha-256 host replication repl samenet scram-sha-256 - - Setting up SSH public key authentication - - To use the automated failover and online recovery of Pgpool-II, - it is required to configure SSH public key authentication - (passwordless SSH login) to all backend servers using - postgres user (the default user Pgpool-II is running as. - Pgpool-II 4.0 or before, the default user is root). - - - Execute the following command on all servers to generate a key pair using - the RSA algorithm. In this example, we assume that the generated key file - name is id_rsa_pgpool. - - -[all servers]# su - postgres -[all servers]$ mkdir ~/.ssh -[all servers]$ chmod 700 ~/.ssh -[all servers]$ cd ~/.ssh -[all servers]$ ssh-keygen -t rsa -f id_rsa_pgpool - - - Then add the public key id_rsa_pgpool.pub to - /var/lib/pgsql/.ssh/authorized_keys file - on each server. - - - After setting SSH, make sure that you can run - ssh postgres@serverX -i ~/.ssh/id_rsa_pgpool command - as postgres user to login to each server - without entering a password. - - - - - If you failed to login using SSH public key authentication, please check the following: - - - - Ensure the public key authentication option PubkeyAuthentication are allowed in /etc/ssh/sshd_config: - - - - -PubkeyAuthentication yes - - - - - If SELinux is enabled, SSH public key authentication (passwordless SSH) may fail. - You need to run the following command on all servers. - - - - -[all servers]# su - postgres -[all servers]$ restorecon -Rv ~/.ssh - - - - - Creating .pgpass @@ -533,31 +546,74 @@ PubkeyAuthentication yes user without providing a password for streaming replication and failover. -[all servers]# su - postgres -[all servers]$ vi /var/lib/pgsql/.pgpass +[postgres@server1 ~]$ vi ~/.pgpass server1:5432:replication:repl:<repl user password> server2:5432:replication:repl:<repl user password> server3:5432:replication:repl:<repl user password> server1:5432:postgres:postgres:<postgres user password> server2:5432:postgres:postgres:<postgres user password> server3:5432:postgres:postgres:<postgres user password> -[all servers]$ chmod 600 /var/lib/pgsql/.pgpass - - - - Setting up firewall +[postgres@server1 ~]$ chmod 600 ~/.pgpass + - When connect to Pgpool-II and PostgreSQL servers, the target port must be accessible by enabling firewall management softwares. Following is an example for Rocky Linux 8/RHEL 8. + Copy it to the home directory of postgres user + on server2 and server3. -[all servers]# firewall-cmd --permanent --zone=public --add-service=postgresql -[all servers]# firewall-cmd --permanent --zone=public --add-port=9999/tcp --add-port=9898/tcp --add-port=9000/tcp --add-port=9694/udp -[all servers]# firewall-cmd --reload +[postgres@server1 ~]$ scp -i ~/.ssh/id_rsa_pgpool -p ~/.pgpass postgres@server2: +[postgres@server1 ~]$ scp -i ~/.ssh/id_rsa_pgpool -p ~/.pgpass postgres@server3: + + PCP connection authentication + + To use PCP commands PCP user names and md5 encrypted passwords must be + declared in pcp.conf in format + "username:encrypted password". + + + In this example, we set PCP username to "pgpool" + and password to "pgpool_password". + Use to create the encrypted password entry for + pgpool user as below: + + +[postgres@server1 ~]$ echo 'pgpool:'`pg_md5 pgpool_password` >> /etc/pgpool-II/pcp.conf + +[postgres@server1 ~]$ cat /etc/pgpool-II/pcp.conf +# USERID:MD5PASSWD +pgpool:4aa0cb9673e84b06d4c8a848c80eb5d0 + + + Since follow_primary.sh script mentioned + later must execute PCP command without entering a password, + create .pcppass in + postgres user's home directory + (the home directory of the user Pgpool-II is running as). + The format of .pcppass is + "hostname:port:username:password". + + + In this example, we assume that the PCP user is pgpool + and the password is pgpool_password. + + +[postgres@server1 ~]$ echo 'localhost:9898:pgpool:pgpool_password' > ~/.pcppass +[postgres@server1 ~]$ chmod 600 ~/.pcppass + + + Copy to server2 and server3. + + +[postgres@server1 ~]$ scp -i ~/.ssh/id_rsa_pgpool -p ~/.pcppass postgres@server2: +[postgres@server1 ~]$ scp -i ~/.ssh/id_rsa_pgpool -p ~/.pcppass postgres@server3: +[postgres@server1 ~]$ exit + + + Create pgpool_node_id @@ -573,7 +629,8 @@ server3:5432:postgres:postgres:<postgres user password> server1 -[server1]# cat /etc/pgpool-II/pgpool_node_id +[root@server1 ~]# echo 0 > /etc/pgpool-II/pgpool_node_id +[root@server1 ~]# cat /etc/pgpool-II/pgpool_node_id 0 @@ -582,7 +639,8 @@ server3:5432:postgres:postgres:<postgres user password> server2 -[server2]# cat /etc/pgpool-II/pgpool_node_id +[root@server2 ~]# echo 1 > /etc/pgpool-II/pgpool_node_id +[root@server2 ~]# cat /etc/pgpool-II/pgpool_node_id 1 @@ -591,35 +649,14 @@ server3:5432:postgres:postgres:<postgres user password> server3 -[server3]# cat /etc/pgpool-II/pgpool_node_id +[root@server3 ~]# echo 2 > /etc/pgpool-II/pgpool_node_id +[root@server3 ~]# cat /etc/pgpool-II/pgpool_node_id 2 - - PCP connection authentication - - To use PCP commands PCP user names and md5 encrypted passwords must be - declared in pcp.conf in format - "username:encrypted password". - - - In this example, we set PCP username to "pgpool" - and password to "pgpool_password". - Use to create the encrypted password entry for - pgpool user as below: - - -[all servers]# echo 'pgpool:'`pg_md5 pgpool_password` >> /etc/pgpool-II/pcp.conf - -[all servers]# cat /etc/pgpool-II/pcp.conf -# USERID:MD5PASSWD -pgpool:4aa0cb9673e84b06d4c8a848c80eb5d0 - - - <productname>Pgpool-II</productname> Configuration @@ -641,6 +678,7 @@ pgpool:4aa0cb9673e84b06d4c8a848c80eb5d0 example, streaming replication mode is used. +[root@server1 ~]# vi /etc/pgpool-II/pgpool.conf backend_clustering_mode = 'streaming_replication' @@ -710,24 +748,22 @@ health_check_max_retries = 3 Multiple backends can be specified by adding a number at the end of the parameter name. -# - Backend Connection Settings - - backend_hostname0 = 'server1' backend_port0 = 5432 backend_weight0 = 1 -backend_data_directory0 = '/var/lib/pgsql/16/data' +backend_data_directory0 = '/var/lib/pgsql/17/data' backend_flag0 = 'ALLOW_TO_FAILOVER' backend_hostname1 = 'server2' backend_port1 = 5432 backend_weight1 = 1 -backend_data_directory1 = '/var/lib/pgsql/16/data' +backend_data_directory1 = '/var/lib/pgsql/17/data' backend_flag1 = 'ALLOW_TO_FAILOVER' backend_hostname2 = 'server3' backend_port2 = 5432 backend_weight2 = 1 -backend_data_directory2 = '/var/lib/pgsql/16/data' +backend_data_directory2 = '/var/lib/pgsql/17/data' backend_flag2 = 'ALLOW_TO_FAILOVER' @@ -742,11 +778,8 @@ backend_flag2 = 'ALLOW_TO_FAILOVER' of primary_conninfo. -... backend_application_name0 = 'server1' -... backend_application_name1 = 'server2' -... backend_application_name2 = 'server3' @@ -786,28 +819,28 @@ follow_primary_command = '/etc/pgpool-II/follow_primary.sh %d %h %p %D %m %H %M - Sample scripts failover.sh - and follow_primary.sh + Sample scripts failover.sh + and follow_primary.sh are installed in /etc/pgpool-II/. Create failover scripts using these sample files. -[all servers]# cp -p /etc/pgpool-II/sample_scripts/failover.sh.sample /etc/pgpool-II/failover.sh -[all servers]# cp -p /etc/pgpool-II/sample_scripts/follow_primary.sh.sample /etc/pgpool-II/follow_primary.sh -[all servers]# chown postgres:postgres /etc/pgpool-II/{failover.sh,follow_primary.sh} +[root@server1 ~]# cp -p /etc/pgpool-II/sample_scripts/failover.sh.sample /etc/pgpool-II/failover.sh +[root@server1 ~]# cp -p /etc/pgpool-II/sample_scripts/follow_primary.sh.sample /etc/pgpool-II/follow_primary.sh +[root@server1 ~]# chown postgres:postgres /etc/pgpool-II/{failover.sh,follow_primary.sh} Basically, it should work if you change PGHOME according to PostgreSQL installation directory. -[all servers]# vi /etc/pgpool-II/failover.sh +[root@server1 ~]# vi /etc/pgpool-II/failover.sh ... -PGHOME=/usr/pgsql-16 +PGHOME=/usr/pgsql-17 ... -[all servers]# vi /etc/pgpool-II/follow_primary.sh +[root@server1 ~]# vi /etc/pgpool-II/follow_primary.sh ... -PGHOME=/usr/pgsql-16 +PGHOME=/usr/pgsql-17 ... @@ -817,27 +850,10 @@ PGHOME=/usr/pgsql-16 In this example, we have created in -# cat /etc/pgpool-II/follow_primary.sh +[root@server1 ~]# cat /etc/pgpool-II/follow_primary.sh ... PCP_USER=pgpool ... - - - Since follow_primary.sh script must execute PCP command without - entering a password, we need to create .pcppass in - postgres user's home directory on each server - (the home directory of the user Pgpool-II is running as). - The format of .pcppass is - "hostname:port:username:password". - - - In this example, we assume that the PCP user is pgpool - and the password is pgpool_password. - - -[all servers]# su - postgres -[all servers]$ echo 'localhost:9898:pgpool:pgpool_password' > ~/.pcppass -[all servers]$ chmod 600 ~/.pcppass @@ -869,27 +885,26 @@ recovery_1st_stage_command = 'recovery_1st_stage' primary server (server1). - The sample scripts of online recovery recovery_1st_stage - and pgpool_remote_start + The sample scripts of online recovery recovery_1st_stage + and pgpool_remote_start are installed in /etc/pgpool-II/. Copy these files to the data directory of the primary server (server1). -[server1]# cp -p /etc/pgpool-II/sample_scripts/recovery_1st_stage.sample /var/lib/pgsql/16/data/recovery_1st_stage -[server1]# cp -p /etc/pgpool-II/sample_scripts/pgpool_remote_start.sample /var/lib/pgsql/16/data/pgpool_remote_start -[server1]# chown postgres:postgres /var/lib/pgsql/16/data/{recovery_1st_stage,pgpool_remote_start} +[root@server1 ~]# su - postgres -c "cp -p /etc/pgpool-II/sample_scripts/recovery_1st_stage.sample $PGDATA/recovery_1st_stage" +[root@server1 ~]# su - postgres -c "cp -p /etc/pgpool-II/sample_scripts/pgpool_remote_start.sample $PGDATA/pgpool_remote_start" Basically, it should work if you change PGHOME according to PostgreSQL installation directory. -[server1]# vi /var/lib/pgsql/16/data/recovery_1st_stage +[root@server1 ~]# vi /var/lib/pgsql/17/data/recovery_1st_stage ... -PGHOME=/usr/pgsql-16 +PGHOME=/usr/pgsql-17 ... -[server1]# vi /var/lib/pgsql/16/data/pgpool_remote_start +[root@server1 ~]# vi /var/lib/pgsql/17/data/pgpool_remote_start ... -PGHOME=/usr/pgsql-16 +PGHOME=/usr/pgsql-17 ... @@ -901,8 +916,7 @@ PGHOME=/usr/pgsql-16 server1. -[server1]# su - postgres -[server1]$ psql template1 -c "CREATE EXTENSION pgpool_recovery" +[root@server1 ~]# psql -U postgres template1 -c "CREATE EXTENSION pgpool_recovery" @@ -936,6 +950,8 @@ enable_pool_hba = on is in the same subnet. +[root@server1 ~]# vi /etc/pgpool-II/pool_hba.conf +(Add the following entries) host all pgpool samenet scram-sha-256 host all postgres samenet scram-sha-256 @@ -954,9 +970,10 @@ host all postgres samenet scram-sha-256 (the user Pgpool-II is running as. Pgpool-II 4.0 or before, Pgpool-II is running as root by default) -[all servers]# su - postgres -[all servers]$ echo 'some string' > ~/.pgpoolkey -[all servers]$ chmod 600 ~/.pgpoolkey +[root@server1 ~]# su - postgres -c "echo 'some string' > ~/.pgpoolkey" +[root@server1 ~]# su - postgres -c "chmod 600 ~/.pgpoolkey" +[root@server1 ~]# su - postgres -c "scp -i ~/.ssh/id_rsa_pgpool -p ~/.pgpoolkey postgres@server2:" +[root@server1 ~]# su - postgres -c "scp -i ~/.ssh/id_rsa_pgpool -p ~/.pgpoolkey postgres@server3:" @@ -966,13 +983,15 @@ host all postgres samenet scram-sha-256 pgpool.conf. -[all servers]# su - postgres -[all servers]$ pg_enc -m -k ~/.pgpoolkey -u pgpool -p -db password: [pgpool user's password] -[all servers]$ pg_enc -m -k ~/.pgpoolkey -u postgres -p -db password: [postgres user's password] +[root@server1 ~]# pg_enc -m -k /var/lib/pgsql/.pgpoolkey -u pgpool -p +db password: (Enter the password for pgpool user) +trying to read key from file /var/lib/pgsql/.pgpoolkey -# cat /etc/pgpool-II/pool_passwd +[root@server1 ~]# pg_enc -m -k /var/lib/pgsql/.pgpoolkey -u postgres -p +db password: (Enter the password for postgres user) +trying to read key from file /var/lib/pgsql/.pgpoolkey + +[root@server1 ~]# cat /etc/pgpool-II/pool_passwd pgpool:AESheq2ZMZjynddMWk5sKP/Rw== postgres:AESHs/pWL5rtXy2IwuzroHfqg== @@ -995,8 +1014,10 @@ delegate_ip = '192.168.100.50' - To bring up/down the virtual IP and send the ARP requests, we set , and . - The network interface used in this example is "enp0s8". + To bring up/down the virtual IP and send the ARP requests, + we set , and . + Set the netmask and network interface name according to your network environment. + The network interface used in this example is enp0s8. Since root privilege is required to execute if_up/down_cmd or arping_cmd command, use setuid on these command or allow postgres user (the user Pgpool-II is running as) to run @@ -1099,11 +1120,11 @@ wd_heartbeat_deadtime = 30 wd_escalation_command = '/etc/pgpool-II/escalation.sh' - The sample script escalation.sh is installed in /etc/pgpool-II/. + The sample script escalation.sh is installed in /etc/pgpool-II/. -[all servers]# cp -p /etc/pgpool-II/sample_scripts/escalation.sh.sample /etc/pgpool-II/escalation.sh -[all servers]# chown postgres:postgres /etc/pgpool-II/escalation.sh +[root@server1 ~]# cp -p /etc/pgpool-II/sample_scripts/escalation.sh.sample /etc/pgpool-II/escalation.sh +[root@server1 ~]# chown postgres:postgres /etc/pgpool-II/escalation.sh @@ -1113,11 +1134,12 @@ wd_escalation_command = '/etc/pgpool-II/escalation.sh' DEVICE is the network interface for the virtual IP. -[all servers]# vi /etc/pgpool-II/escalation.sh +[root@server1 ~]# vi /etc/pgpool-II/escalation.sh ... PGPOOLS=(server1 server2 server3) VIP=192.168.100.50 DEVICE=enp0s8 +CIDR_NETMASK=24 ... @@ -1138,8 +1160,14 @@ DEVICE=enp0s8 Logging - Since Pgpool-II 4.2, the logging collector process has been implemented. - In the example, we enable logging collector. + Since Pgpool-II 4.2, + the logging collector process has been implemented. + When installed using the RPM packages, the logging + collector process () + is enabled by default. Log files are output to + /var/log/pgpool_log by default. + Configure the logging related configuration parameters + as needed to meet your requirements. log_destination = 'stderr' @@ -1148,24 +1176,18 @@ log_directory = '/var/log/pgpool_log' log_filename = 'pgpool-%a.log' log_truncate_on_rotation = on log_rotation_age = 1d -log_rotation_size = 10MB - - - Create the log directory on all servers. - - -[all servers]# mkdir /var/log/pgpool_log/ -[all servers]# chown postgres:postgres /var/log/pgpool_log/ - The configuration of pgpool.conf on server1 is completed. - Copy the pgpool.conf to other - Pgpool-II nodes (server2 and server3). + The configurations of Pgpool-II on server1 are completed. + Finally, copy the configuration files to server2 + and server3. -[server1]# scp -p /etc/pgpool-II/pgpool.conf root@server2:/etc/pgpool-II/pgpool.conf -[server1]# scp -p /etc/pgpool-II/pgpool.conf root@server3:/etc/pgpool-II/pgpool.conf +[root@server1 ~]# scp -p /etc/pgpool-II/{*.conf,*.sh,pool_passwd} server2:/etc/pgpool-II/ +[root@server1 ~]# ssh server2 "chown postgres:postgres /etc/pgpool-II/{*.conf,*.sh,pool_passwd}" +[root@server1 ~]# scp -p /etc/pgpool-II/{*.conf,*.sh,pool_passwd} server3:/etc/pgpool-II/ +[root@server1 ~]# ssh server3 "chown postgres:postgres /etc/pgpool-II/{*.conf,*.sh,pool_passwd}" @@ -1192,8 +1214,7 @@ log_rotation_size = 10MB using the following command. -[server1]# su - postgres -[server1]$ /usr/pgsql-16/bin/pg_ctl start -D $PGDATA +[root@server1 ~]# su - postgres -c "/usr/pgsql-17/bin/pg_ctl start" Start Pgpool-II on server1, @@ -1299,9 +1320,9 @@ server3:9999 Linux server3 server3 9999 9000 7 STANDBY 0 MEMBER # running as STA Pgpool-II service. -[server1]# systemctl stop pgpool.service +[root@server1 ~]# systemctl stop pgpool.service -[server1]# pcp_watchdog_info -p 9898 -h 192.168.100.50 -U pgpool -W +[root@server1 ~]# pcp_watchdog_info -p 9898 -h 192.168.100.50 -U pgpool -W Password: 3 3 YES server2:9999 Linux server2 server2 @@ -1315,9 +1336,9 @@ server3:9999 Linux server3 server3 9999 9000 7 STANDBY 0 MEMBER # server3 is r as a STANDBY. -[server1]# systemctl start pgpool.service +[root@server1 ~]# systemctl start pgpool.service -[server1]# pcp_watchdog_info -p 9898 -h 192.168.100.50 -U pgpool -W +[root@server1 ~]# pcp_watchdog_info -p 9898 -h 192.168.100.50 -U pgpool -W Password: 3 3 YES server2:9999 Linux server2 server2 @@ -1335,7 +1356,7 @@ server3:9999 Linux server3 server3 9999 9000 7 STANDBY 0 MEMBER and verify the backend information. -# psql -h 192.168.100.50 -p 9999 -U pgpool postgres -c "show pool_nodes" +[any server]# psql -h 192.168.100.50 -p 9999 -U pgpool postgres -c "show pool_nodes" Password for user pgpool: node_id | hostname | port | status | pg_status | lb_weight | role | pg_role | select_cnt | load_balance_node | replication_delay | replication_state | replication_sync_state | last_status_change ---------+----------+------+--------+-----------+-----------+---------+---------+------------+-------------------+-------------------+-------------------+------------------------+--------------------- @@ -1350,7 +1371,7 @@ Password for user pgpool: automatically. -[server1]$ pg_ctl -D /var/lib/pgsql/16/data -m immediate stop +[root@server1 ~]# su - postgres -c "/usr/pgsql-17/bin/pg_ctl -m immediate stop" After stopping PostgreSQL on @@ -1375,17 +1396,17 @@ Password for user pgpool: -[server3]# psql -h server3 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()" +[any server]# psql -h server3 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()" pg_is_in_recovery ------------------- t -[server2]# psql -h server2 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()" +[any server]# psql -h server2 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()" pg_is_in_recovery ------------------- f -[server2]# psql -h server2 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x +[any server]# psql -h server2 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x -[ RECORD 1 ]----+------------------------------ pid | 7198 usesysid | 16385 -- 2.39.5