4.1. はじめに

Watchdogは、高可用性のためのPgpool-IIのサブプロセスです。 Watchdogは、単一障害点を除くために複数のPgpool-IIを使用する際に使用されます。 Watchdogは、最初にPgpool-II V3.2で導入され、Pgpool-II V3.5で常にクォーラムを保つように大きく改善されました。 この機能追加により、watchdogはより対障害性が増し、スプリットブレイン障害とネットワーク分割に対する対処および防止が強固になりました。 また、V3.7ではクォーラムフェイルオーバ (項5.14.6参照)が導入され、PostgreSQLサーバの故障誤検知によるフェイルオーバが起こりにくくなりました。 クォーラム機構を正しく動かすためには、Pgpool-IIノードの数は奇数であり、かつ3以上でなければなりません。

4.1.1. 複数Pgpool-IIノードを協調させる

watchdogは、お互いに情報をやり取りすることにより、複数のPgpool-IIノードを協調させます。

もしwatchdogが有効なら、Pgpool-IIノードは起動時にリーダーwatchdogノードの情報を使ってバックエンドの状態の同期を取ります。 そのノードが自分自身をリーダーに昇格中であれば、バックエンド状態をローカルに初期化します。 フェイルオーバなどでバックエンドの状態が変更したら、watchdogは他のPgpool-IIノードに通知し、同期を取ります。 オンラインリカバリを実行すると、バックエンドの不整合を防ぐために、watchdogはクライアントが他のPgpool-IIノードに接続するのを防ぎます。

また、watchdogは、接続したすべてのPgpool-IIノードを調停し、フェイルバック、フェイルオーバ、フォロープライマリコマンドがただひとつのPgpool-IIで実行されるようにします。

4.1.2. 他のPgpool-IIノードの死活監視

watchdog死活監視は、高可用性のために、watchdogクラスタに所属するPgpool-IIノードの健全性を監視するための下位コンポーネントです。 伝統的に、Pgpool-II watchdogは2種類のリモートの死活監視方法を提供しています。 "heartbeat""query"モードです。 Pgpool-II V3.5で、wd_lifecheck_methodに新しく"external"が追加され、Pgpool-II watchdogが外部サードパーティのシステムを呼び出すことが可能になりました。

リモートノードの死活監視の他に、watchdog死活監視は、上位サーバへの接続を監視することにより、稼働しているノードの健全性をチェックすることができます。 監視がエラーを返したら、watchdogはローカルPgpool-IIノードの障害として扱います。

heartbeatモードでは、watchdogは他のPgpool-IIプロセスをハートビート信号で監視します。 watchdogは、定期的に他のPgpool-IIから送られたハートビート信号を受信します。 一定期間信号が受信されなければ、watchdogはそのPgpool-IIに障害が起こったとみなします。 冗長性のためにPgpool-IIノード間で取り交わされるハートビート通信のためのネットワーク接続を複数使うことができます。 これがデフォルトかつ推奨される死活監視のモードです。

queryモードでは、watchdogはPgpool-IIのプロセスではなく、サービスを監視します。 このモードでは、watchdogは他のPgpool-IIにクエリを送り、結果をチェックします。

注意: この方法では、他のPgpool-IIからの接続が必要で、num_init_childrenが十分に大きくないと失敗します。 このモードは非推奨で、後方互換性のために残されています。

externalモードは、Pgpool-II V3.5で導入されました。 このモードでは、基本的にPgpool-II watchdogの組み込み死活監視は無効になり、watchdogは外部システムがローカルと、watchdogクラスタに所属しているすべてのリモートノードの健全性について報告することを期待します。

4.1.3. すべてのPgpool-IIノードの設定パラメータの一貫性

起動時に、watchdogはローカルノードのPgpool-IIの設定パラメータを、リーダーノードのwatchdog上の設定パラメータとの一貫性を確認し、違いがあれば警告を出します。 これにより、異なるPgpool-IIノードにおける設定パラメータの違いによる好ましくない振る舞いが起きる可能性を減らします。

4.1.4. 障害が検出された際のアクティブ/スタンバイ状態の切換

Pgpool-IIの障害が検出されると、watchdogは他のwatchdogにそのことを通知します。 障害が起きたのがアクティブなPgpool-IIであれば、watchdogは投票によって新しいアクティブPgpool-IIを決定し、active/standby状態を変更します

4.1.5. 自動仮想IP切換

スタンバイPgpool-IIサーバが昇格すると、新しいアクティブサーバは仮想IPインターフェイスを立ち上げます。 一方、以前のアクティブサーバは、仮想IPインターフェイスを停止します。 これにより、サーバが切り替わってもPgpool-IIは同じIPアドレスを使うことができます。

4.1.6. リカバリ時にサーバをスタンバイとして自動的に登録

故障したサーバが復帰あるいは新しいサーバが追加されると、watchdogプロセスは新しいサーバの情報と共に、クラスタ内の他のwatchdogに通知します。 アクティブサーバとそれ以外のサーバ上のwatchdogはその情報を受けとります。 そして、復帰したサーバはスタンバイとして登録されます。

4.1.7. watchdogの起動と停止

watchdogは、Pgpool-IIの下位プロセスとして自動的に起動、停止されます。 したがって、専用の起動、停止コマンドはありません。

watchdogは仮想IPインターフェイスを制御します。 VIPを起動、停止するために実行されるコマンドにはroot権限が必要です。 watchdogが仮想IPを伴って起動される際には、Pgpool-IIは、Pgpool-IIを実行しているユーザがroot権限を持つことを要求します。 しかし、Pgpool-IIをrootユーザで実行するのは良いセキュリティの実践とは言えません。 別の推奨する方法は、Pgpool-IIを通常のユーザとして起動し、sudoを使ってif_up_cmdif_down_cmdarping_cmdにカスタムコマンドを設定するか、if_*コマンドにsetuid("set user ID upon execution")することです。

死活監視プロセスはwatchdogの下位コンポーネントです。 その仕事は、watchdogクラスタに参加しているPgpool-IIノードの健全さを監視することです。 死活監視プロセスは、組み込みの死活監視を使用するようにwatchdogが設定されている場合、自動的に起動されます。 死活監視プロセスは、watchdogのメインプロセスの初期化が完了した後に起動します。 watchdogの組み込み死活監視は、すべてのPgpool-IIノードが起動してから始まります。 ただし、死活監視プロセスは、設定されているすべてのwatchdogノードがクラスタに参加し、アクティブになった時にだけ起動されます。 死活監視がアクティブになる前にリモートノードに障害が起こると、その障害が死活監視によって捕捉されません。