PgPoolによる高可用性の実装

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

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

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

FailoverManagerは、Pgpoolロードバランシングから障害のあるデータベースノードを削除する機能を提供します。FailoverManagerは、FailoverManagerクラスターに戻ったときに、ノードを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 で参照されるスクリプトは、 efm コマンドラインインターフェースに resume コマンドが発行されて、ダウンしたノードをフェイルオーバーマネージャークラスターに戻すときに呼び出されます。ノードがクラスターに再び参加すると、 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.

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

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

最後に、 search_primary_node_timeout は低い値に設定されており、フェイルオーバーマネージャーによってトリガーされるフェイルオーバー時に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.