5.10. オンラインリカバリ

Pgpool-II はサービスを止めることなくデータベースノードを同期させ、ノードを復帰させることができます。 この機能は「オンラインリカバリ」と呼ばれます。 オンラインリカバリはpcp_recovery_nodeコマンドで実行できます。

オンラインリカバリを実施するためには、リカバリ対象のノードはPgpool-IIから切り離された状態になっていなければなりません。 このことは、そのノードが、pcp_detach_nodeで手動で切り離された状態にあるか、フェイルオーバの結果、Pgpool-IIにより自動的に切り離された状態にあるかのいずれかでなければならないことを意味します。

新しいPostgreSQLサーバを動的に追加したい場合には、backend_hostnameおよび関連パラメータを追加した後にpgpool.confを再読み込みします。 これにより新しいサーバが切り離された状態のバックエンドノードとしてPgpool-IIに登録されます。

注意: オンラインリカバリ実行のためには、対象となるPostgreSQLサーバは稼働していてはいけません。 対象のPostgreSQLがすでに動作中であれば、オンラインリカバリを開始する前にシャットダウンしておいてください。

オンラインリカバリは2段階に分けて実施されます。 第1段階は「ファーストステージ」、第2段階は「セカンドステージ」と呼ばれます。 それぞれのステージ用にスクリプトを用意する必要があります。 replication_modeの時のみセカンドステージが必要です。 ストリーミングレプリケーションモードを含むその他のモードでは、セカンドステージは実施されず、recovery_2nd_stage_command用のスクリプトを用意する必要はありません。 つまり、そのエントリを空文字にしておいても問題ありません。

ファーストステージではデータの更新や読み取りができますが、セカンドステージではクライアントからの接続は許されていません。

オンラインリカバリではPgpool-IIは以下の手順を実施します。

注意: replication_modeでのオンラインリカバリには制限事項があります。 Pgpool-IIが複数のホストにインストールされている場合、Pgpool-IIはオンラインリカバリの2ndステージの間全てのクライアントを止める必要があるため、オンラインリカバリは正しく動作しません。 複数のPgpool-IIホストがある場合、そのうちの1台のみがオンラインリカバコマンドを受け取り、クライアントからの接続をブロックします。

recovery_user (string)

オンラインリカバリを行うためのPostgreSQLユーザ名です。

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

recovery_password (string)

オンラインリカバリを行うための PostgreSQL ユーザパスワードです。

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

recovery_1st_stage_command (string)

オンラインリカバリのファーストステージでマスタ(プライマリ)ノードで実行されるコマンドを指定します。 コマンドファイルはセキュリティ上の観点からデータベースクラスタ内に配置される必要があります。 例えば、recovery_1st_stage_command = 'sync-command'となっている場合、Pgpool-IIはコマンドスクリプトを$PGDATAディレクトリの中で探し、$PGDATA/sync-commandを起動しようとします。

recovery_1st_stage_commandは次の4つの引数を受けとります。

  • マスター(プライマリ)ノードのデータベースクラスタへのパス

  • リカバリされるバックエンドノードのホスト名

  • リカバリされるノードのデータベースクラスタへのパス

  • マスター(プライマリ)ノードのポート番号

注意: recovery_1st_stage_commandの実行中はPgpool-IIは接続やクエリを受け付けており、データの参照や更新を行うことができます。

注意

recovery_1st_stage_commandは、PostgreSQLから見ると、一つのSQLとして実行されます。 そのため、PostgreSQLstatement_timeoutrecovery_1st_stage_commandの完了にかかる時間よりも短く設定されていると、recovery_1st_stagecommandコマンドの実行が途中でキャンセルされます。

典型的なエラーは以下のようなものです。

       rsync used in the command is killed by signal 2 for example.
      

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

recovery_2nd_stage_command (string)

オンラインリカバリのセカンドステージでマスタ(プライマリ)ノードで実行されるコマンドを指定します。 コマンドファイルはセキュリティ上の観点からデータベースクラスタ内に配置される必要があります。 例えば、recovery_2nd_stage_command = 'sync-command'となっている場合、Pgpool-IIはコマンドスクリプトを$PGDATAディレクトリの中で探し、$PGDATA/sync-commandを起動しようとします。

recovery_2nd_stage_commandは次の4つの引数を受けとります。

  • マスター(プライマリ)ノードのデータベースクラスタへのパス

  • リカバリされるバックエンドノードのホスト名

  • リカバリされるノードのデータベースクラスタへのパス

  • マスター(プライマリ)ノードのポート番号

注意: recovery_2nd_stage_commandの実行中は、Pgpool-IIはクライアントからの接続およびクエリを受け付けません。 また、コマンドを実行する前に既存のクライアントが接続を閉じるのを待ちます。 そのため、長時間接続したままのクライアントがいる場合、recovery_2nd_stage_commandは実行されない可能性があります。

注意

recovery_2nd_stage_commandは、PostgreSQLから見ると、一つのSQLとして実行されます。 そのため、PostgreSQLstatement_timeoutrecovery_2nd_stage_commandの完了にかかる時間よりも短く設定されていると、recovery_1st_stagecommandコマンドの実行が途中でキャンセルされます。

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

recovery_timeout (integer)

時間内にオンラインリカバリが完了しなかった場合に、これをキャンセルするためのタイムアウトを秒単位で指定します。 Pgpool-IIは、オンラインリカバリのセカンドステージの間は接続を受け付けないので、このパラメータはオンラインリカバリの最中のサーバがダウンした時にオンラインリカバリをキャンセルするのに使えます。

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

client_idle_limit_in_recovery (integer)

オンラインリカバリの最中で、クライアントが前回のクエリからアイドル状態のままでいるときに、それを切断するまでの時間を秒単位で指定します。 client_idle_limit_in_recoveryclient_idle_limitと似ていますが、オンラインリカバリのセカンドステージでのみ効果を持ちます。

これは、だらしないクライアントやPgpool-IIの間のTCP/IPコネクションの不調(例えばケーブルの切断など)によって、Pgpool-IIのリカバリが邪魔されるのを防止するのに役立ちます。

注意: client_idle_limit_in_recoveryは、recovery_timeoutよりも小さな値でなければなりません。 さもないと、recovery_timeoutのタイムアウトが先に起こり、オンラインリカバリを実行中に以下のエラーとなります。

	 ERROR:  node recovery failed, waiting connection closed in the other pgpools timeout
	

-1に設定すると、オンラインリカバリのセカンドステージが始まると全てのクライアントは直ちに切断されます。 デフォルト値は0で、この機能は無効です。

このパラメータはPgpool-IIの設定を再読み込みすることで変更可能です。 現在のセッションでのパラメータ値は、PGPOOL SETコマンドで変更することもできます。