pgpool-II watchdog チュートリアル

チュートリアルの概要

このチュートリアルでは、watchdog 機能を試す方法を説明します。

Linux マシン 2 台にそれぞれ pgpool-II がインストールされているものとします。 また、いずれかのマシンか第 3 のマシンに、PostgreSQL がインストールされて稼働しているものとします (backend ノードは 1 台でかまいません)。 なお、pgpool-II はどのモードで稼働していても、watchdog を利用することができます。

この文書では、Active を「osspc16」、Standby を「osspc20」とします。 また psql などを実行するサーバを便宜上「someserver」と表記していますが、Active、Standby のサーバで構いません。

基本設定

pgpool.conf 設定

Active / Standby 共通

2 台の pgpool-II でそれぞれ設定します。

watchdog の有効化

まず、watchdog 機能を有効にするフラグ「use_watchdog」を on にします。

use_watchdog = on
                                    # Activates watchdog

上位サーバ

アプリケーションサーバなど上位のサーバを指定する「trusted_servers」を記述します。

ここでは空欄にしておきます。

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

watchdog

watchdog を起動するポートを「wd_port」」を指定します。

ここではデフォルトのままにしておきます。

wd_port = 9000
                                    # port number for watchdog service

仮想 IP

仮想 IP を「delegate_IP」に指定します。まだ使われてない IP アドレスを記述します。

delegate_IP = '133.137.177.143'
                                    # delegate IP address

監視対象サーバ関連

以下は、それぞれの pgpool-II で設定します。

監視対象とする pgpool-II が稼働する ホスト名「other_pgpool_hostname0」、 その pgpool-II のポート番号「other_pgpool_port0」、 その watchdog のポート番号「other_wd_port0」を、それぞれで記述します。

なお、ホスト名は hostname コマンドの実行結果どおりのものを記述します。

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 othet pgpool 0
other_wd_port0 = 9000
                                    # Port number for othet watchdog 0

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 othet pgpool 0
other_wd_port0 = 9000
                                    # Port number for othet watchdog 0

pgpool-II の起動

両方のサーバで pgpool-II を root で起動します。 なお、ログで動作確認するため、-n オプションをつけて非デーモンモードで起動し、 出力されるログメッセージを pgpool.log ファイルにリダイレクトします。

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 プロセス起動したことが確認できます。 (なおこのログでの ERROR は、まだ起動していない Standby サーバの watchdog に接続しようとして失敗した、 というものなので、無視して構いません。)

ERROR: wd_create_send_socket: connect() is failed(Connection refused)
LOG:   wd_escalation: eslcalated to master pgpool
ERROR: wd_create_send_socket: connect() is failed(Connection refused)
LOG:   wd_escalation:  escaleted to delegate_IP holder
LOG:   wd_init: start watchdog
LOG:   pgpool-II successfully started. version 3.2beta1 (namameboshi)

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

「other_pgpool_hostname*」等に指定したすべての watchdog が起動していると、 死活監視(lifecheck)が開始します。 ここでは osspc16 しか指定していないので、この時点で開始したことがログからわかります。

LOG:   wd_init: start watchdog
LOG:   pgpool-II successfully started. version 3.2beta1 (namameboshi)
LOG:   watchdog: lifecheck started

すると、Active でも、死活監視を始めたというログメッセージが出力されます。

LOG:   watchdog: lifecheck started

簡単な watchdog 動作確認

仮想 IP アドレスへの接続

「delegate_IP」に指定した仮想 IP アドレスに、ping が通ることを確認します。

[user@someserver]$ ping 133.137.177.142
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 を立ち上げた Standby サーバで、仮想 IP アドレスを使っていないことを確認します。

[root@osspc20]# ifconfig
eth0      ...

lo        ...

仮想 IP アドレスを使って、PostgreSQL に接続できることを確認します。 -h オプションには「delegate_IP」の IP アドレスを、-p オプションには「port」のポート番号を指定します。

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

仮想 IP アドレスの切り替え

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

Active サーバで pgpool-II が停止してしまったのを想定し、意図的に停止します。

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

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

LOG:   wd_escalation: eslcalated to master pgpool
ERROR: wd_create_send_socket: connect() is failed(Connection refused)
LOG:   wd_escalation:  escaleted to delegate_IP holder

また、Standby サーバでも死活監視が開始します。

LOG:   watchdog: lifecheck started

「delegate_IP」に指定した仮想 IP アドレスに、ping が通ることを確認します。

[user@someserver]$ ping 133.137.177.142
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.142 -p 9999 -l

応用

監視についての設定

watchdog の監視方法について設定するパラメータがあります。

監視間隔秒を指定する「wd_interval」、リトライ回数を指定する「wd_life_point」、 監視に使うクエリを指定する「wd_lifecheck_query」を記述します。

wd_interval = 10
                                    # lifecheck interval (sec) > 0
wd_life_point = 3
                                    # lifecheck retry times
wd_lifecheck_query = 'SELECT 1'
                                    # lifecheck query to pgpool from watchdog

仮想 IP アドレス切り替えについての設定

仮想 IP アドレスの切り替えコマンドについて設定するパラメータがあります。

仮想 IP を切り替える際に使うコマンドとして「if_up_cmd」「if_down_cmd」、 そのパスを指定する「ifconfig_path」を記述します。 また、仮想 IP 切り替え後の ARP リクエスト送信コマンドを指定する「arping_cmd」、 そのパスを指定する「arping_path」を記述します。

なお通常は、デフォルト値のまま変更する必要はありません。

ifconfig_path = '/sbin'
                                    # ifconfig command path
if_up_cmd = 'ifconfig eth0:0 inet $_IP_$ netmask 255.255.255.0'
                                    # startup delegate IP command
if_down_cmd = 'ifconfig eth0:0 down'
                                    # shutdown delegate IP command

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

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