<sect1 id="example-cluster">
<title><productname>Pgpool-II</productname> + Watchdogの構築の例</title>
<para>
- ここでは、ストリーミングレプリケーション構成の<productname>PostgreSQL</productname>を
- <productname>Pgpool-II</productname>で管理するシステムの構成例を示します。
- この例では、3台の<productname>Pgpool-II</productname>を使って<productname>PostgreSQL</productname>を
- 管理し、単一障害点やスプリットブレインの起きない堅牢なクラスタを運用することが可能です。
+ ここでは、ストリーミングレプリケーション構成の<productname>PostgreSQL</productname>を<productname>Pgpool-II</productname>で管理するシステムの構成例を示します。
+ この設定例では、3台の<productname>Pgpool-II</productname>を使って<productname>PostgreSQL</productname>(プライマリ1台、スタンバイ2台)を管理し、単一障害点やスプリットブレインの起きない堅牢なクラスタを運用することが可能です。
</para>
<para>
- この設定例では<productname>PostgreSQL</productname> 15を使っていますが、
+ この設定例では<productname>PostgreSQL</productname> 16を使っていますが、
各種スクリプトは<productname>PostgreSQL</productname> 10以降での動作確認を行っています。
</para>
<sect2 id="example-cluster-requirement">
<sect2 id="example-cluster-structure">
<title>全体構成</title>
<para>
- 今回は、Linuxサーバを3台用意し、それぞれのホスト名は 「server1」、「server2」、「server3」 とします。
- 使用するOSはすべてCentOS 7.9とします。
+ 今回は、Linuxサーバを3台用意し、それぞれのホスト名は<literal>server1</literal>、<literal>server2</literal>、<literal>server3</literal>とします。
+ 使用するOSはすべてRocky Linux 8とします。
それぞれのサーバに<productname>PostgreSQL</productname>と<productname>Pgpool-II</productname>をインストールします。
3台の<productname>PostgreSQL</productname>がストリーミングレプリケーション構成になります。全体構成図は以下の通りです。
</para>
</para>
<note>
<para>
- 「アクティブ」「スタンバイ」「Primary」「Standby」といった役割は固定されているものではなく、運用と共に変化することがあります。
+ 「Leader」「Standby」「Primary」「Standby」といった役割は固定されているものではなく、運用と共に変化することがあります。
</para>
</note>
<tbody>
<row>
<entry>server1</entry>
- <entry>192.168.137.101</entry>
- <entry morerows="2">192.168.137.150</entry>
+ <entry>192.168.100.51</entry>
+ <entry morerows="2">192.168.100.50</entry>
</row>
<row>
<entry>server2</entry>
- <entry>192.168.137.102</entry>
+ <entry>192.168.100.52</entry>
</row>
<row>
<entry>server3</entry>
- <entry>192.168.137.103</entry>
+ <entry>192.168.100.53</entry>
</row>
</tbody>
</tgroup>
<tbody>
<row>
<entry>PostgreSQLバージョン</entry>
- <entry>15.0</entry>
+ <entry>16.0</entry>
<entry>-</entry>
</row>
<row>
</row>
<row>
<entry>$PGDATA</entry>
- <entry>/var/lib/pgsql/15/data</entry>
+ <entry>/var/lib/pgsql/16/data</entry>
<entry>-</entry>
</row>
<row>
<row>
<entry>レプリケーションスロット</entry>
<entry>有効</entry>
+ <entry>本設定例では、フェイルオーバやオンラインリカバリの時に実行されるスクリプトで、自動的にレプリケーションスロットを削除/作成しています。
+これらのスクリプトでは、backend_hostnameXに指定したホスト名をレプリケーションスロット名として使用しています。
+スクリプトの詳細については<xref linkend="example-cluster-table-sample-scripts">を参照してください。</entry>
+ </row>
+ <row>
+ <entry>同期/非同期レプリケーション</entry>
+ <entry>非同期</entry>
<entry>-</entry>
</row>
</tbody>
<tbody>
<row>
<entry>Pgpool-IIバージョン</entry>
- <entry>4.3.0</entry>
+ <entry>4.5.0</entry>
<entry>-</entry>
</row>
<row>
<tbody>
<row>
<entry morerows='1'>自動フェイルオーバ</entry>
- <entry><ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/failover.sh.sample;hb=refs/heads/V4_4_STABLE">/etc/pgpool-II/sample_scripts/failover.sh.sample</ulink></entry>
+ <entry><ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/failover.sh.sample;hb=refs/heads/V4_5_STABLE">/etc/pgpool-II/sample_scripts/failover.sh.sample</ulink></entry>
<entry>フェイルオーバを実行するスクリプト。<xref linkend="GUC-FAILOVER-COMMAND">で使用します。</entry>
</row>
<row>
- <entry><ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/follow_primary.sh.sample;hb=refs/heads/V4_4_STABLE">/etc/pgpool-II/sample_scripts/follow_primary.sh.sample</ulink></entry>
- <entry>フェイルオーバ後、新しいプライマリサーバとスタンバイサーバを同期させるスクリプト。<xref linkend="GUC-FOLLOW-PRIMARY-COMMAND">で使用します。</entry>
+ <entry><ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/follow_primary.sh.sample;hb=refs/heads/V4_5_STABLE">/etc/pgpool-II/sample_scripts/follow_primary.sh.sample</ulink></entry>
+ <entry>上記フェイルオーバスクリプトが実行された後に、新しいプライマリサーバとスタンバイサーバを同期させるスクリプト。<xref linkend="GUC-FOLLOW-PRIMARY-COMMAND">で使用します。 PostgreSQLサーバが2台の場合はこのスクリプトの設定は不要です。</entry>
</row>
<row>
<entry morerows='1'>オンラインリカバリ</entry>
- <entry><ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/recovery_1st_stage.sample;hb=refs/heads/V4_4_STABLE">/etc/pgpool-II/sample_scripts/recovery_1st_stage.sample</ulink></entry>
+ <entry><ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/recovery_1st_stage.sample;hb=refs/heads/V4_5_STABLE">/etc/pgpool-II/sample_scripts/recovery_1st_stage.sample</ulink></entry>
<entry>スタンバイサーバをリカバリするスクリプト。<xref linkend="GUC-RECOVERY-1ST-STAGE-COMMAND">で使用します。</entry>
</row>
<row>
- <entry><ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/pgpool_remote_start.sample;hb=refs/heads/V4_4_STABLE">/etc/pgpool-II/sample_scripts/pgpool_remote_start.sample</ulink></entry>
- <entry><xref linkend="GUC-RECOVERY-1ST-STAGE-COMMAND"> 後に、スタンバイノードを起動させるスクリプト。</entry>
+ <entry><ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/pgpool_remote_start.sample;hb=refs/heads/V4_5_STABLE">/etc/pgpool-II/sample_scripts/pgpool_remote_start.sample</ulink></entry>
+ <entry>上記<xref linkend="GUC-RECOVERY-1ST-STAGE-COMMAND">が実行された後に、スタンバイノードを起動させるスクリプト。</entry>
</row>
<row>
<entry morerows='1'>Watchdog</entry>
- <entry><ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/escalation.sh.sample;hb=refs/heads/V4_4_STABLE">/etc/pgpool-II/sample_scripts/escalation.sh.sample</ulink></entry>
+ <entry><ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/escalation.sh.sample;hb=refs/heads/V4_5_STABLE">/etc/pgpool-II/sample_scripts/escalation.sh.sample</ulink></entry>
<entry>
- Pgpool-IIのアクティブ/スタンバイ切り替え時に新アクティブ機以外で起動している
- 仮想IPを停止するスクリプト。<xref linkend="guc-wd-escalation-command">で使用します。
+ 任意の設定。Pgpool-IIのリーダー/スタンバイ切り替え時に、旧Watchdogリーダープロセスの異常終了によって旧Watchdogリーダーで仮想IPが起動したまま、新しいリーダーノードで仮想IPが起動されることを防ぐために、新しいリーダー以外で起動している仮想IPを停止するスクリプト。<xref linkend="guc-wd-escalation-command">で使用します。
</entry>
</row>
</tbody>
<productname>PostgreSQL</productname>のインストールは<productname>PostgreSQL</productname>コミュニティのリポジトリを使います。
</para>
<programlisting>
-[全サーバ]# yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
-[全サーバ]# yum install -y postgresql15-server
+[全サーバ]# dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
+[全サーバ]# dnf -qy module disable postgresql
+[全サーバ]# dnf install -y postgresql16-server
</programlisting>
<para>
exclude=pgpool*
+[pgdg16]
+...
+exclude=pgpool*
+
[pgdg15]
...
exclude=pgpool*
[pgdg11]
...
-exclude=pgpool*
-
-[pgdg10]
-...
exclude=pgpool*
</programlisting>
<productname>Pgpool-II</productname>をインストールします。
</para>
<programlisting>
-[全サーバ]# yum install -y https://www.pgpool.net/yum/rpms/4.4/redhat/rhel-7-x86_64/pgpool-II-release-4.4-1.noarch.rpm
-[全サーバ]# yum install -y pgpool-II-pg15-*
+[全サーバ]# 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-*
</programlisting>
</sect2>
<para>
Pgpool-IIの設定の前に、以下の設定を行ってください。
</para>
- <itemizedlist>
- <listitem>
+
+ <sect3 id="example-cluster-before-starting-primary">
+ <title>プライマリのセットアップ</title>
<para>
- <productname>PostgreSQL</productname>プライマリサーバのみでストリーミングレプリケーションの設定を行います。
- スタンバイサーバの設定は、プライマリが起動した状態で、<productname>Pgpool-II</productname>の
- オンラインリカバリ機能を使って行うため不要です。この設定の例ではアーカイブリカバリを行うように設定します。
+ <productname>PostgreSQL</productname>プライマリサーバでストリーミングレプリケーションの設定を行います。
+ この設定の例ではアーカイブリカバリを行うように設定します。
</para>
<para>
- まず、すべてのサーバにて<acronym>WAL</acronym>を格納するディレクトリ<filename>/var/lib/pgsql/archivedir</filename>を
- 事前に作成します。この設定例では、プライマリサーバのみで<acronym>WAL</acronym>アーカイブをローカルで実施します。
+ まず、すべてのサーバにて<acronym>WAL</acronym>を格納するディレクトリ<filename>/var/lib/pgsql/archivedir</filename>を事前に作成します。この設定例では、プライマリサーバのみで<acronym>WAL</acronym>アーカイブをローカルで実施します。
</para>
<programlisting>
[全サーバ]# su - postgres
</programlisting>
<para>
- プライマリサーバの<productname>PostgreSQL</productname>を初期化します。
+ <literal>server1</literal>で<productname>PostgreSQL</productname>プライマリサーバの初期化を行います。
</para>
<programlisting>
[server1]# su - postgres
-[server1]$ /usr/pgsql-15/bin/initdb -D $PGDATA
+[server1]$ /usr/pgsql-16/bin/initdb -D $PGDATA
</programlisting>
<para>
- 次ã\81«<literal>server1</literal>ã\81«ã\81¦ã\80\81設定ファイル<filename>$PGDATA/postgresql.conf</filename>を以下のように編集します。
+ 次ã\81«<literal>server1</literal>ã\81§設定ファイル<filename>$PGDATA/postgresql.conf</filename>を以下のように編集します。
<application>pg_rewind</application>を使うために<varname>wal_log_hints</varname>を有効にしておきます。
プライマリが後でスタンバイになる可能性があるので、<literal>hot_standby = on</literal>にしておきます。
</para>
hot_standby = on
wal_log_hints = on
</programlisting>
- </listitem>
+ <para>
+ <literal>server1</literal>でPostgreSQLプライマリを起動します。
+ </para>
+ <programlisting>
+[server1]# su - postgres
+[server1]$ /usr/pgsql-16/bin/pg_ctl start -D $PGDATA
+ </programlisting>
+ </sect3>
- <listitem>
+ <sect3 id="example-cluster-before-starting-standby">
+ <title>スタンバイのセットアップ</title>
+ <para>
+ スタンバイサーバをセットアップする方法としては、次のような複数の方法があります。
+ <itemizedlist>
+ <listitem>
+ <para>
+ スタンバイで<command>pg_basebackup</command>を実行して、プライマリのデータディレクトリのバックアップを生成します。(この方法を利用する場合は、手動でレプリケーションスロットを作成してください。)
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <productname>Pgpool-II</productname>のオンラインリカバリ機能(<xref linkend="runtime-online-recovery">)を使用して、スタンバイサーバを自動的にセットアップします。
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ この設定例では、<productname>Pgpool-II</productname>の構成が完了した後に、<xref linkend="example-cluster-verify-standby">で<productname>Pgpool-II</productname>のオンラインリカバリを使用してスタンバイサーバをセットアップします。
+ </para>
+ </sect3>
+
+ <sect3 id="example-cluster-before-starting-users">
+ <title>PostgreSQLユーザの作成</title>
<para>
- <productname>Pgpool-II</productname>のヘルスチェック及びレプリケーションの
- 遅延チェックで<productname>PostgreSQL</productname>のユーザを設定する必要があります。
- セキュリティ上の理由で、この設定例ではスーパーユーザを使わないようにします。
- <productname>Pgpool-II</productname>のレプリケーションの遅延チェックとヘルスチェック用の
- ユーザ<literal>pgpool</literal>を作成します。
- また、<productname>PostgreSQL</productname>プライマリサーバ<literal>server1</literal>で
- レプリケーション専用ユーザ<literal>repl</literal>を作成します。
- <productname>Pgpool-II</productname> 4.0から<acronym>SCRAM</acronym>認証を利用できるようになりました。
+ <productname>Pgpool-II</productname>が<productname>PostgreSQL</productname>のユーザを使用してPostgreSQLへ接続し、ヘルスチェックやレプリケーション遅延チェックを行います。
+ セキュリティ上の理由で、この設定例ではスーパーユーザを使わず、レプリケーション遅延チェックとヘルスチェック専用のユーザ<literal>pgpool</literal>を作成します。
+ また、レプリケーション専用のユーザ<literal>repl</literal>を作成します。
+ オンラインリカバリ機能を利用するにはスーパーユーザ権限が必要なので、ここでは<literal>postgres</literal>ユーザを使用します。
+ </para>
+ <para>
+ <productname>Pgpool-II</productname> 4.0から<acronym>scram-sha-256</acronym>認証が利用できるようになりました。
この設定例では、<acronym>scram-sha-256</acronym>認証方式を利用します。
まず、<literal>password_encryption = 'scram-sha-256'</literal>に変更してから、ユーザを登録します。
</para>
<row>
<entry>postgres</entry>
<entry>postgres</entry>
- <entry>ã\82ªã\83³ã\83©ã\82¤ã\83³ã\83ªã\82«ã\83\90ã\83ªã\82\92å®\9fè¡\8cã\81\99ã\82\8bユーザ</entry>
+ <entry>ã\82ªã\83³ã\83©ã\82¤ã\83³ã\83ªã\82«ã\83\90ã\83ªã\81®å®\9fè¡\8cユーザ</entry>
</row>
</tbody>
</tgroup>
</programlisting>
<para>
- <xref linkend="SQL-SHOW-POOL-NODES">コマンドで<literal>replication_stat</literal>カラムと
- <literal>replication_sync_state</literal>カラムを表示するには、<literal>pgpool</literal>ユーザは
- <productname>PostgreSQL</productname>のスーパーユーザーであるか、<literal>pg_monitor</literal>グループ
- に所属する必要があります(<productname>Pgpool-II</productname> 4.1以降)。
+ <xref linkend="SQL-SHOW-POOL-NODES">コマンドで<literal>replication_stat</literal>カラムと<literal>replication_sync_state</literal>カラムを表示するには、<literal>pgpool</literal>ユーザは<productname>PostgreSQL</productname>のスーパーユーザであるか、<literal>pg_monitor</literal>グループに所属する必要があります(<productname>Pgpool-II</productname> 4.1以降)。
以下のコマンドで<literal>pgpool</literal>ユーザをそのグループに所属させます。
</para>
<programlisting>
<note>
<para>
- <xref linkend="guc-detach-false-primary">(<productname>Pgpool-II</productname> 4.1以降)を
- 利用する予定がある場合、"pgpool" ロールは<productname>PostgreSQL</productname>の
- スーパーユーザーであるか、<literal>pg_monitor</literal>グループに所属する必要があります。
+ <xref linkend="guc-detach-false-primary">(<productname>Pgpool-II</productname> 4.1以降)を利用する予定がある場合、"pgpool" ロールは<productname>PostgreSQL</productname>のスーパーユーザであるか、<literal>pg_monitor</literal>グループに所属する必要があります。
</para>
</note>
<para>
- <productname>Pgpool-II</productname>サーバと<productname>PostgreSQL</productname>バックエンドサーバが
- 同じサブネットワークにあることを想定し、各ユーザが<acronym>scram-sha-256</acronym>認証方式で接続できるように、
- <filename>pg_hba.conf</filename>を編集しておきます。
+ <productname>Pgpool-II</productname>サーバと<productname>PostgreSQL</productname>バックエンドサーバが同じサブネットワークにあることを想定し、各ユーザが<acronym>scram-sha-256</acronym>認証方式で接続するように、<filename>pg_hba.conf</filename>を編集しておきます。
</para>
<programlisting>
-host all all samenet scram-sha-256
+host all pgpool samenet scram-sha-256
+host all postgres samenet scram-sha-256
host replication all samenet scram-sha-256
</programlisting>
- </listitem>
+ </sect3>
- <listitem>
+ <sect3 id="example-cluster-before-starting-ssh">
+ <title>SSH公開鍵認証の設定</title>
<para>
- 自動フェイルオーバ、オンラインリカバリ機能を利用するには、すべての<productname>Pgpool-II</productname>ノード間で<productname>Pgpool-II</productname>の起動ユーザ(デフォルトは<literal>postgres</literal>ユーザ。Pgpool-II 4.0以前、デフォルトは<literal>root</literal>ユーザ)および<productname>PostgreSQL</productname>の起動ユーザ(デフォルトは<literal>postgres</literal>ユーザ)として双方向にSSH公開鍵認証(パスワードなし)で接続できるように設定する必要があります。
+ 自動フェイルオーバ、オンラインリカバリ機能を利用するには、すべての<productname>Pgpool-II</productname>ノード間で<literal>postgres</literal>ユーザ(Pgpool-IIのデフォルトの起動ユーザ。Pgpool-II 4.0以前、デフォルトの起動ユーザは<literal>root</literal>)として双方向にSSH公開鍵認証(パスワードなし)で接続できるように設定する必要があります。
</para>
<para>
- まず、全サーバで<literal>postgres</literal>ユーザのパスワードを設定します。
</para>
- <programlisting>
-[全サーバ]# passwd postgres
- </programlisting>
<para>
- 全サーバで以下のコマンドを実行し、SSH公開鍵の登録を行います。
+ まず、全サーバで以下のコマンドを実行し、SSH鍵ファイルを作成します。
この設定例では生成される鍵ファイル名は<literal>id_rsa_pgpool</literal>とします。
</para>
<programlisting>
-[全サーバ]# mkdir ~/.ssh
-[全サーバ]# chmod 700 ~/.ssh
-[全サーバ]# cd ~/.ssh
-[全サーバ]# ssh-keygen -t rsa -f id_rsa_pgpool
-[全サーバ]# ssh-copy-id -i id_rsa_pgpool.pub postgres@server1
-[全サーバ]# ssh-copy-id -i id_rsa_pgpool.pub postgres@server2
-[全サーバ]# ssh-copy-id -i id_rsa_pgpool.pub postgres@server3
-
[全サーバ]# su - postgres
[全サーバ]$ mkdir ~/.ssh
[全サーバ]$ chmod 700 ~/.ssh
[全サーバ]$ cd ~/.ssh
[全サーバ]$ ssh-keygen -t rsa -f id_rsa_pgpool
-[全サーバ]$ ssh-copy-id -i id_rsa_pgpool.pub postgres@server1
-[全サーバ]$ ssh-copy-id -i id_rsa_pgpool.pub postgres@server2
-[全サーバ]$ ssh-copy-id -i id_rsa_pgpool.pub postgres@server3
</programlisting>
<para>
- 設定後、<productname>Pgpool-II</productname>の起動ユーザでおよび<productname>PostgreSQL</productname>の起動ユーザで<command>ssh postgres@serverX -i ~/.ssh/id_rsa_pgpool</command>コマンドを実行し、パスワード入力せずログインできることを確認してください。
+ 次に、公開鍵<literal>id_rsa_pgpool.pub</literal>を各サーバの<filename>/var/lib/pgsql/.ssh/authorized_keys</filename>ファイルに追加します。
+ </para>
+ <para>
+ 設定後、<literal>postgres</literal>ユーザで<command>ssh postgres@serverX -i ~/.ssh/id_rsa_pgpool</command>コマンドを実行し、パスワードなしでログインできることを確認してください。
</para>
<note>
</itemizedlist>
<programlisting>
PubkeyAuthentication yes
- </programlisting>
- <itemizedlist>
- <listitem>
- <para>
- SSHのパスワード認証を無効化している場合は、ssh-copy-idの実行に失敗するので、一時的に<filename>/etc/ssh/sshd_config</filename>内のPasswordAuthenticationをyesに変更するなどしてください。
- </para>
- </listitem>
- </itemizedlist>
- <programlisting>
-PasswordAuthentication yes
</programlisting>
<itemizedlist>
<listitem>
</programlisting>
</para>
</note>
- </listitem>
+ </sect3>
- <listitem>
+ <sect3 id="example-cluster-before-starting-pgpass">
+ <title>.pgpassの作成</title>
<para>
- <literal>repl</literal>ユーザのパスワード入力なしで、ストリーミングレプリケーションと
- オンラインリカバリを行うために、または<literal>postgres</literal>ユーザで
- <application>pg_rewind</application>を実行するために、すべてのサーバにて
- <literal>postgres</literal>ユーザのホームディレクトリ<filename>/var/lib/pgsql</filename>に
- <filename>.pgpass</filename>を作成・配置し、パーミッションを 600 に設定しておきます。
+ パスワード入力なしで、ストリーミングレプリケーションや<application>pg_rewind</application>を実行するために、すべてのサーバで<literal>postgres</literal>ユーザのホームディレクトリ<filename>/var/lib/pgsql</filename>に<filename>.pgpass</filename>を作成し、パーミッションを600に設定しておきます。
</para>
<programlisting>
[全サーバ]# su - postgres
server3:5432:postgres:postgres:<postgresユーザのパスワード>
[全サーバ]$ chmod 600 /var/lib/pgsql/.pgpass
</programlisting>
- </listitem>
+ </sect3>
- <listitem>
- <para>
- <productname>Pgpool-II</productname>や<productname>PostgreSQL</productname>に接続する際には、
- ファイアーウォールによって目的のポートが開けられていなければなりません。
- <systemitem>CentOS/RHEL7</systemitem>の場合、以下のように設定します。
- </para>
- <programlisting>
+ <sect3 id="example-cluster-before-starting-firewall">
+ <title>firewallの設定</title>
+ <para>
+ <productname>Pgpool-II</productname>や<productname>PostgreSQL</productname>に接続する際には、ファイアーウォールによって目的のポートが開けられていなければなりません。
+ <systemitem>Rocky Linux 8/RHEL 8</systemitem>の場合、以下のように設定します。
+ </para>
+ <programlisting>
[全サーバ]# 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
- </programlisting>
- </listitem>
- </itemizedlist>
+ </programlisting>
+ </sect3>
</sect2>
<sect2 id="example-cluster-pgpool-node-id">
<title>pgpool_node_idファイルの作成</title>
<para>
- <productname>Pgpool-II</productname> 4.2以é\99\8dã\80\81ã\81\99ã\81¹ã\81¦ã\81®è¨å®\9aã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\83¼ã\81\8cã\81\99ã\81¹ã\81¦ã\81®ã\83\9bã\82¹ã\83\88ã\81§å\90\8cä¸\80ã\81«ã\81ªã\82\8aã\81¾ã\81\97ã\81\9fã\80\82
+ <productname>Pgpool-II</productname> 4.2以降、すべての設定パラメータがすべてのホストで同一になりました。
<application>Watchdog</application>機能が有効になっている場合、どの設定がどのホストであるかを区別するには、
<filename>pgpool_node_id</filename>ファイルの設定が必要になります。
<filename>pgpool_node_id</filename>ファイルを作成し、
</itemizedlist>
</sect2>
+ <sect2 id="pcp-authentication">
+ <title>PCP接続認証の設定</title>
+ <para>
+ PCPコマンドを使用するには、<literal>username:encryptedpassword</literal>形式のPCPユーザ名とmd5暗号化パスワードを<filename>pcp.conf</filename>に登録する必要があります。
+ </para>
+ <para>
+ この例では、PCPユーザ名を<literal>pgpool</literal>、パスワードを<literal>pgpool_password</literal>に設定します。
+ 以下のように、pg_md5を使用して、pgpoolユーザの暗号化されたパスワードエントリを作成します。
+ </para>
+ <programlisting>
+[全サーバ]# echo 'pgpool:'`pg_md5 pgpool_password` >> /etc/pgpool-II/pcp.conf
+
+[全サーバ]# cat /etc/pgpool-II/pcp.conf
+# USERID:MD5PASSWD
+pgpool:4aa0cb9673e84b06d4c8a848c80eb5d0
+ </programlisting>
+ </sect2>
+
<sect2 id="example-cluster-pgpool-config">
<title><productname>Pgpool-II</productname>の設定</title>
<para>
<sect3 id="example-cluster-pgpool-config-listen-addresses">
<title>listen_addresses</title>
<para>
- <productname>Pgpool-II</productname>が全てのIPアドレスから接続を受け付けるように、
- <xref linkend="GUC-LISTEN-ADDRESSES">パラメータに<literal>'*'</literal>を設定します。
+ <productname>Pgpool-II</productname>およびPCPが全てのIPアドレスから接続を受け付けるように、以下のパラメータを<literal>'*'</literal>に設定します。
</para>
<programlisting>
listen_addresses = '*'
+pcp_listen_addresses = '*'
</programlisting>
</sect3>
backend_hostname0 = 'server1'
backend_port0 = 5432
backend_weight0 = 1
-backend_data_directory0 = '/var/lib/pgsql/15/data'
+backend_data_directory0 = '/var/lib/pgsql/16/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = 'server2'
backend_port1 = 5432
backend_weight1 = 1
-backend_data_directory1 = '/var/lib/pgsql/15/data'
+backend_data_directory1 = '/var/lib/pgsql/16/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_hostname2 = 'server3'
backend_port2 = 5432
backend_weight2 = 1
-backend_data_directory2 = '/var/lib/pgsql/15/data'
+backend_data_directory2 = '/var/lib/pgsql/16/data'
backend_flag2 = 'ALLOW_TO_FAILOVER'
</programlisting>
<para>
<xref linkend="SQL-SHOW-POOL-NODES">コマンドで<productname>Pgpool-II</productname> 4.1で追加された
<literal>replication_stat</literal>カラムと<literal>replication_sync_state</literal>カラムを表示するには、
- <xref linkend="GUC-BACKEND-APPLICATION-NAME">パラメータを設定する必要があります。
+ <xref linkend="GUC-BACKEND-APPLICATION-NAME">パラメータを設定する必要があります(Pgpool-II 4.1以降)。
ここではそれぞれのホスト名を設定します。
+ <varname>backend_application_nameX</varname>に設定された値が、<varname>primary_conninfo</varname>の<varname>application_name</varname>に設定された値と一致していることを確認してください。
<programlisting>
...
backend_application_name0 = 'server1'
<para>
それぞれの実行スクリプトの引数は、それぞれ実行時に<productname>Pgpool-II</productname>
によってバックエンドの具体的な情報に置き換えられます。
- 各引数の意味は<xref linkend="GUC-FAILOVER-COMMAND">をご参照ください。
+ å\90\84å¼\95æ\95°ã\81®æ\84\8få\91³ã\81¯<xref linkend="GUC-FAILOVER-COMMAND">ã\81\8aã\82\88ã\81³<xref linkend="GUC-FOLLOW-PRIMARY-COMMAND">ã\82\92ã\81\94å\8f\82ç\85§ã\81\8fã\81 ã\81\95ã\81\84ã\80\82
</para>
<programlisting>
failover_command = '/etc/pgpool-II/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'
</para>
</note>
<para>
- サンプルスクリプト<ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/failover.sh.sample;hb=refs/heads/V4_4_STABLE">failover.sh</ulink>及び
- <ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/follow_primary.sh.sample;hb=refs/heads/V4_4_STABLE">follow_primary.sh</ulink>は
+ サンプルスクリプト<ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/failover.sh.sample;hb=refs/heads/V4_5_STABLE">failover.sh</ulink>及び
+ <ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/follow_primary.sh.sample;hb=refs/heads/V4_5_STABLE">follow_primary.sh</ulink>は
<filename>/etc/pgpool-II/</filename>配下にインストールされていますので、これらのファイルをコピーして作成します。
</para>
<programlisting>
<programlisting>
[全サーバ]# vi /etc/pgpool-II/failover.sh
...
-PGHOME=/usr/pgsql-15
+PGHOME=/usr/pgsql-16
...
[全サーバ]# vi /etc/pgpool-II/follow_primary.sh
...
-PGHOME=/usr/pgsql-15
+PGHOME=/usr/pgsql-16
...
</programlisting>
<para>
- <literal>PCP</literal>コマンドを使用するにはユーザ認証が必要になるので、
- ユーザ名と<literal>md5</literal>ハッシュに変換されたパスワードを
- "<literal>username:encrypted password</literal>"の形式で
- <filename>pcp.conf</filename>ファイルに設定します。
- </para>
- <para>
- <filename>follow_primary.sh</filename>で<literal>pgpool</literal>ユーザが
- <varname>PCP_USER</varname>に指定されている場合、
+ <filename>follow_primary.sh</filename>で<varname>PCP_USER</varname>に指定されているユーザが<filename>pcp.conf</filename>に登録されていることを確認してください。
+ この設定例では、前述の<xref linkend="PCP-AUTHENTICATION">セクションですでに登録済みです。
</para>
<programlisting>
# cat /etc/pgpool-II/follow_primary.sh
...
</programlisting>
<para>
- 以下のように<xref linkend="PG-MD5">コマンドを利用し、
- ハッシュ化された<literal>pgpool</literal>ユーザのパスワードエントリを<filename>/etc/pgpool-II/pcp.conf</filename>に追加します。
+ 前述の<filename>follow_primary.sh</filename>のスクリプトでパスワード入力なしで<literal>PCP</literal>コマンドを実行できるように、すべてのサーバで<productname>Pgpool-II</productname>の起動ユーザのホームディレクトリに<filename>.pcppass</filename>を作成します。
</para>
- <programlisting>
-[全サーバ]# echo 'pgpool:'`pg_md5 PCPコマンドパスワード` >> /etc/pgpool-II/pcp.conf
- </programlisting>
<para>
- 前述の<filename>follow_primary.sh</filename>のスクリプトでパスワード入力なしで
- <literal>PCP</literal>コマンドを実行できるように、すべてのサーバで
- <productname>Pgpool-II</productname>の起動ユーザのホームディレクトリに<filename>.pcppass</filename>を作成します。
+ この例では、PCPユーザが<literal>pgpool</literal>で、パスワードが<literal>pgpool_password</literal>とします。
</para>
<programlisting>
[全サーバ]# su - postgres
-[全サーバ]$ echo 'localhost:9898:pgpool:<pgpool user password>' > ~/.pcppass
+[全サーバ]$ echo 'localhost:9898:pgpool:pgpool_password' > ~/.pcppass
[全サーバ]$ chmod 600 ~/.pcppass
</programlisting>
<note>
<sect3 id="example-cluster-pgpool-config-online-recovery">
<title>オンラインリカバリの設定</title>
<para>
- 続いて、オンラインリカバリを行うための<productname>PostgreSQL</productname>のユーザ名
- 及びオンラインリカバリ時に呼び出されるコマンド<command>recovery_1st_stage</command>を設定します。
+ 続いて、オンラインリカバリを実行する<productname>PostgreSQL</productname>ユーザ及びオンラインリカバリ時に呼び出されるスクリプトを設定します。
オンラインリカバリで実行される<function>pgpool_recovery</function>関数は
- <productname>PostgreSQL</productname>のスーパーユーザ権限が必要なため、
- <varname>recovery_user</varname>に<emphasis>スーパーユーザ</emphasis>を指定しなければなりません。
+ <productname>PostgreSQL</productname>のスーパーユーザ権限が必要なため、<varname>recovery_user</varname>に<emphasis>スーパーユーザ</emphasis>を指定しなければなりません。
ここでは、<literal>postgres</literal>ユーザを指定します。
</para>
+ <para>
+ この設定例では<xref linkend="GUC-RECOVERY-PASSWORD">を空のままにし、<xref linkend="GUC-POOL-PASSWD">にエントリを作成します。<xref linkend="GUC-POOL-PASSWD">にエントリを作成する方法については、<xref linkend="example-cluster-pgpool-config-auth">を参照してください。
+ </para>
<programlisting>
recovery_user = 'postgres'
recovery_password = ''
-
recovery_1st_stage_command = 'recovery_1st_stage'
</programlisting>
<para>
- オンラインリカバリ用のサンプルスクリプト<ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/recovery_1st_stage.sample;hb=refs/heads/V4_4_STABLE">recovery_1st_stage</ulink>
- 及び<ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/pgpool_remote_start.sample;hb=refs/heads/V4_4_STABLE">pgpool_remote_start</ulink>は
+ オンラインリカバリ用のサンプルスクリプト<ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/recovery_1st_stage.sample;hb=refs/heads/V4_5_STABLE">recovery_1st_stage</ulink>
+ 及び<ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/pgpool_remote_start.sample;hb=refs/heads/V4_5_STABLE">pgpool_remote_start</ulink>は
<filename>/etc/pgpool-II/</filename>配下にインストールされていますので、
これらのファイルをプライマリサーバ(<literal>server1</literal>)のデータベースクラスタ配下に配置します。
</para>
<programlisting>
-[server1]# cp -p /etc/pgpool-II/sample_scripts/recovery_1st_stage.sample /var/lib/pgsql/15/data/recovery_1st_stage
-[server1]# cp -p /etc/pgpool-II/sample_scripts/pgpool_remote_start.sample /var/lib/pgsql/15/data/pgpool_remote_start
-[server1]# chown postgres:postgres /var/lib/pgsql/15/data/{recovery_1st_stage,pgpool_remote_start}
+[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}
</programlisting>
<para>
基本的には<emphasis>PGHOME</emphasis>を環境に合わせて変更すれば、動作します。
</para>
<programlisting>
-[server1]# vi /var/lib/pgsql/15/data/recovery_1st_stage
+[server1]# vi /var/lib/pgsql/16/data/recovery_1st_stage
...
-PGHOME=/usr/pgsql-15
+PGHOME=/usr/pgsql-16
...
-[server1]# vi /var/lib/pgsql/15/data/pgpool_remote_start
+[server1]# vi /var/lib/pgsql/16/data/pgpool_remote_start
...
-PGHOME=/usr/pgsql-15
+PGHOME=/usr/pgsql-16
...
</programlisting>
<para>
<filename>pool_hba.conf</filename>のフォーマットは<productname>PostgreSQL</productname>の
<filename>pg_hba.conf</filename>とほとんど同じです。
- <literal>pgpool</literal>と<literal>postgres</literal>ユーザを<acronym>scram-sha-256</acronym>認証に設定します。
+ <literal>pgpool</literal>と<literal>postgres</literal>ユーザの認証方式を<acronym>scram-sha-256</acronym>に設定します。
+ この設定例では、<productname>Pgpool-II</productname>に接続しているアプリケーションが同じサブネット内にあると想定しています。
</para>
<programlisting>
-host all pgpool 0.0.0.0/0 scram-sha-256
-host all postgres 0.0.0.0/0 scram-sha-256
+host all pgpool samenet scram-sha-256
+host all postgres samenet scram-sha-256
</programlisting>
<note>
<para>
- <productname>Pgpool-II</productname> 4.0の場合、<filename>pgpool.conf</filename>ファイル内の
- <xref linkend="guc-health-check-password">、<xref linkend="guc-sr-check-password">、
- <xref linkend="guc-wd-lifecheck-password">、<xref linkend="guc-recovery-password">には
- <acronym>AES256</acronym>暗号化形式、平文形式しか指定できないので、ご注意ください。
+ <productname>Pgpool-II</productname> 4.0の場合、<filename>pgpool.conf</filename>ファイル内の<xref linkend="guc-health-check-password">、<xref linkend="guc-sr-check-password">、<xref linkend="guc-wd-lifecheck-password">、<xref linkend="guc-recovery-password">には<acronym>AES256</acronym>暗号化形式、平文形式しか指定できないので、ご注意ください。
</para>
</note>
<para>
- <productname>Pgpool-II</productname>のクライアント認証で用いるデフォルトの
- パスワードファイル名は<filename>pool_passwd</filename>です。
- <acronym>scram-sha-256</acronym>認証を利用する場合、
- <productname>Pgpool-II</productname>はそれらのパスワードを復号化するために復号鍵が必要となります。
- 全サーバで復号鍵ファイルを<productname>Pgpool-II</productname>の起動ユーザ
- <literal>postgres</literal> (<productname>Pgpool-II</productname> 4.0以前のバージョンでは
+ <productname>Pgpool-II</productname>のクライアント認証で用いるデフォルトのパスワードファイル名は<filename>pool_passwd</filename>です。
+ <acronym>scram-sha-256</acronym>認証を利用する場合、<productname>Pgpool-II</productname>はそれらのパスワードを復号化するために復号鍵が必要となります。
+ 全サーバで復号鍵ファイルを<productname>Pgpool-II</productname>の起動ユーザ<literal>postgres</literal> (<productname>Pgpool-II</productname> 4.0以前のバージョンでは
<literal>root</literal>) のホームディレクトリ配下に作成します。
</para>
<programlisting>
[全サーバ]$ chmod 600 ~/.pgpoolkey
</programlisting>
<para>
- 「<command>pg_enc -m -k /path/to/.pgpoolkey -u username -p</command>」を実行すると、
- ユーザ名と<acronym>AES256</acronym>で暗号化したパスワードのエントリが<xref linkend="GUC-POOL-PASSWD">に登録されます。
+ <command>pg_enc -m -k /path/to/.pgpoolkey -u username -p</command>を実行すると、ユーザ名と<acronym>AES256</acronym>で暗号化したパスワードのエントリが<xref linkend="GUC-POOL-PASSWD">に登録されます。
<xref linkend="GUC-POOL-PASSWD"> がまだ存在しなければ、<filename>pgpool.conf</filename>と同じディレクトリ内に作成されます。
</para>
<programlisting>
<sect3 id="example-cluster-pgpool-config-watchdog">
<title>Watchdogの設定</title>
<para>
- デフォルトでは<application>Watchdog</application>機能が無効のため、
- <application>Watchdog</application>を有効にします。
+ デフォルトでは<application>Watchdog</application>機能が無効になっているため、<application>Watchdog</application>を有効にします。
</para>
<programlisting>
use_watchdog = on
</programlisting>
<para>
- アクティブ機が立ち上げる仮想IPを<varname>delegate_ip</varname>に指定します。
+ <productname>Pgpool-II</productname>リーダーノードが立ち上げる仮想IPを<varname>delegate_ip</varname>に指定します。
仮想IPはまだ使われていないIPアドレスを指定してください。
</para>
<programlisting>
-delegate_ip = '192.168.137.150'
+delegate_ip = '192.168.100.50'
</programlisting>
<para>
仮想IPの起動/停止、<command>ARP</command>リクエストの送信を行う設定パラメータ
- <xref linkend="GUC-IF-UP-CMD">、<xref linkend="GUC-IF-DOWN-CMD">、<xref linkend="GUC-ARPING-CMD">に、
- ネットワーク環境に合わせてネットワークインターフェース名を設定します。
- 今回の例で使ったネットワークインターフェースは「enp0s8」となっています。
+ <xref linkend="GUC-IF-UP-CMD">、<xref linkend="GUC-IF-DOWN-CMD">、<xref linkend="GUC-ARPING-CMD">に、ネットワーク環境に合わせてネットワークインターフェース名を設定します。
+ この設定例で使用しているネットワークインターフェースは<literal>enp0s8</literal>となります。
<varname>if_up/down_cmd</varname>や<varname>arping_cmd</varname>を実行するにはroot権限が必要となりますので、
- 一般ユーザが実行できるように<command>ip/arping</command>コマンドに<literal>setuid</literal>を設定するか、
- <productname>Pgpool-II</productname>起動ユーザ、
- デフォルトでは<literal>postgres</literal>ユーザ (<productname>Pgpool-II</productname> 4.1以降) が
- パスワードなしに<command>sudo</command>を実行できるように設定する必要があります。
+ 一般ユーザで実行できるように<command>ip/arping</command>コマンドに<literal>setuid</literal>を設定するか、<productname>Pgpool-II</productname>起動ユーザ、デフォルトでは<literal>postgres</literal>ユーザ (<productname>Pgpool-II</productname> 4.1以降) がパスワードなしに<command>sudo</command>を実行できるように設定する必要があります。
</para>
<note>
<para>
heartbeat_hostname1 = 'server2'
heartbeat_port1 = 9694
heartbeat_device1 = ''
+
heartbeat_hostname2 = 'server3'
heartbeat_port2 = 9694
heartbeat_device2 = ''
wd_heartbeat_deadtime = 30
</programlisting>
<para>
- <application>Watchdog</application>プロセスが異常終了した場合に、
- 旧アクティブ機に仮想IPが残ったまま、新アクティブ機で同じ仮想IPを起動してしまう可能性があります。
- ã\81\9dã\82\8cã\82\92é\98²ã\81\90ã\81\9fã\82\81ã\81«<xref linkend="guc-wd-escalation-command">ã\81«ã\80\81æ\96°ã\82¢ã\82¯ã\83\86ã\82£ã\83\96æ©\9f以å¤\96ã\81®
- <literal>Pgpool-II</literal>ノードの仮想IPを停止させるスクリプトを設定します。
+ <application>Watchdog</application>プロセスが異常終了した場合に、
+ 旧リーダーノードで仮想IPが残ったまま、新しいリーダーノードで同じ仮想IPが起動されてしまう可能性があります。
+ ã\81\9dã\82\8cã\82\92é\98²ã\81\90ã\81\9fã\82\81ã\81«<xref linkend="guc-wd-escalation-command">ã\81«ã\80\81æ\96°ã\81\97ã\81\84ã\83ªã\83¼ã\83\80ã\83¼ä»¥å¤\96ã\81®<literal>Pgpool-II</literal>ã\83\8eã\83¼ã\83\89ã\81§ä»®æ\83³IPã\82\92å\81\9cæ¢ã\81\99ã\82\8bã\82¹ã\82¯ã\83ªã\83\97ã\83\88ã\82\92è¨å®\9aã\81\97ã\81¾ã\81\99ã\80\82
+ この設定は任意の設定です。
</para>
<programlisting>
wd_escalation_command = '/etc/pgpool-II/escalation.sh'
</programlisting>
<para>
- サンプルスクリプト<ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/escalation.sh.sample;hb=refs/heads/V4_4_STABLE">escalation.sh</ulink>は
+ サンプルスクリプト<ulink url="https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob_plain;f=src/sample/scripts/escalation.sh.sample;hb=refs/heads/V4_5_STABLE">escalation.sh</ulink>は
<filename>/etc/pgpool-II/</filename>配下にインストールされています。
</para>
<programlisting>
[全サーバ]# vi /etc/pgpool-II/escalation.sh
...
PGPOOLS=(server1 server2 server3)
-VIP=192.168.137.150
+VIP=192.168.100.50
DEVICE=enp0s8
...
</programlisting>
</note>
<note>
<para>
- <literal>use_watchdog = on</literal>の場合は、<productname>Pgpool-II</productname>ノード番号を
- <filename>pgpool_node_id</filename>に設定する必要があります。
+ <literal>use_watchdog = on</literal>の場合は、<productname>Pgpool-II</productname>ノード番号を<filename>pgpool_node_id</filename>に設定する必要があります。
詳細は<xref linkend="example-cluster-pgpool-node-id">を参照ください。
</para>
</note>
log_destination = 'stderr'
logging_collector = on
log_directory = '/var/log/pgpool_log'
-log_filename = 'pgpool-%Y-%m-%d_%H%M%S.log'
+log_filename = 'pgpool-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
</programlisting>
<para>
- ここで、<literal>server1</literal>の<filename>pgpool.conf</filename>の設定は完了です。
- <literal>server1</literal>の<filename>pgpool.conf</filename>を
- 他のノード(<literal>server2</literal>、<literal>server3</literal>)にコピーします。
+ これで、<literal>server1</literal>での<filename>pgpool.conf</filename>の設定は完了です。
+ 最後に、<literal>server1</literal>の<filename>pgpool.conf</filename>を他のサーバ<literal>server2</literal>、<literal>server3</literal>にコピーします。
</para>
<programlisting>
[server1]# scp -p /etc/pgpool-II/pgpool.conf root@server2:/etc/pgpool-II/pgpool.conf
</sect3>
</sect2>
- <sect2 id="example-cluster-start-stop">
- <title>システムの起動と停止</title>
- <para>
- <productname>Pgpool-II</productname>の設定が完了したら、
- 次に<productname>Pgpool-II</productname>を起動します。
- <productname>Pgpool-II</productname>を起動する前に、
- バックエンドの<productname>PostgreSQL</productname>をあらかじめ起動する必要があります。
- また、<productname>PostgreSQL</productname>を停止する場合、
- <productname>Pgpool-II</productname>を先に停止する必要があります。
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <productname>Pgpool-II</productname>の起動
- </para>
- <para>
- 前述の<link linkend="EXAMPLE-CLUSTER-PRE-SETUP">事前設定</link>の章で
- <productname>Pgpool-II</productname>の自動起動が設定済なので、
- ここでシステム全体を再起動するか、以下のコマンドを実行してください。
- </para>
- <programlisting>
-# systemctl start pgpool.service
- </programlisting>
- </listitem>
- <listitem>
- <para>
- <productname>Pgpool-II</productname>の停止
- </para>
- <programlisting>
-# systemctl stop pgpool.service
- </programlisting>
- </listitem>
- </itemizedlist>
- </sect2>
-
<sect2 id="example-cluster-verify">
<title>動作確認</title>
<para>
これから、動作確認を行います。
- <literal>server1</literal>で以下のコマンドで<productname>PostgreSQL</productname>を起動します。
</para>
- <programlisting>
+ <sect3 id="example-cluster-start-stop">
+ <title>Pgpool-IIの起動と停止</title>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <productname>Pgpool-II</productname>の起動
+ </para>
+ <para>
+ <productname>Pgpool-II</productname>を起動します。
+ </para>
+ <para>
+ <productname>Pgpool-II</productname>を起動する前に、<productname>PostgreSQL</productname>をあらかじめ起動する必要があります。
+ <productname>PostgreSQL</productname>プライマリサーバがまだ起動していない場合は、まず次のコマンドを実行して<productname>PostgreSQL</productname>起動します。
+ </para>
+ <programlisting>
[server1]# su - postgres
-[server1]$ /usr/pgsql-15/bin/pg_ctl start -D $PGDATA
- </programlisting>
- <para>
- <literal>server1</literal>、<literal>server2</literal>、<literal>server3</literal>で
- 以下のコマンドで<productname>Pgpool-II</productname>を起動します。
- </para>
- <programlisting>
-# systemctl start pgpool.service
- </programlisting>
+[server1]$ /usr/pgsql-16/bin/pg_ctl start -D $PGDATA
+ </programlisting>
+ <para>
+ <literal>server1</literal>、<literal>server2</literal>および<literal>server3</literal>で以下のコマンドを実行し、<productname>Pgpool-II</productname>を起動します。
+ </para>
+ <programlisting>
+[全サーバ]# systemctl start pgpool.service
+ </programlisting>
+ </listitem>
+ <listitem>
+ <para>
+ <productname>Pgpool-II</productname>の停止
+ </para>
+ <para>
+ <productname>Pgpool-II</productname>を停止するときに、以下のコマンドを実行して<productname>Pgpool-II</productname>を停止します。
+ </para>
+ <para>
+ また、<productname>PostgreSQL</productname>を停止する場合は、<productname>Pgpool-II</productname>を先に停止する必要があります。
+ <productname>Pgpool-II</productname>が起動している状態でPostgreSQLを停止する、想定外のフェイルオーバが起きてしまうので、ご注意ください。
+ </para>
+ <programlisting>
+# systemctl stop pgpool.service
+ </programlisting>
+ </listitem>
+ </itemizedlist>
+ </sect3>
<sect3 id="example-cluster-verify-standby">
- <title>PostgreSQL スタンバイサーバを構築</title>
+ <title>PostgreSQLスタンバイサーバの作成</title>
+ <para>
+ まず、<productname>Pgpool-II</productname>のオンラインリカバリ機能を利用し、<literal>server2</literal>と<literal>server3</literal>をスタンバイサーバとして構築し、<productname>Pgpool-II</productname>管理下に追加します。
+ </para>
<para>
- まず、<productname>Pgpool-II</productname>のオンラインリカバリ機能を利用し、スタンバイサーバを構築します。
- <command>pcp_recovery_node</command>コマンドで実行される<varname>recovery_1st_stage_command</varname>
- パラメータに指定した<filename>recovery_1st_stage</filename>と<filename>pgpool_remote_start</filename>
- スプリクトが実行されるので、この2つのスクリプトが現在稼働中のプライマリサーバ<literal>server1</literal>の
- データベースクラスタの下に存在することを確認します。
+ 仮想IP経由で<productname>Pgpool-II</productname>に接続し、バックエンドノードのステータスを確認します。
+ 下記の結果のように、プライマリサーバが<literal>server1</literal>で起動しており、<literal>server2</literal>と<literal>server3</literal>は「down」状態になっています。
</para>
<programlisting>
-# pcp_recovery_node -h 192.168.137.150 -p 9898 -U pgpool -n 1
+[いずれかのサーバ]# 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
+---------+----------+------+--------+-----------+-----------+---------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------
+ 0 | server1 | 5432 | up | up | 0.333333 | primary | primary | 0 | true | 0 | | | 2023-11-10 15:30:14
+ 1 | server2 | 5432 | down | down | 0.333333 | standby | unknown | 0 | false | 0 | | | 2023-11-10 15:30:14
+ 2 | server3 | 5432 | down | down | 0.333333 | standby | unknown | 0 | false | 0 | | | 2023-11-10 15:30:14
+(3 rows)
+ </programlisting>
+ <para>
+ オンラインリカバリ機能を使用するには、<command>pcp_recovery_node</command>コマンドを実行します。
+ <command>pcp_recovery_node</command>コマンドで<filename>recovery_1st_stage</filename>と<filename>pgpool_remote_start</filename>スクリプトが実行されるので(<filename>recovery_1st_stage</filename>は<varname>recovery_1st_stage_command</varname>パラメータに設定したスクリプト)、この2つのスクリプトが現在稼働中のプライマリサーバ<literal>server1</literal>のデータベースクラスタに存在することを確認してください。
+ </para>
+ <programlisting>
+[いずれかのサーバ]# pcp_recovery_node -h 192.168.100.50 -p 9898 -U pgpool -n 1 -W
Password:
pcp_recovery_node -- Command Successful
-# pcp_recovery_node -h 192.168.137.150 -p 9898 -U pgpool -n 2
+[いずれかのサーバ]# pcp_recovery_node -h 192.168.100.50 -p 9898 -U pgpool -n 2 -W
Password:
pcp_recovery_node -- Command Successful
</programlisting>
<para>
- <literal>server2</literal>と<literal>server3</literal>の<productname>PostgreSQL</productname>が
- スタンバイとして起動されていることを確認します。
+ <literal>server2</literal>と<literal>server3</literal>の<productname>PostgreSQL</productname>がスタンバイとして起動していることを確認します。
</para>
<programlisting>
-# psql -h 192.168.137.150 -p 9999 -U pgpool postgres -c "show pool_nodes"
+[いずれかのサーバ]# 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
---------+----------+------+--------+-----------+-----------+---------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------
- 0 | server1 | 5432 | up | up | 0.333333 | primary | primary | 0 | false | 0 | | | 2021-10-19 07:00:57
- 1 | server2 | 5432 | up | up | 0.333333 | standby | standby | 0 | true | 0 | streaming | async | 2021-10-19 07:00:57
- 2 | server3 | 5432 | up | up | 0.333333 | standby | standby | 0 | false | 0 | streaming | async | 2021-10-19 07:00:57
+ 0 | server1 | 5432 | up | up | 0.333333 | primary | primary | 0 | false | 0 | | | 2023-11-10 15:30:14
+ 1 | server2 | 5432 | up | up | 0.333333 | standby | standby | 0 | true | 0 | streaming | async | 2023-11-10 16:32:33
+ 2 | server3 | 5432 | up | up | 0.333333 | standby | standby | 0 | false | 0 | streaming | async | 2023-11-10 16:33:08
(3 rows)
</programlisting>
</sect3>
<sect3 id="example-cluster-verify-watchdog">
- <title>Watchdogã\82¢ã\82¯ã\83\86ã\82£ã\83\96/スタンバイの切り替え</title>
+ <title>Watchdogã\83ªã\83¼ã\83\80ã\83¼/スタンバイの切り替え</title>
<para>
<command>pcp_watchdog_info</command>で<productname>Pgpool-II</productname>
の<application>Watchdog</application>の情報を確認します。
- æ\9c\80å\88\9dã\81«èµ·å\8b\95ã\81\97ã\81\9f<productname>Pgpool-II</productname>ã\81\8cã\80\8cLEADERã\80\8dになります。
+ æ\9c\80å\88\9dã\81«èµ·å\8b\95ã\81\97ã\81\9f<productname>Pgpool-II</productname>ã\81\8cã\83ªã\83¼ã\83\80ã\83¼になります。
</para>
<programlisting>
-# pcp_watchdog_info -h 192.168.137.150 -p 9898 -U pgpool
+[いずれかのサーバ]# pcp_watchdog_info -h 192.168.100.50 -p 9898 -U pgpool -W
Password:
-3 YES server1:9999 Linux server1 server1
+3 3 YES server1:9999 Linux server1 server1
-server1:9999 Linux server1 server1 9999 9000 4 LEADER #最初に起動されたサーバがLEADERになる
-server2:9999 Linux server2 server2 9999 9000 7 STANDBY #スタンバイとして稼働
-server3:9999 Linux server3 server3 9999 9000 7 STANDBY #スタンバイとして稼働
+server1:9999 Linux server1 server1 9999 9000 4 LEADER 0 MEMBER # 最初に起動したPgpool-IIがリーダーになる
+server2:9999 Linux server2 server2 9999 9000 7 STANDBY 0 MEMBER # スタンバイとして稼働している
+server3:9999 Linux server3 server3 9999 9000 7 STANDBY 0 MEMBER # スタンバイとして稼働している
</programlisting>
<para>
- アクティブである<literal>server1</literal>の<productname>Pgpool-II</productname>
- を停止し、<literal>server2</literal>または<literal>server3</literal>が
- スタンバイからアクティブに昇格することを確認します。
- <literal>server1</literal>を停止する方法は<productname>Pgpool-II</productname>を停止する、
- またはマシンをシャットダウンします。ここでは、<productname>Pgpool-II</productname>を停止します。
+ リーダーである<literal>server1</literal>の<productname>Pgpool-II</productname>を停止し、<literal>server2</literal>または<literal>server3</literal>のどちらかがリーダーになることを確認します。
+ <literal>server1</literal>の<productname>Pgpool-II</productname>を停止するには<productname>Pgpool-II</productname>を停止するか、マシンをシャットダウンします。ここでは、<productname>Pgpool-II</productname>を停止します。
</para>
<programlisting>
[server1]# systemctl stop pgpool.service
-# pcp_watchdog_info -p 9898 -h 192.168.137.150 -U pgpool
+[server1]# pcp_watchdog_info -p 9898 -h 192.168.100.50 -U pgpool -W
Password:
-3 YES server2:9999 Linux server2 server2
+3 3 YES server2:9999 Linux server2 server2
-server2:9999 Linux server2 server2 9999 9000 4 LEADER #server2がアクティブに昇格
-server1:9999 Linux server1 server1 9999 9000 10 SHUTDOWN #server1が停止された
-server3:9999 Linux server3 server3 9999 9000 7 STANDBY #スタンバイとして稼働
+server2:9999 Linux server2 server2 9999 9000 4 LEADER 0 MEMBER # server2がリーダーに昇格
+server1:9999 Linux server1 server1 9999 9000 10 SHUTDOWN 0 MEMBER # server1が停止している
+server3:9999 Linux server3 server3 9999 9000 7 STANDBY 0 MEMBER # server3がタンバイとして稼働している
</programlisting>
<para>
- å\85\88ã\81»ã\81©å\81\9cæ¢ã\81\97ã\81\9f<productname>Pgpool-II</productname>ã\82\92å\86\8dèµ·å\8b\95ã\81\97ã\80\81ã\82¹ã\82¿ã\83³ã\83\90ã\82¤ã\81¨ã\81\97ã\81¦èµ·å\8b\95ã\81\97ã\81\9fことを確認します。
+ å\85\88ã\81»ã\81©å\81\9cæ¢ã\81\97ã\81\9f<productname>Pgpool-II</productname>ã\82\92å\86\8dèµ·å\8b\95ã\81\97ã\80\81ã\82¹ã\82¿ã\83³ã\83\90ã\82¤ã\81¨ã\81\97ã\81¦èµ·å\8b\95ã\81\97ã\81¦ã\81\84ã\82\8bことを確認します。
</para>
<programlisting>
[server1]# systemctl start pgpool.service
-[server1]# pcp_watchdog_info -p 9898 -h 192.168.137.150 -U pgpool
-Password:
-3 YES server2:9999 Linux server2 server2
+[server1]# pcp_watchdog_info -p 9898 -h 192.168.100.50 -U pgpool -W
+Password:
+3 3 YES server2:9999 Linux server2 server2
-server2:9999 Linux server2 server2 9999 9000 4 LEADER
-server1:9999 Linux server1 server1 9999 9000 7 STANDBY
-server3:9999 Linux server3 server3 9999 9000 7 STANDBY
+server2:9999 Linux server2 server2 9999 9000 4 LEADER 0 MEMBER
+server1:9999 Linux server1 server1 9999 9000 7 STANDBY 0 MEMBER
+server3:9999 Linux server3 server3 9999 9000 7 STANDBY 0 MEMBER
</programlisting>
</sect3>
<sect3 id="example-cluster-verify-failover">
<title>自動フェイルオーバ</title>
<para>
- <command>psql</command>で仮想IPに接続し、バックエンドの情報を確認します。
+ <command>psql</command>で仮想IP経由で<productname>Pgpool-II</productname>に接続し、バックエンドの情報を確認します。
</para>
<programlisting>
-# psql -h 192.168.137.150 -p 9999 -U pgpool postgres -c "show pool_nodes"
+[いずれかのサーバ]# 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
---------+----------+------+--------+-----------+-----------+---------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------
- 0 | server1 | 5432 | up | up | 0.333333 | primary | primary | 0 | false | 0 | | | 2021-10-19 07:08:14
- 1 | server2 | 5432 | up | up | 0.333333 | standby | standby | 0 | false | 0 | streaming | async | 2021-10-19 07:08:14
- 2 | server3 | 5432 | up | up | 0.333333 | standby | standby | 0 | true | 0 | streaming | async | 2021-10-19 07:08:14
+ 0 | server1 | 5432 | up | up | 0.333333 | primary | primary | 0 | false | 0 | | | 2023-11-10 15:30:14
+ 1 | server2 | 5432 | up | up | 0.333333 | standby | standby | 0 | false | 0 | streaming | async | 2023-11-10 16:32:33
+ 2 | server3 | 5432 | up | up | 0.333333 | standby | standby | 0 | true | 0 | streaming | async | 2023-11-10 16:33:08
(3 rows)
</programlisting>
<para>
フェイルオーバするかどうか確認してみます。
</para>
<programlisting>
-[server1]$ pg_ctl -D /var/lib/pgsql/15/data -m immediate stop
+[server1]$ pg_ctl -D /var/lib/pgsql/16/data -m immediate stop
</programlisting>
<para>
- <literal>ノード1</literal>を停止後、フェイルオーバが発生し、<literal>server2</literal>が
+ <literal>ノード1</literal>を停止した後に、フェイルオーバが発生し、<literal>server2</literal>が
プライマリに昇格したことを確認します。
</para>
<programlisting>
-# psql -h 192.168.137.150 -p 9999 -U pgpool postgres -c "show pool_nodes"
+[いずれかのサーバ]# 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
---------+----------+------+--------+-----------+-----------+---------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------
- 0 | server1 | 5432 | down | down | 0.333333 | standby | unknown | 0 | false | 0 | | | 2021-10-19 07:10:01
- 1 | server2 | 5432 | up | up | 0.333333 | primary | primary | 0 | false | 0 | | | 2021-10-19 07:10:01
- 2 | server3 | 5432 | up | up | 0.333333 | standby | standby | 0 | true | 0 | streaming | async | 2021-10-19 07:10:03
+ 0 | server1 | 5432 | down | down | 0.333333 | standby | unknown | 0 | false | 0 | | | 2023-11-10 17:05:40
+ 1 | server2 | 5432 | up | up | 0.333333 | primary | primary | 0 | false | 0 | | | 2023-11-10 17:05:40
+ 2 | server3 | 5432 | up | up | 0.333333 | standby | standby | 0 | true | 0 | streaming | async | 2023-11-10 17:05:51
(3 rows)
</programlisting>
<para>
- <literal>server3</literal>ã\81\8cæ\96°ã\81\97ã\81\84ã\83\97ã\83©ã\82¤ã\83\9eã\83ª<literal>server2</literal>ã\81®ã\82¹ã\82¿ã\83³ã\83\90ã\82¤ã\81¨ã\81\97ã\81¦èµ·å\8b\95ã\81\95ã\82\8cã\81¦ã\81\84ます。
+ <literal>server3</literal>ã\81\8cæ\96°ã\81\97ã\81\84ã\83\97ã\83©ã\82¤ã\83\9eã\83ª<literal>server2</literal>ã\81®ã\82¹ã\82¿ã\83³ã\83\90ã\82¤ã\81¨ã\81\97ã\81¦èµ·å\8b\95ã\81\97ã\81¦ã\81\84ã\82\8bã\81\93ã\81¨ã\82\92確èª\8dã\81\97ます。
</para>
<programlisting>
usesysid | 16385
usename | repl
application_name | server3
-client_addr | 192.168.137.103
+client_addr | 192.168.100.53
client_hostname |
client_port | 40916
-backend_start | 2021-10-19 07:10:03.067241+00
+backend_start | 2023-11-10 17:10:03.067241+00
backend_xmin |
state | streaming
sent_lsn | 0/12000260
replay_lag |
sync_priority | 0
sync_state | async
-reply_time | 2021-10-19 07:11:53.886477+00
+reply_time | 2023-11-10 17:17:23.886477+00
</programlisting>
</sect3>
<para>
次に、<productname>Pgpool-II</productname>のオンラインリカバリ機能を利用し、
先ほど停止した旧プライマリサーバをスタンバイとして復旧させます。
- <command>pcp_recovery_node</command>コマンドで実行される<varname>recovery_1st_stage_command</varname>
- パラメータに指定した<filename>recovery_1st_stage</filename>と<filename>pgpool_remote_start</filename>スプリクトが
- 現在稼働中のプライマリサーバ<literal>server2</literal>のデータベースクラスタの下に存在することを確認します。
+ <command>pcp_recovery_node</command>コマンドで<filename>recovery_1st_stage</filename>と<filename>pgpool_remote_start</filename>スクリプトが実行されるので(<filename>recovery_1st_stage</filename>は<varname>recovery_1st_stage_command</varname>パラメータに設定したスクリプト)、この2つのスクリプトが現在稼働中のプライマリサーバ<literal>server2</literal>のデータベースクラスタに存在することを確認してください。
</para>
<programlisting>
-# pcp_recovery_node -h 192.168.137.150 -p 9898 -U pgpool -n 0
+[いずれかのサーバ]# pcp_recovery_node -h 192.168.100.50 -p 9898 -U pgpool -n 0 -W
Password:
pcp_recovery_node -- Command Successful
</programlisting>
<para>
- <literal>ノード1</literal>がスタンバイとして起動されたことを確認します。
+ <literal>server1</literal>がスタンバイとして起動していることを確認します。
</para>
<programlisting>
-# psql -h 192.168.137.150 -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
+node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay | replication_state | replication_sync_state | last_status_change
---------+----------+------+--------+-----------+-----------+---------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------
- 0 | server1 | 5432 | up | up | 0.333333 | standby | standby | 0 | true | 0 | streaming | async | 2021-10-19 07:14:06
- 1 | server2 | 5432 | up | up | 0.333333 | primary | primary | 0 | false | 0 | | | 2021-10-19 07:10:01
- 2 | server3 | 5432 | up | up | 0.333333 | standby | standby | 0 | false | 0 | streaming | async | 2021-10-19 07:10:03
+ 0 | server1 | 5432 | up | up | 0.333333 | standby | standby | 0 | true | 0 | streaming | async | 2023-11-10 17:22:03
+ 1 | server2 | 5432 | up | up | 0.333333 | primary | primary | 0 | false | 0 | | | 2023-11-10 17:05:40
+ 2 | server3 | 5432 | up | up | 0.333333 | standby | standby | 0 | false | 0 | streaming | async | 2023-11-10 17:05:51
(3 rows)
</programlisting>
<para>