5.9. フェイルオーバとフェイルバック

フェイルオーバは、Pgpool-IIから見て使用できなくなったPostgreSQLバックエンドノードをPgpool-IIが自動的に切り離す処理を指します。 これはPgpool-IIの設定に関わらず、自動的に行われるいわゆる自動フェイルオーバ処理です。 Pgpool-IIPostgreSQLバックエンドノードが使用できなくなったことを、以下の方法で確認します。    

failover_commandが設定済みでフェイルオーバが行われると、failover_commandが起動されます。 failover_commandはユーザが記述すべきもので、主な役割としては、たとえばストリーミングレプリケーションのプライマリサーバがダウンした時に、新しいプライマリサーバをスタンバイサーバの中から選択して昇格させることなどが上げられます。 そのほか、ファイルオーバが発生したことを管理者にメールで通知することなども考えられます。

フェイルオーバはこのように障害時に発生しますが、手動で意図的にフェイルオーバさせることもできます。 これをスイッチオーバと呼びます。 たとえば、スィッチオーバでPostgreSQLを意図的に切り離して、その間にバックアップを取得するなどの運用が考えられます。 スィッチオーバでは、単にPgpool-II内の状態情報をダウン状態にするだけ(ただし、failover_commandは起動される)で、PostgreSQLをダウンさせるわけではないことに注意してください。 スィッチオーバはpcp_detach_nodeコマンドで実行できます。

フェイルオーバないしスィッチオーバで切り離されたPostgreSQLノードは、自動ではもとの状態(アタッチ状態)には戻りません。 -D オプションを指定してPgpool-IIを再起動するか、pcp_attach_nodeコマンドを使用します。

5.9.1. フェイルオーバとフェイルバックの設定

failover_command (string)

PostgreSQLバックエンドノードが切り離される時に実行するユーザコマンドを指定します。 Pgpool-IIはコマンド実行の前に、以下の特殊文字をバックエンドの具体的な情報に置き換えます。

表 5-6. フェイルオーバコマンドオプション

特殊文字説明
%d切り離されたノードのDBノードID
%h切り離されたノードのホスト名
%p切り離されたノードのポート番号
%D切り離されたノードのデータベースクラスタパス
%m新しいマスターノードのID
%H新しいマスターノードのホスト名
%M古いマスターノードのID
%P古いプライマリノードのID
%r新しいマスターノードのポート番号
%R新しいマスターノードのデータベースクラスタパス
%%'%'文字

注意: マスターノードは、生きているデータベースノードの中から一番若い(小さい)ノードIDを持つノードを参照します。 ストリーミングレプリケーションモードでは、このノードはプライマリノードとは異なる場合があります。 表5-6内では、 %mはPgpool-IIによって選出された新しいマスターノードとなります。 新しいマスターノードには生きているノードで一番若い(小さい)ノードが割り当てられます。 例えば、ノード0、1、2という3つのノードを持ち、ノード1がプライマリノード、全てのノードは正常である(ダウンしているノードがない)と仮定します。 ノード1がダウンした場合、failover_command は %m = 0 で呼び出されます。 また、全てのスタンバイノードがダウンした状態でプライマリノードのフェイルオーバが起きた場合、failover_commandは %m = -1、および%H,%R,%r = "" で呼び出されます。

注意: フェイルオーバーが実行されると、基本的にPgpool-IIは子プロセスを切断します。 これにより、Pgpool-IIへの全てのアクティブセッションが終了されます。 その後、Pgpool-IIfailover_commandを実行し、コマンドが完了した後にPgpool-IIはクライアントからの接続を再び受け付ける準備のため新しい子プロセスを起動します。

しかし、Pgpool-II 3.6以降では、そのセッションがダウンしたスタンバイを使用していない場合には、フェイルオーバが起こってもセッションが切断されません。 (ただし、フェイルオーバ処理中にそのセッションを使って問い合わせを発行すると、そのセッションは切断されるので注意してください。) プライマリサーバがダウンしたときには、依然としてすべてのセッションが切断されます。 ヘルスチェックがタイムアウトした場合にも、すべてのセッションが切断されます。 それ以外のケース、たとえばヘルスチェックの再試行回数がオーバーした場合には、全セッションの切断は起きません。

注意: スクリプトの中でpsqlやその他のコマンドを使ってバックエンドにアクセスし、情報を取り出すことはできますが、psqlPgpool-II自体に対して実行することはできません。 スクリプトはPgpool-IIから呼ばれ、Pgpool-IIがフェイルオーバーを実行している間に動作するからです。

このパラメータはPgpool-IIの設定を再読み込みすることで変更可能です。

failback_command (string)

PostgreSQLバックエンドノードがPgpool-IIに復帰された時に実行するユーザコマンドを指定します。 Pgpool-IIはコマンド実行の前に、以下の特殊文字をバックエンドの具体的な情報に置き換えます。

表 5-7. フェイルバックコマンドオプション

特殊文字説明
%d復帰したノードのDBノードID
%h復帰したノードのホスト名
%p復帰したノードのポート番号
%D復帰したノードのデータベースクラスタパス
%m新しいマスターノードのID
%H新しいマスターノードのホスト名
%M古いマスターノードのID
%P古いプライマリノードのID
%r新しいマスターノードのポート番号
%R新しいマスターノードのデータベースクラスタパス
%%'%'文字

注意: スクリプトの中でpsqlやその他のコマンドを使ってバックエンドにアクセスし、情報を取り出すことはできますが、psqlPgpool-II自体に対して実行することはできません。 スクリプトはPgpool-IIから呼ばれ、Pgpool-IIがフェイルオーバーを実行している間に動作するからです。

このパラメータはPgpool-IIの設定を再読み込みすることで変更可能です。

follow_master_command (string)

プライマリノードのフェイルオーバー後に実行するユーザコマンドを指定します。 この機能は、マスタースレーブモードでストリーミングレプリケーション構成の場合のみ有効です。 Pgpool-IIはコマンド実行の前に、以下の特殊文字をバックエンドの具体的な情報に置き換えます。

表 5-8. フォローマスターコマンドオプション

特殊文字説明
%d切り離されたノードのDBノードID
%h切り離されたノードのホスト名
%p切り離されたノードのポート番号
%D切り離されたノードのデータベースクラスタパス
%M古いマスターノードのID
%m新しいプライマリノードのID
%H新しいプライマリノードのホスト名
%P古いプライマリノードのID
%r新しいプライマリノードのポート番号
%R新しいプライマリノードのデータベースクラスタパス
%%'%'文字

注意: follow_master_commandが空文字列でない場合、ストリーミングレプリケーションによるマスタースレーブでプライマリノードのフェイルオーバーが完了した後に、Pgpool-IIは新しいプライマリ以外のすべてのノードを切り離し、クライアントから再び接続を受け付ける準備のため再度新しい子プロセスを起動します。 その後、Pgpool-IIは切り離されたそれぞれのノードに対してfollow_master_commandに設定したコマンドを実行します。

通常は、follow_master_commandコマンドはpcp_recovery_nodeコマンドを呼んで新しいプライマリからスレーブをリカバリするために使用します。

このパラメータはPgpool-IIの設定を再読み込みすることで変更可能です。

fail_over_on_backend_error (boolean)

onに設定した場合、Pgpool-IIPostgreSQLバックエンド接続からの読み出し、書き込みのエラーをバックエンドノードの故障と見なし、現在のセッションを切断した後にそのノードをフェイルオーバします。 offに設定した場合、そのようなエラーの場合でもPgpool-IIは単にエラーをレポートしセッションが切断するのみです。

注意: fail_over_on_backend_errorをoffにする場合は、バックエンドのヘルスチェックを有効にすることをお勧めします(項5.8をご覧ください)。 なお、PostgreSQLバックエンドサーバが管理コマンドでシャットダウンされたことをPgpool-IIが検知した場合には、依然としてフェイルオーバが起こることに注意してください。 この場合にもフェイルオーバを避けたい場合には、backend_flagでDISALLOW_TO_FAILOVERを指定してください。

このパラメータはPgpool-IIの設定を再読み込みすることで変更可能です。

search_primary_node_timeout (integer)

フェイルオーバが起きた時にプライマリノードを検索するための最大時間を秒単位で指定します。 Pgpool-IIは、ここで設定した時間の間にプライマリノードを見つけられなかった場合、探すのを諦めます。 デフォルト値は300です。 0を指定すると、永久に検索し続けます。

このパラメータはストリーミングレプリケーションによるマスタースレーブモードの場合のみ有効です。

このパラメータはPgpool-IIの設定を再読み込みすることで変更可能です。

5.9.2. rawモードにおけるフェイルオーバ

rawモードにおいて、複数のバックエンドサーバが定義されている場合、フェイルオーバが可能です。 通常の動作ではPgpool-IIbackend_hostname0で指定したバックエンドにアクセスします。 何らかの理由でbackend_hostname0のサーバに障害が発生すると、Pgpool-IIbackend_hostname1へのアクセスを試みます。 これが失敗した場合にはPgpool-IIbackend_hostname2, 3と以下同様に試みます。