3.7. PostgreSQLの一時的な停止

保守やバージョンアップの目的で一時的にPostgreSQLを停止したいことがあります。 この節では最小限の停止時間でこの仕事を実行する方法を説明します。

3.7.1. pcp_detach_nodeコマンドの活用

pg_ctlPostgreSQLを停止すると、Pgpool-IIがそのことをヘルスチェックで検知するまではフェイルオーバが発生せず、ヘルスチェックの設定によってはPostgreSQLの切り離しに時間がかかります。 とりわけWatchdogが有効かつfailover_require_consensusがonなら、Pgpool-IIは過半数のWatchdogがPostgreSQLの停止に合意するまで、フェイルオーバを開始しません。 pcp_detach_nodeでノードを切り離せば、ヘルスチェックの設定に関わらず直ちにフェイルオーバが開始されます。 切り離されたノードは実際にはPostgreSQLが停止しておらず、必要なら手動で停止させなければならないことに注意してください。

3.7.2. backend_flagの活用

PostgreSQLを停止、再起動するとフェイルオーバが発生します。 ストリーミングレプリケーションモードでない場合、あるいはストリーミングレプリケーションモードであってもサーバがスタンバイサーバであればあまり大きな問題にはなりませ ん。 しかし、サーバがクラスタのプライマリサーバなら、スタンバイサーバの一つが昇格してしまいます。 更には、クラスタに1台のサーバしか残っていなければ、昇格できるスタンバイサーバがないことになります。

この場合はbackend_flagを使ってフェイルオーバを避けることができます。 以下のようにpgpool.confを設定すると、backend0のフェイルオーバが起こりません。

backend_flag0 = DISALLOW_TO_FAILOVER
     

この設定は、Pgpool-IIの再読込か再起動で有効になります。 このフラグが設定されると、バックエンドが使用不可能になってもフェイルオーバが起きません。 バックエンドが使用不可の間、クライアントは以下のエラーメッセージを受け取ります。

psql: error: could not connect to server: FATAL:  failed to create a backend connection
DETAIL:  executing failover on backend
     

バックエンドを再起動すると、クライアントは通常通り接続ができます。 再びフェイルオーバを有効にするには、以下を設定します。

backend_flag0 = ALLOW_TO_FAILOVER
     

そして、Pgpool-IIの再読込か、再起動を行います。