5.14. Watchdog

Watchdogの設定パラメータはpgpool.confに記述されています。 pgpool.conf.sampleのWATCHDOG節に設定の例があります。 以下のすべてのオプションがwatchdogプロセスでは指定されている必要があります。

5.14.1. Watchdogを有効にする

use_watchdog (boolean)

onならwatchdogを有効にします。 デフォルトはoffです。

このパラメータは、サーバ起動時にのみ設定できます。

5.14.2. Watchdog通信

wd_hostname (string)

Pgpool-IIサーバのホスト名またはIPアドレスを指定します。 クエリやパケットの送受信の他、watchdogの識別子としても用います。

wd_port (integer)

watchdogが接続を受け付けるために監視するポート番号です。 デフォルト値は9000です。

このパラメータは、サーバ起動時にのみ設定できます。

wd_authkey (string)

wachdog間通信で用いられる認証キーを指定します。 全てのPgpool-IIで同じキーを指定する必要があります。 認証キーが異なるwatchdogからの通信は拒絶されます。 死活監視をheartbeatモードで行う場合には、この認証はハートビート信号にも適用されます。

Pgpool-IIV3.5以降ではwd_authkeyがwatchdog IPCクライアントの認証にも使われるため、Pgpool-IIと通信するwatchdogプロセスは、"IPCAuthKey"のコマンドのJSONデータにwd_authkey値を設定しなければなりません。

デフォルトは''(空文字)で、この場合watchdogの認証は行われません。

このパラメータは、サーバ起動時にのみ設定できます。

5.14.3. 上流サーバへの接続

trusted_servers (string)

上位接続を確認するための信頼できるサーバのリストを指定します。 リスト中の各サーバは、pingの応答に答える必要があります。 "hostA,hostB,hostC"のようにカンマで区切って複数のサーバを指定できます。 全てのサーバに到達できなくなると、watchdogはPgpool-IIに障害が発生したと判断します。 そのため、複数のサーバを指定することを推奨します。 なお、このパラメータにPostgreSQLサーバを指定することはしないでください。

このパラメータは、サーバ起動時にのみ設定できます。

ping_path (string)

上位サーバへの接続監視に利用するpingコマンドのパスを指定します。 "/bin"のようにパスだけを指定します。

このパラメータは、サーバ起動時にのみ設定できます。

5.14.4. 仮想IP制御

delegate_IP (string)

(アプリケーションサーバなど)クライアントサーバから接続されるPgpool-IIの仮想IP(VIP) アドレスを指定します。 Pgpool-IIがスタンバイからアクティブに切り替わった時、Pgpool-IIはこのVIPを引き継ぎます。 クォーラムが存在しなければVIPは立ち上がりません。 デフォルトは''(空文字)で、この場合仮想IPは決して立ち上がりません。

このパラメータは、サーバ起動時にのみ設定できます。

if_cmd_path (string)

Pgpool-IIが仮想IPを切り替えるために使用するコマンドへのパスを指定します。 "/sbin"のようにパスだけを指定します。 if_up_cmdif_down_cmdに指定したコマンドが"/"で始まる場合、 フルパスとみなしif_cmd_pathの設定を無視します。

このパラメータは、サーバ起動時にのみ設定できます。

if_up_cmd (string)

仮想IPを起動するために実行するコマンドを指定します。 "ip addr add $_IP_$/24 dev eth0 label eth0:0"のようにコマンドとパラメータを指定します。 こをコマンドを実行するにはroot権限が必要となりますので、一般ユーザが実行できるように ipコマンドにsetuidを設定するか、 Pgpool-II起動ユーザ(デフォルトではpostgres)がパスワードなしにsudoを実行できるように設定し、 sudoを介したコマンドを"/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev eth0 label eth0:0"のように指定します。 $_IP_$delegate_IPで指定されたIPアドレスに置換されます。

このパラメータは、サーバ起動時にのみ設定できます。

if_down_cmd (string)

仮想IPを停止するために実行するコマンドを指定します。 "ip addr del $_IP_$/24 dev eth0"のようにコマンドとパラメータを指定します。 こをコマンドを実行するにはroot権限が必要となりますので、一般ユーザが実行できるように ipコマンドにsetuidを設定するか、 Pgpool-II起動ユーザ(デフォルトではpostgres)がパスワードなしにsudoを実行できるように設定し、 sudoを介したコマンドを"/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev eth0"のように指定します。 $_IP_$delegate_IPで指定されたIPアドレスに置換されます。

このパラメータは、サーバ起動時にのみ設定できます。

arping_path (string)

IPアドレス切り替え後にPgpool-IIがARPリクエストを送信するコマンドへのパス指定します。 "/usr/sbin"のようにパスだけを指定します。 arping_cmdに指定したコマンドが"/"で始まる場合、 フルパスとみなしarping_pathの設定を無視します。

このパラメータは、サーバ起動時にのみ設定できます。

arping_cmd (string)

IPアドレス切り替え後にARPリクエストを送信するコマンドです。 "arping -U $_IP_$ -w 1 -I eth0"のようにコマンドとパラメータを指定します。 こをコマンドを実行するにはroot権限が必要となりますので、一般ユーザが実行できるように arpingコマンドにsetuidを設定するか、 Pgpool-II起動ユーザ(デフォルトではpostgresユーザ)がパスワードなしにsudoを実行できるように設定し、 sudoを介したコマンドを"/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I eth0"のように設定します。 $_IP_$delegate_IPで指定されたIPアドレスに置換されます。

このパラメータは、サーバ起動時にのみ設定できます。

5.14.5. 昇格および降格時の振る舞い

Pgpool-IIがアクティブ(仮想IPを保持しているステータス)に昇格した時の振る舞いを指定します。

clear_memqcache_on_escalation (boolean)

このオプションがonの場合、pgpool-II がアクティブに昇格した時に、共有メモリ上のクエリキャッシュを全て削除します。 これにより、新しいアクティブのPgpool-IIが旧アクティブと非整合な古いクエリキャッシュを使うことを防止します。

デフォルトはonです。

memqcache_methodが'shmem'の場合のみ有効です。

このパラメータは、サーバ起動時にのみ設定できます。

wd_escalation_command (string)

マスターwatchdogに昇格した時に、ここで指定したコマンドがwatchdogによって実行されます。

コマンドは、そのノードに仮想IPが設定されていた場合、それが立ち上がる直前のタイミングで実行されます。

このパラメータは、サーバ起動時にのみ設定できます。

wd_de_escalation_command (string)

Pgpool-IIのマスターwatchdogが責務を辞退し降格するときに、ここで指定したコマンドが実行されます。 マスターwatchdogノードは、そのマスターノードのPgpool-IIが停止したとき、ネットワーク切断やクォーラム(quorum)が失われたことを検出した時に、マスターから辞任します。

このコマンドは、watchdogノードに仮想IPアドレスが設定されていた場合、それが停止される直前のタイミングで実行されます。

wd_de_escalation_commandは、Pgpool-IIV3.5より前のバージョンには提供されていません。

このパラメータは、サーバ起動時にのみ設定できます。

5.14.6. フェイルオーバの挙動の制御

これらの設定は、watchdog機能が有効な場合に、バックエンドノードのフェイルオーバの動作を制御するために使用されます。 これらの設定の影響は、内部的なPgpool-IIのフェイルオーバ/縮退要求のみに影響します。 一方、(PCPコマンドを使った)ユーザが起動したバックエンド切り離し操作では、これらの設定項目は迂回され適用されません。

failover_when_quorum_exists (boolean)

このパラメータを有効にすると、Pgpool-IIがバックエンドノードの縮退/フェイルオーバを実行する際にクォーラムが存在するかどうかを考慮するようになります。

「クォーラムが存在する」とは、生きているwatchdogノードの数(Pgpool-IIの数)を全部足して、すべてのwatchdogノードの数に対して多数派を形成できる場合のことを指します。 たとえば、watchdogノード数が5のとき、生きているノード数が3以上なら多数派を形成できるのでクォーラムは存在しますが、生きているノード数が2以下なら多数派を形成できないのでクォーラムは存在しません。

クォーラムが存在すると、一つのwatchdogノードがバックエンドの障害を誤検知しても他の多数派のノードに否決されるので、障害誤検知に対して堅牢になります。 これはfailover_require_consensusがオン(デフォルト)の動作ですが、設定によって多数派を形成しなくても直ちにフェイルオーバするようにすることもできます。 バックエンドの障害を誤って検出したPgpool-IIノードは、障害の発生したバックエンドノードを隔離します。

クォーラムの存在の有無は、pcp_watchdog_infoコマンドを--verboseオプション付きで起動することで確認できます。 Quorum stateQUORUM EXISTまたはQUORUM IS ON THE EDGEならクォーラムは存在します。 Quorum stateQUORUM ABSENTならクォーラムは存在しません。

なお、watchdogノード数が偶数の場合は、生きているノード数がすべてのwatchdogノード数の半数以上ならクォーラムが存在するとみなします。 たとえば全watchdogノード数が4で、生きているノード数が2以上ならクォーラムが存在するとみなします。

クォーラムが存在しない場合、クォーラムが再び存在するまで、バックエンドの障害を検出したPgpool-IIノードは、障害の発生したバックエンドノードを隔離します。

隔離されたノードをpcp_detach_nodeコマンドで強制的にフェイルオーバさせることは可能ですが、pcp_attach_nodeコマンドで再びアタッチ状態にすることはできません。

隔離されたノードの動作は切り離されたバックエンドノードと似ていますが、フェイルオーバ/縮退と異なり、隔離ステータスはwatchdogクラスタ内の他のPgpool-IIノードに伝播されません。 したがって、他のPgpool-IIノードは引き続きそのバックエンドを使用し続ける可能性があります。

隔離とフェイルオーバ操作には多くの類似点がありますが、どちらも非常に基本的な方法で異なります。 隔離操作はfailover_commandを実行せず、障害の発生したノードを隔離します。 この隔離されたノードがマスタの場合、Pgpool-IIはスタンバイをマスタに昇格させないので、マスタノードが隔離されている間は、使用可能なマスタバックエンドノードはありません。

更に、障害ノードとは違い、Pgpool-IIは隔離されたノードに対してはヘルスチェックを実行し続けます。 隔離されたノードが到達可能になり次第、そのノードは自動的に再度アタッチされます。

Pgpool-II V4.1以後では、プライマリノードのフェイルオーバに関してwatchdogのマスタノードが合意形成に失敗し、その結果プライマリバックエンドが隔離状態になった場合、そのマスタノードはマスタ/コーディネータの枠割を辞退し、次のリーダの選挙の際にwd_priorityを引き下げることにより、クラスタが新しいリーダを選ぶように仕向けます。

注意: スタンバイバックエンドの障害時にマスタノードが合意形成に失敗した場合は、特にアクションは起こしません。 watchdogマスタが管理する隔離されたスタンバイバックエンドは新しいリーダの選挙を引き起こしません。

このパラメータがoffなら、クォーラムが存在しなくても障害が発生するとフェイルオーバします。

デフォルト値はonです。

failover_when_quorum_existsはPgpool-II V3.7より前では利用できません。

このパラメータは、サーバーの起動時にのみ設定できます。

注意: ネイティブレプリケーションモードではfailover_when_quorum_exists機能は利用できません。

failover_require_consensus (boolean)

このパラメータを有効にすると、Pgpool-IIは、watchdogクォーラムが存在し、少なくともクォーラム投票に必要なノードの最小数があれば、バックエンドノードで縮退/フェイルオーバを実行します。

たとえば、3ノードのwatchdogのクラスタでは、フェイルオーバは、少なくとも2つのノードが特定のバックエンドノードに対してフェイルオーバの実行要求をするときのみ実行されます。

このパラメータがoffなら、投票で合意が取れなくてもフェイルオーバします。

デフォルト値はonです。

注意

failover_require_consensusが有効な場合、Pgpool-IIは他 のPgpool-IIノードから充分な投票を得るまでフェイルオーバしません。 ですから、正しくバックエンドの障害を検出するために、すべてのPgpool-IIノードでヘルスチェックを有効にすることを強く推奨します。 ヘルスチェックに関する詳細については、項5.8をご覧ください。

注意: ネイティブレプリケーションモードではfailover_require_consensus機能は利用できません。

Pgpool-II V3.7より前ではfailover_require_consensusは利用できません。 failover_when_quorum_existsが有効な場合にのみ有効です。

このパラメータは、サーバの起動時にのみ設定できます。

allow_multiple_failover_requests_from_node (boolean)

このパラメータは、failover_require_consensusと連携して動作します。 有効にすると、単一のPgpool-IIノードが複数のフェイルオーバ投票をできます。

たとえば、3ノードのwatchdogクラスタでは、1つのPgpool-IIノードが特定のバックエンドノードのフェイルオーバに対して2つのフェイルオーバ要求を送信すると、両方の要求が別の投票としてカウントされ、たとえ他のPgpool-IIノードからの投票を得なくても、Pgpool-IIがフェイルオーバを実行します。

たとえば、ヘルスチェックでエラーが検出されても有効投票数に達しない場合、障害が引き続き発生していて次のヘルスチェックで再度エラーが検出されれば、都合2票が投票されることになります。ほかのwatchdogが検出しない恒久的な障害が発生した際にフェイルオーバを引き起こしたい時に有用です。

デフォルト値はoffです。

allow_multiple_failover_requests_from_nodeは、Pgpool-II V3.7以前では利用できません。 failover_when_quorum_existsfailover_require_consensusの両方が有効な場合にのみ有効です。

このパラメータは、サーバの起動時にのみ設定できます。

enable_consensus_with_half_votes (boolean)

このパラメータはPgpool-IIが、クォーラムとフェイルオーバにおける合意を解決する際に、どのように多数決ルールにおける計算を行うかを設定します。

このパラメータがオンなら、クォーラムとフェイルオーバの合意のために、全体のうち半数の投票だけでよくなります。 そうでなければ、全体のうち少なくとも半数に加えて1票の投票が必要になります。 フェイルオーバにおいては、これはfailover_require_consensusと同期して動作します。 クォーラムの存在決定、フェイルオーバにおける合意形成の両方において、watchdogクラスタが偶数のPgpool-IIノードから構成されている場合にのみこのパラメータは効果があります。 参加者が奇数のwatchdogクラスタにおける多数決決定の際には、このパラメータの設定値は影響しません。

たとえば、このパラメータがオンのときは、2ノードのwatchdogクラスタではクォーラムが存在するためには一つのPgpool-IIノードが生きている必要があります。 このパラメータがオフのときは、2ノードのwatchdogクラスタではクォーラムが存在するためには2つのPgpool-IIノードが生きている必要があります。

このパラメータがオンのときは、4ノードのwatchdogクラスタではクォーラムが存在するためには2つのPgpool-IIノードが生きている必要があります。 このパラメータがオフのときは、3ノードのwatchdogクラスタではクォーラムが存在するためには2つのPgpool-IIノードが生きている必要があります。

このパラメータがオンのときは、split-brainが発生するリスクがあることに注意してください。 たとえば、ノードA, B, C, Dからなる4ノードのクラスタでは、(A, B)と(C, D)の分断された2つのネットワークになる可能性があります。 (A, B)と(C, D)にとっては、それぞれ生きた2つのノードが存在するので、クォーラムは依然として存在します。 各々のグループはそれぞれのマスタwatchdogを選び、これはすなわちsplit-brainです。

デフォルト値はオフです。

enable_consensus_with_half_votesPgpool-IIV4.1よりも前には存在しません。 以前のバージョンは、あたかもこのパラメータがオンであるかのように動作します。

このパラメータは、サーバの起動時にのみ設定できます。

5.14.7. Pgpool-IIの死活監視

Watchdogは、定期的にpgpool-IIの状態を監視します。

wd_lifecheck_method (string)

死活監視の方法を指定します。 指定できる値は 'heartbeat' (デフォルト)、'query'、または'external' です。

'heartbeat'を指定した場合には、監視は「ハートビートモード」で行われます。 watchdog は一定間隔でハートビート信号(UDP パケット)を他のPgpool-IIへ送信します。 またwatchdogは他のPgpool-IIから送られてくる信号を受信します。 これが一定時間以上途絶えた場合にはそのPgpool-IIに障害が発生したと判断します。

query: このモードではwatchdogは監視用のクエリをPgpool-IIに発行し、それが成功するかどうかで pgpool-II が生きているかどうかを判断します。 Pgpool-IIサーバ間の設置場所が離れている場合、queryモードが有効かもしれません。

注意

クエリモードでは、num_init_childrenを十分大きな値にしてください。 watchdogプロセスもPgpool-IIにクライアントとして接続するからです。

external: このモードでは、Pgpool-IIに組み込みの死活監視は無効になり、watchdogはローカルとリモートのノード死活監視を行うために外部システムを使います。

externalモードはPgpool-II V3.5よりも前のバージョンでは提供されていません。

このパラメータは、サーバ起動時にのみ設定できます。

wd_monitoring_interfaces_list (string)

watchdogプロセスがネットワークリンクの状態を監視するネットワークデバイス名をカンマ区切りのリストで指定します。 リスト中の全てのネットワークインタフェースが(無効化あるいはケーブルを抜かれることで)非アクティブになると、watchdog はネットワークが完全に故障したと見なし自らを停止させませす。 ''(空文字)を指定するとネットワークインタフェースの監視が無効になります。 'any'を指定すると、ループバック以外の存在する全てのネットワークインタフェースを監視します。 デフォルトの値は''空リスト '' (監視は無効)です。

wd_monitoring_interfaces_listは、Pgpool-II V3.5よりも前のバージョンでは提供されていません。

このパラメータは、サーバ起動時にのみ設定できます。

wd_interval (integer)

Pgpool-IIが死活監視を行う間隔を秒単位で指定します(1以上の数字)。 デフォルトは10です。

このパラメータは、サーバ起動時にのみ設定できます。

wd_priority (integer)

このパラメータによってローカルのwatchdogノードがマスターに選ばれる優先度を上げることができます。 クラスタの初期起動時や古いマスターノードが故障した状況でクラスタがマスターノードの選択を行う際に、wd_priorityが高いノードがマスターwatchdogノードに選ばれます。

wd_priorityは、Pgpool-II V3.5よりも前のバージョンでは提供されていません。

このパラメータは、サーバ起動時にのみ設定できます。

wd_ipc_socket_dir (string)

Pgpool-II watchdog のIPC通信で受け付ける UNIX ドメインソケットが作成されるディレクトリを指定します。 デフォルトは'/tmp'です。 このソケットが cron ジョブで削除されることのないよう気をつけてください。 この値は '/var/run'などのディレクトリに設定することを推奨します。

wd_ipc_socket_dirは、Pgpool-II V3.5よりも前のバージョンでは提供されていません。

このパラメータは、サーバ起動時にのみ設定できます。

5.14.8. 死活監視:ハートビートモードの設定

wd_heartbeat_port (integer)

ハートビート信号を受信するUDPポート番号を指定します。 デフォルトは 9694 です。 wd_lifecheck_method'heartbeat'に設定されている場合のみ有効です。

このパラメータは、サーバ起動時にのみ設定できます。

wd_heartbeat_keepalive (integer)

ハートビート信号を送信する間隔(秒)を指定します。 デフォルトは2です。 wd_heartbeat_keepaliveは、wd_lifecheck_method'heartbeat'に設定されている場合のみ有効です。

このパラメータは、サーバ起動時にのみ設定できます。

wd_heartbeat_deadtime (integer)

このオプションで指定された間隔(秒)の間ハートビート信号が途絶えた場合、リモートのwatchdogに障害が発生したとみなされます。 デフォルトは30です。

このパラメータは、サーバ起動時にのみ設定できます。

heartbeat_destination0 (string)

ハートビート信号の送る先のIPアドレスまたは ホスト名を指定します。 複数のハートビート信号の送り先が指定可能です。 0から始まるパラメータの最後の部分は送り先の番号です。

heartbeat_destinationは、wd_lifecheck_method'heartbeat'に設定されている場合のみ有効です。

このパラメータは、サーバ起動時にのみ設定できます。

heartbeat_destination_port0 (integer)

ハートビート信号の送る先のポート番号を指定します。 複数のハートビート信号の送り先が指定可能です。 0から始まるパラメータの最後の部分は送り先の番号です。

heartbeat_destination_portは、wd_lifecheck_method'heartbeat'に設定されている場合のみ有効です。

このパラメータは、サーバ起動時にのみ設定できます。

heartbeat_device0 (string)

heartbeat_destinationX:heartbeat_destination_portXで指定されるハートビートの送信先に用いるネットワークデバイス名を指定します。 パラメータ名の最後にあるXの値(送信先番号)を変えることにより、ハートビートの送信先ごとに異なるハートビートデバイス番号を設定することが可能です。 送信先番号は0から始まります。

heartbeat_deviceは、wd_lifecheck_method'heartbeat'に設定されている場合のみ有効です。

このパラメータは、サーバ起動時にのみ設定できます。

5.14.9. 死活監視:クエリモードの設定

wd_life_point (integer)

監視クエリの応答が得られなかった場合のリトライ回数を指定します。 有効な値は1以上の整数です。

wd_lifecheck_method'query'の場合のみ、wd_life_pointは有効です。

このパラメータは、サーバ起動時にのみ設定できます。

wd_lifecheck_query (string)

リモートのPgpool-IIの死活監視に使うクエリを指定します。 デフォルトは"SELECT 1"です。

wd_lifecheck_method'query'の場合のみ、wd_life_check_queryは有効です。

このパラメータは、サーバ起動時にのみ設定できます。

wd_lifecheck_dbname (string)

リモートのPgpool-IIの死活監視用の接続先のデータベース名です。 デフォルトは'template1'です。

wd_lifecheck_method'query'の場合のみ、wd_life_check_dbnameは有効です。

このパラメータは、サーバ起動時にのみ設定できます。

wd_lifecheck_user (string)

リモートのPgpool-IIの死活監視用の接続先のユーザ名です。 デフォルトは'nobody'です。

wd_lifecheck_method'query'の場合のみ、wd_life_check_userは有効です。

このパラメータは、サーバ起動時にのみ設定できます。

wd_lifecheck_password (string)

リモートのPgpool-IIの死活監視用の接続先のパスワードです。 デフォルトは''(空文字)です。

wd_lifecheck_passwordが空白のままであった場合、Pgpool-IIは空のパスワードを使用する前にpool_passwdファイルからwd_lifecheck_userのパスワードの取得を試みます。

wd_lifecheck_passwordにAES256-CBCで暗号化されたパスワードも指定することができます。 AESで暗号化されたパスワードを指定するためには、パスワード文字列は暗号化(aes-256-cbcアルゴリズムを使用)およびbase64でエンコードした後、AESを接頭辞として付けなければいけません。

暗号化されていないクリアテキストパスワードを指定するためには、TEXTをパスワード文字列の前に付けます。 例えば、パスワードとしてmypassを設定したい場合、パスワードフィールドにTEXTmypassと指定すべきです。

正しくフォーマットされたAESで暗号化されたパスワード文字列をpg_encコマンドを使用して作成することもできます。

注意: Pgpool-IIは暗号化されたパスワードを使うために起動時に有効な復号鍵を要求します。 Pgpool-IIに復号鍵を提供する方法の詳細は項6.4.2を参照してください。

wd_lifecheck_method'query'の場合のみ、wd_life_check_passwordは有効です。

このパラメータは、サーバ起動時にのみ設定できます。

デフォルトは''(空文字)です.

5.14.10. Watchdogサーバの設定

other_pgpool_hostname0 (string)

リモートのwatchdogノードに対するPgpool-IIサーバのホスト名を指定します。 パラメータ名の最後にある数字は「サーバ番号」で、0から始まります。

このパラメータは、サーバ起動時にのみ設定できます。

other_pgpool_port0 (integer)

リモートのwatchdogノードに対するPgpool-IIサーバのポート番号を指定します。 パラメータ名の最後にある数字は「サーバ番号」で、0から始まります。

このパラメータは、サーバ起動時にのみ設定できます。

other_wd_port0 (integer)

リモートのPgpool-IIサーバにおけるwatchdogのポート番号を指定します。 パラメータ名の最後にある数字は「サーバ番号」で、0から始まります。

このパラメータは、サーバ起動時にのみ設定できます。