PgPoolによる高可用性の実装

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

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

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

Failover Managerは、障害が発生したデータベースノードを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

フェールオーバーマネージャー以外のセットアップでプライマリ/マスターノードが(フェールオーバーまたは手動昇格によって)Pgpoolで変更されると、Pgpoolはすべてのスタンバイノードを自身から切り離し、各スタンバイノードに対して follow_master_command を実行します。新しいマスターノードに従います。フェイルオーバーマネージャーは、ポストプロモーションスクリプトを実行する前にスタンバイノードを再設定するため(フェイルオーバーマネージャーの設定に一致するようにスタンバイがPgpoolでプライマリに昇格される)、 follow_master_command はスタンバイノードをPgpoolに再接続するだけです。

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

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

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

pgpool_backend.sh

アタッチおよびデタッチスクリプトを正常に呼び出すには、 pgpool_backend.sh スクリプトを指定する必要があります。 pgpool_backend.sh は、Pgpoolで実際のPCPインターフェイスコマンドを発行するためのヘルパースクリプトです。 Failover ManagerのノードはIPアドレスで識別されますが、PCPコマンドはノードIDを参照します。 pgpool_backend.sh は、IPアドレスからノードIDへのマッピングを透過的に実行するための抽象化レイヤーを提供します。