8.2. Watchdogの設定例

ここではwatchdogの機能を簡単に試す方法を説明します。 Linux マシン2台にそれぞれ Pgpool-II がインストールされているものとします。 また、いずれかのマシンか第 3 のマシンに、PostgreSQL がインストールされて稼働しているものとします。 バックエンドノードは1台でかまいません。 Pgpool-II がどのモードで稼働していても(レプリケーションモードでもマスタースレーブモードでも)、watchdogを利用することができます。

この例では、「osspc16」をActiveノードとして、「osspc20」をStandbyノードとして使います。 「someserver」は、これらのどちらかということを意味しています。

8.2.1. 共通設定

アクティブとスタンバイの両サーバで以下を設定します。

8.2.1.1. Watchdogの有効化

まず、use_watchdogをonにします。

      use_watchdog = on
      # Activates watchdog
     

8.2.1.2. 上位サーバの設定

上流のサーバ(アプリケーションサーバなど)を指定します。 空欄にしておいても構いません。

     trusted_servers = ''
     # trusted server list which are used
     # to confirm network connection
     # (hostA,hostB,hostC,...)
    

8.2.1.3. Watchdog通信

watchdog通信を行うTCPポート番号を指定します。

     wd_port = 9000
     # port number for watchdog service
    

8.2.1.4. 仮想IP

仮想IPをdelegate_IPに設定します。

      delegate_IP = '133.137.177.143'
      # delegate IP address
     

注意: 仮想IPに設定されるIPアドレスは空いており他のマシンで使用されていないことを確認してください。

8.2.2. 個々のサーバ設定

次に、それぞれのPgpool-IIで以下のパラメータを設定します。 other_pgpool_hostnameother_pgpool_portother_wd_portを他のPgpool-IIの値で設定します。

8.2.2.1. Activeサーバの設定(osspc16)

     other_pgpool_hostname0 = 'osspc20'
     # Host name or IP address to connect to for other pgpool 0
     other_pgpool_port0 = 9999
     # Port number for other pgpool 0
     other_wd_port0 = 9000
     # Port number for other watchdog 0
    

8.2.2.2. Standbyサーバの設定(osspc20)

     other_pgpool_hostname0 = 'osspc16'
     # Host name or IP address to connect to for other pgpool 0
     other_pgpool_port0 = 9999
     # Port number for other pgpool 0
     other_wd_port0 = 9000
     # Port number for other watchdog 0
    

8.2.3. Pgpool-IIの起動

両方のサーバでPgpool-IIrootユーザで、"-n"オプションを付けて起動し、ログメッセージはpgpool.logファイルにリダイレクトします。

8.2.3.1. ActiveサーバでのPgpool-II起動(osspc16)

最初に、Active サーバでPgpool-IIを起動します。

     [user@osspc16]$ su -
     [root@osspc16]# {installed_dir}/bin/pgpool -n -f {installed_dir}/etc/pgpool.conf > pgpool.log 2>&1
    

ログから、仮想IP アドレスを使用し、またwatchdogプロセス起動したことが確認できます。

     LOG:  I am announcing my self as master/coordinator watchdog node
     LOG:  I am the cluster leader node
     DETAIL:  our declare coordinator message is accepted by all nodes
     LOG:  I am the cluster leader node. Starting escalation process
     LOG:  escalation process started with PID:59449
     LOG:  watchdog process is initialized
      LOG:  watchdog: escalation started
      LOG:  I am the master watchdog node
     DETAIL:  using the local backend node status
    

8.2.3.2. StandbyサーバでのPgpool-II起動(osspc20)

次に、StandbyサーバでPgpool-IIを起動します。

     [user@osspc20]$ su -
     [root@osspc20]# {installed_dir}/bin/pgpool -n -f {installed_dir}/etc/pgpool.conf > pgpool.log 2>&1
    

ログメッセージからPgpool-IIがwatchdogクラスタにスタンバイとして参加したことがわかります。

     LOG:  watchdog cluster configured with 1 remote nodes
     LOG:  watchdog remote node:0 on Linux_osspc16_9000:9000
     LOG:  interface monitoring is disabled in watchdog
     LOG:  IPC socket path: "/tmp/.s.PGPOOLWD_CMD.9000"
     LOG:  watchdog node state changed from [DEAD] to [LOADING]
     LOG:  new outbound connection to Linux_osspc16_9000:9000
     LOG:  watchdog node state changed from [LOADING] to [INITIALIZING]
     LOG:  watchdog node state changed from [INITIALIZING] to [STANDBY]
           LOG:  successfully joined the watchdog cluster as standby node
      DETAIL:  our join coordinator request is accepted by cluster leader node "Linux_osspc16_9000"
      LOG:  watchdog process is initialized
     
    

8.2.4. 動作確認

仮想 IP アドレスに、pingが通ることを確認します。

    [user@someserver]$ ping 133.137.177.143
    PING 133.137.177.143 (133.137.177.143) 56(84) bytes of data.
    64 bytes from 133.137.177.143: icmp_seq=1 ttl=64 time=0.328 ms
    64 bytes from 133.137.177.143: icmp_seq=2 ttl=64 time=0.264 ms
    64 bytes from 133.137.177.143: icmp_seq=3 ttl=64 time=0.412 ms
   

先にPgpool-IIを起動したActiveサーバが、仮想IPアドレスを使っていることを確認します。

    [root@osspc16]# ifconfig
    eth0      ...

    eth0:0    inet addr:133.137.177.143 ...

    lo        ...
   

後からPgpool-IIを立ち上げたStandbサーバは、仮想IPアドレスを使っていないことを確認します。

    [root@osspc20]# ifconfig
    eth0      ...

    lo        ...
   

仮想IPアドレスを使って、PostgreSQL に接続をできることを確認します。

    [user@someserver]$ psql -h 133.137.177.143 -p 9999 -l
   

8.2.5. 仮想IPの切り替え

Activeサーバがサービス供給不可な状態になったときに、Standbyがそれを引き継ぐのを確認します。 ActiveサーバのPgpool-IIを停止します。

    [root@osspc16]# {installed_dir}/bin/pgpool stop
   

するとStandbyサーバで、仮想IPアドレスを使用しはじめたというログメッセージが出力されます。

         LOG:  remote node "Linux_osspc16_9000" is shutting down
     LOG:  watchdog cluster has lost the coordinator node
    
    LOG:  watchdog node state changed from [STANDBY] to [JOINING]
    LOG:  watchdog node state changed from [JOINING] to [INITIALIZING]
    LOG:  I am the only alive node in the watchdog cluster
    HINT:  skipping stand for coordinator state
    LOG:  watchdog node state changed from [INITIALIZING] to [MASTER]
    LOG:  I am announcing my self as master/coordinator watchdog node
    LOG:  I am the cluster leader node
    DETAIL:  our declare coordinator message is accepted by all nodes
         LOG:  I am the cluster leader node. Starting escalation process
     LOG:  watchdog: escalation started
    
    LOG:  watchdog escalation process with pid: 59551 exit with SUCCESS.
   

仮想 IP アドレスに、pingが通ることを確認します。

    [user@someserver]$ ping 133.137.177.143
    PING 133.137.177.143 (133.137.177.143) 56(84) bytes of data.
    64 bytes from 133.137.177.143: icmp_seq=1 ttl=64 time=0.328 ms
    64 bytes from 133.137.177.143: icmp_seq=2 ttl=64 time=0.264 ms
    64 bytes from 133.137.177.143: icmp_seq=3 ttl=64 time=0.412 ms
   

Activeではもう仮想IPアドレスが使われなくなったのを確認します。

    [root@osspc16]# ifconfig
    eth0      ...

    lo        ...
   

Standbyで仮想IP アドレスが使われていることを確認します。

    [root@osspc20]# ifconfig
    eth0      ...

    eth0:0    inet addr:133.137.177.143 ...

    lo        ...
   

仮想IPアドレスを使って、PostgreSQLに接続できることを確認します。

    [user@someserver]$ psql -h 133.137.177.143 -p 9999 -l
   

8.2.6. 応用

8.2.6.1. 死活監視

watchdog の監視方法について設定するパラメータがあります。 監視間隔秒を指定するwd_interval、死活監視のタイプを指定するwd_lifecheck_methodを記述します。 heartbeat方式では、障害と判断する秒数を指定するwd_heartbeat_deadtime、受信ポート番号を指定するwd_heartbeat_port、ハートビート信号の送信間隔秒を指定するwd_heartbeat_keepalive、送信先heartbeat_destination<emphasis>0</emphasis>heartbeat_destination_port<emphasis>0</emphasis>を記述します。

	    wd_lifecheck_method = 'heartbeat'
	    # Method of watchdog lifecheck ('heartbeat' or 'query' or 'external')
	    # (change requires restart)
	    wd_interval = 10
	    # lifecheck interval (sec) > 0
	    wd_heartbeat_port = 9694
	    # Port number for receiving heartbeat signal
	    # (change requires restart)
	    wd_heartbeat_keepalive = 2
	    # Interval time of sending heartbeat signal (sec)
	    # (change requires restart)
	    wd_heartbeat_deadtime = 30
	    # Deadtime interval for heartbeat signal (sec)
	    # (change requires restart)
	    heartbeat_destination0 = 'host0_ip1'
	    # Host name or IP address of destination 0
	    # for sending heartbeat signal.
	    # (change requires restart)
	    heartbeat_destination_port0 = 9694
	    # Port number of destination 0 for sending
	    # heartbeat signal. Usually this is the
	    # same as wd_heartbeat_port.
	    # (change requires restart)
	   

8.2.6.2. 仮想IPの切り替え

IP アドレスの切り替えコマンドについて設定するパラメータがあります。 仮想 IP を切り替える際に使うコマンドとしてif_up_cmdif_down_cmd、そのパスを指定するif_cmd_pathを記述します。 また、仮想IP切り替え後のARPリクエスト送信コマンドを指定するarping_cmd、そのパスを指定するarping_pathを記述します。

	  if_cmd_path = '/sbin'
	  # path to the directory where if_up/down_cmd exists
	  if_up_cmd = 'ip addr add $_IP_$/24 dev eth0 label eth0:0'
	  # startup delegate IP command
	  if_down_cmd = 'ip addr del $_IP_$/24 dev eth0'
	  # shutdown delegate IP command

	  arping_path = '/usr/sbin'           # arping command path

	  arping_cmd = 'arping -U $_IP_$ -w 1'
	 

wd_escalation_commandおよびwd_de_escalation_commandパラメータに指定した任意のスクリプトで仮想IPの起動・停止を行うこともできます。