2.2. watchdogに外部死活監視を組み込む

Pgpool-II watchdogプロセスは、すべてのPgpool-IIプロセスとBSDソケットを使って通信します。 そのBSDソケットは、ローカルとリモートのPgpool-II watchdogノードをサードパーティのシステムが死活監視するために使用することができます。 IPCのためのBSDソケットの名前は、"s.PGPOOLWD_CMD."文字列の後にPgpool-IIのwd_portを付けたもので、そのソケットファイルはwd_ipc_socket_dirディレクトリに置かれます。

2.2.1. watchdogのIPCコマンドパケットフォーマット

watchdogのIPCコマンドパケットは3つのフィールドから構成されます。 以下のテーブルはメッセージフィールドの詳細な説明です。

表 2-1. watchdogのIPCコマンドパケットフォーマット

フィールド説明
TYPEBYTE1コマンド型
LENGTHネットワークバイトオーダーのINT32データ部の長さ
DATAJSONフォーマットのデータJSONフォーマットのコマンドデータ

2.2.2. watchdogのIPC結果パケットフォーマット

watchdogのIPCコマンド結果パケットは3つのフィールドから構成されます。 以下のテーブルはメッセージフィールドの詳細な説明です。

表 2-2. watchdogのIPC結果パケットフォーマット

フィールド説明
TYPEBYTE1コマンド型
LENGTHネットワークバイトオーダーのINT32データ部の長さ
DATAJSONフォーマットのデータJSONフォーマットのコマンドデータ

2.2.3. watchdogのIPCコマンドパケット型

watchdogプロセスに送られ、またwatchdogプロセスから返却されるIPCコマンドのパケットの最初のバイトは、コマンドまたはコマンド結果型と認識されます。

表 2-3. Watchdog IPC command packet types

名前バイト値説明
REGISTER FOR NOTIFICATIONS'0'コマンドパケット現在の接続をwatchdog通知を受け取るために登録するコマンド
NODE STATUS CHANGE'2'コマンドパケットwatchdogノードの状態変化をwatchdogに通知するためのコマンド
GET NODES LIST'3'コマンドパケットCommand to get the list of all configured watchdog nodes
NODES LIST DATA'4'結果パケットパケット中のJSONデータにすべてのwatchdogノードのリストが含まれます
CLUSTER IN TRANSITION'7'結果パケットクラスタが遷移中なのでコマンドを処理できないときにwatchdogはこのパケットを返します
RESULT BAD'8'結果パケットIPCコマンドが失敗すると、watchdogはこのパケット型を返します
RESULT OK'9'結果パケットIPCコマンドが成功すると、watchdogはこのパケット型を返します

2.2.4. 外部死活監視のIPCパケットとデータ

watchdogの"GET NODES LIST"、"NODES LIST DATA"、"NODE STATUS CHANGE"IPCメッセージは、外部死活監視システムを統合するために使用できます。 pgpoolの組み込み死活監視も同じチャンネルと技術を使っていることに注意してください。

2.2.4.1. 構成されているwatchdogノードのリストの取得

サードパーティの死活監視システムは、wd_authkeyが設定されている時は認証キーとデータを含むJSONデータを、wd_authkeyが設定されていない時は空のパケットデータを含む"GET NODES LIST"パケットをwatchdogのIPCソケットに送ることにより、"NODES LIST DATA"結果パケットを入手できます。

"GET NODES LIST"に対するwatchdogに返却される結果パケットは、死活監視を実施する対象となる、構成されているすべてのwatchdogノードのリストを含むJSONフォーマットです。

      -- The example JSON data contained in "NODES LIST DATA"

      {
      "NodeCount":3,
      "WatchdogNodes":
      [
      {
      "ID":0,
      "State":1,
      "NodeName":"Linux_ubuntu_9999",
      "HostName":"watchdog-host1",
      "DelegateIP":"172.16.5.133",
      "WdPort":9000,
      "PgpoolPort":9999
      },
      {
      "ID":1,
      "State":1,
      "NodeName":"Linux_ubuntu_9991",
      "HostName":"watchdog-host2",
      "DelegateIP":"172.16.5.133",
      "WdPort":9000,
      "PgpoolPort":9991
      },
      {
      "ID":2,
      "State":1,
      "NodeName":"Linux_ubuntu_9992",
      "HostName":"watchdog-host3",
      "DelegateIP":"172.16.5.133",
      "WdPort":9000,
      "PgpoolPort":9992
      }
      ]
      }

      -- Note that ID 0 is always reserved for local watchdog node

     

構成されているwatchdogノード情報をwatchdogから入手したら、外部死活監視システムはwatchdogノードの死活監視を実施できます。 ノードの状態変化を検知したら、watchdogの"NODE STATUS CHANGE"IPCメッセージを使って、watchdogに通知できます。 メッセージには、状態変化したノードIDとノードの新しい状態を伴うJSONでデータを格納してください(ノードIDは、watchdogから返却されたWatchdogNodesリスト中のノードと同じノードIDを使わなければなりません)。

      -- The example JSON to inform pgpool-II watchdog about health check
      failed on node with ID 1 will look like

      {
      "NodeID":1,
      "NodeStatus":1,
      "Message":"optional message string to log by watchdog for this event"
      "IPCAuthKey":"wd_authkey configuration parameter value"
      }

      -- NodeStatus values meanings are as follows
      NODE STATUS DEAD  =  1
      NODE STATUS ALIVE =  2