PgPoolによる高可用性の実装

フェールオーバーマネージャーは、Postgresノードの状態を監視します。マスターノードに障害が発生した場合、フェールオーバーマネージャーはスタンバイノードへの自動フェールオーバーを実行します。Pgpoolはバックエンドノードの状態を監視せず、スタンバイノードへのフェールオーバーを実行しないことに注意してください。

バージョン3.2以降、フェールオーバーマネージャーエージェントは、PgpoolのPCPインターフェイスを使用して、スタンバイノードのフェールオーバーを実行した後、障害が発生したノードをPgpoolの負荷分散から切り離すように構成できます。必要な構成ファイルの変更と関連するスクリプトの詳細については、以降のセクションで説明します。

フェールオーバーマネージャーの構成

フェールオーバーマネージャーは、障害が発生したデータベースノードをPgpoolの負荷分散から削除する機能を提供します。フェールオーバーマネージャーは、フェールオーバーマネージャークラスターに戻ったときにノードをPgpoolに再接続することもできます。この動作を設定するには、次のパラメーターの efm.properties ファイルでロードバランサーの*attach*および*detach*スクリプトを識別する必要があります。

  • script.load.balancer.attach=/path/to/load_balancer_attach.sh %h

  • script.load.balancer.detach=/path/to/load_balancer_detach.sh %h

load.balancer.detach で参照されるスクリプトは、フェールオーバーマネージャーがデータベースノードに障害が発生したと判断したときに呼び出されます。スクリプトは、PCPインターフェース呼び出しを発行することにより、Pgpoolからノードを切り離します。Pgpoolポートに接続された psql セッションで SHOW NODES を呼び出すことで、 load.balancer.detach スクリプトが正常に実行されたことを確認できます。 SHOW NODES を呼び出すと、ノードが down としてマークされていることが返されます。Pgpoolは、ダウンしたノードにクエリを送信しません。

load.balancer.attach が参照するスクリプトは、 resume コマンドが efm コマンドラインインターフェイスに発行され、ダウンしたノードをフェールオーバーマネージャークラスターに追加し直すときに呼び出されます。ノードがクラスターに再参加すると、 load.balancer.attach で参照されるスクリプトが呼び出され、PCPインターフェース呼び出しが発行され、ノードがPgpoolクラスターに追加されます。Pgpoolポートに接続された psql セッションで SHOW NODES を呼び出すことで、 load.balancer.attach スクリプトが正常に実行されたことを確認できます。コマンドは、ノードが up としてマークされていることを返す必要があります。この時点で、Pgpoolはこのノードの負荷分散候補としての使用を再開します。これらの各パラメーターのサンプルスクリプトは、付録Bに記載されています。

Pgpoolの構成

Pgpoolホストの pgpool.conf ファイルにある以下の設定パラメーターの値を提供する必要があります:

follow_master_command = '/path/to/follow_master.sh %d %P'
load_balance_mode = on
master_slave_mode = on
master_slave_sub_mode = 'stream'
fail_over_on_backend_error = off
health_check_period = 0
failover_if_affected_tuples_mismatch = off
failover_command = ''
failback_command = ''
search_primary_node_timeout = 3

When the primary/master node is changed in Pgpool (either by failover or by manual promotion) in a non-Failover Manager setup, Pgpool detaches all standby nodes from itself, and executes the follow_master_command for each standby node, making them follow the new master node. Since Failover Manager reconfigures the standby nodes before executing the post-promotion script (where a standby is promoted to primary in Pgpool to match the Failover Manager configuration), the follow_master_command merely needs to reattach standby nodes to Pgpool.

スタンバイノードに読み取りトラフィックを分散することで読み取りのスケーラビリティを確保するために、負荷分散がオンになっていることに注意してください。

また、フェールオーバーマネージャーがヘルスチェックの実行とフェールオーバーのトリガーを担当するため、ヘルスチェックとエラートリガーバックエンドフェールオーバーがオフになっていることにも注意してください。この場合、Pgpoolがヘルスチェックを実行することはお勧めできません。これにより、FailoverManagerとの競合が発生したり、早期にフェイルオーバーが実行されたりすることはありません。

最後に、 search_primary_node_timeout は低い値に設定されており、FailoverManagerがトリガーしたフェイルオーバー時にPgpoolサービスの迅速な回復を保証します。

pgpool_backend.sh

In order for the attach and detach scripts to be successfully called, a pgpool_backend.sh script must be provided. pgpool_backend.sh is a helper script for issuing the actual PCP interface commands on Pgpool. Nodes in Failover Manager are identified by IP addresses, while PCP commands refer to a node ID. pgpool_backend.sh provides a layer of abstraction to perform the IP address to node ID mapping transparently.