4.4. watchdogの構造

watchdogはPgpool-IIの下位プロセスで、複数のPgpool-IIを調整して、高可用性を追加し、単一障害点を除きます。 (もし有効なら)watchdogプロセスはPgpool-IIが起動した際に自動的に起動されます。 watchdogは、コアシステムと死活監視システムの2つの主なコンポーネントから構成されます。

4.4.1. watchdogコア

"watchdog"として参照されるwatchdogコアは、クラスタに存在するPgpool-IIノードとのwatchdog関連の通信を管理します。 また、Pgpool-II親プロセスと死活監視プロセスとも通信します。

watchdogプロセスの中心はステートマシンで、初期状態(WD_LOADING)から出発し、スタンバイ状態(WD_STANDBY)かリーダー/コーディネーター状態(WD_COORDINATOR)へと遷移します。 スタンバイ状態もリーダー/コーディネーター状態も、watchdogステートマシンとしては安定状態です。 ローカルのPgpool-IIノードに問題が起きるか、リモートのPgpool-IIノードがクラスタから切り離されるまでその状態を保ちます。

watchdogプロセスは以下のタスクを実行します。

4.4.1.1. クラスタの他のノードとの通信

watchdogはほかのすべてのノードとの通信にTCP/IPソケットを使っています。 各々のwatchdogノードはそれぞれのノードに2つのソケットを開くことができます。 ひとつはこのノードが作った出て行く(クライアント)ソケットで、他のノードとの通信を開始します。 2つ目は、リモートwatchdogノードが開いた通信から入ってくるのを待ち受けるソケットです。 リモートノードとのソケット接続が成功すると、直ちにwatchdogはADD NODE (WD_ADD_NODE_MESSAGE)メッセージをそのソケットに送ります。 ADD NODEメッセージを受信したwatchdogノードは、メッセージにカプセル化されたノード情報をそのノードのPgpool-II設定と照合し、照合テストが成功すればノードをクラスタに追加します。 照合テストが失敗すると、接続は切断されます。

4.4.1.2. IPCとデータフォーマット

watchdogプロセスはIPC通信のためにUNIXドメインソケットを公開し、JSON形式のデータを受付、また提供します。 Pgpool-IIの組み込み死活監視とメインプロセスも含めて、すべてのPgpool-IIの内部プロセスは、このIPCソケットを使ってwatchdogと通信します。 IPCソケットは、watchdogと通信する外部/サードパーティシステムも利用することができます。

外部/サードパーティシステムと統合するための、watchdog IPCインターフェイスの使い方の詳細は項4.2をご覧ください。

4.4.2. Watchdogにおける死活監視

Watchdogにおける死活監視は、watchdogクラスタに参加しているPgpool-IIノードの健全性を監視するwatchdogの下位コンポーネントです。 Pgpool-II watchdogは、リモートノードの健全性をチェックする3つの方法、"heartbeat"と"query"と"external"モードを提供します。

"heartbeat"モードでは、死活監視プロセスはUDPを使ってリモートノードにアクセスできるかどうか確認します。 各ノード毎に死活監視の親プロセスは2つの子プロセスを起動します。 ひとつはハートビート信号の送信のため、もうひとつはハートビートの受信のためです。 "query"モードでは、死活監視プロセスはPostgreSQLのlibpqインターフェイスを使ってリモートのPgpool-IIに問い合わせを送ります。 このモードでは、各死活監視プロセスは、死活監視のために新しくスレッドを作成します。 クエリが終了すると、直ちにそのスレッドは破棄されます。 "external"モードでは、Pgpool-IIの死活監視は無効になり、代わりに外部システムがローカルノードとリモートノードを監視することを期待します。

リモートノードの死活監視以外にも、watchdogの死活監視は、上位サーバへの接続を監視することにより、インストールされたノードの健全性をチェックできます。 上位サーバへの接続を監視するために、Pgpool-IIの死活監視はexecv()を使って'ping -q -c3 hostname'コマンドを実行します。 各pingコマンドを実行するために新しい子プロセスが生成されます。 つまり、各々の死活監視のサイクルごとに、それぞれの上位サーバのために子プロセスが作られ、破棄されます。 たとえば、死活監視の設定で2つの上位サーバがあり、10秒ごとに死活監視を行うとすると、死活監視は10秒ごとに2つの子プロセスを起動し、各上位サーバ用に1個ずつプロセスが割り当てられます。 それぞれのプロセスは、pingコマンドが完了するまで生存します。