Pgpool-IIが接続するPostgreSQLがdownしているか?を判断する基準はpgpoolからPostgreSQLに接続を試みたときに接続出来るか?です。
接続する機会がなければ、PostgreSQLはUPしていると判断します。
例を示します。
ap2=# SHOW POOL_NODES ; node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay | last_ status_change ---------+----------------+------+--------+-----------+---------+------------+-------------------+-------------------+------ --------------- 0 | localhost | 5433 | up | 0.500000 | primary | 7056 | true | 0 | 2019- 01-02 22:22:16 1 | 192.168.86.135 | 5433 | up | 0.500000 | standby | 4833 | false | 0 | 2019- 01-02 22:26:21 (2 rows)
上記の状態のときに、node_idが1のPostgreSQLを落としてみます。
2019/01/02 22:48 [root@postgresql11-testserver-2 ap2]# systemctl stop postgresql-11.service
tail -f /var/log/pgpool/pgpool.logしても、22:48には特にログを出力しません。
[root@postgresql11-testserver-1 ap2]# tail -f /var/log/pgpool/pgpool.log Jan 2 22:36:52 postgresql11-testserver-1 pgpool[4041]: [863-1] 2019-01-02 22:36:52: pid 4041: LOG: fork a new child process with pid: 9867 Jan 2 22:52:29 postgresql11-testserver-1 pgpool[4041]: [864-1] 2019-01-02 22:52:29: pid 4041: LOG: child process with pid: 9476 exits with status 256 Jan 2 22:52:29 postgresql11-testserver-1 pgpool[4041]: [865-1] 2019-01-02 22:52:29: pid 4041: LOG: fork a new child process with pid: 10914
psql -p 9999でpgpoolに接続を試みます。
この際、node_idが1のPostgreSQLが落ちているので、接続に失敗します。
[ap2@postgresql11-testserver-1 ~]$ psql -p 9999 psql: FATAL: failed to create a backend connection DETAIL: executing failover on backend
tail -f /var/log/pgpool/pgpool.logすると、この時点でpgpoolはnode_1のPostgresqlが落ちていることを検出します。
Jan 2 23:10:50 postgresql11-testserver-1 pgpool[10914]: [865-1] 2019-01-02 23:10:50: pid 10914: LOG: failed to connect to PostgreSQL server on "192.168.86.135:5433", getsockopt() detected error "Connection refused" Jan 2 23:10:50 postgresql11-testserver-1 pgpool[10914]: [866-1] 2019-01-02 23:10:50: pid 10914: LOG: received degenerate backend request for node_id: 1 from pid [10914] Jan 2 23:10:50 postgresql11-testserver-1 pgpool[10914]: [867-1] 2019-01-02 23:10:50: pid 10914: FATAL: failed to create a backend connection
もう一度psql -p 9999すれば接続できますが、一度、psql -p 9999が失敗するのは悲しいというケースがあると思います。
その悲しさを解消する機能がヘルスチェック機能です。
ヘルスチェックを有効にすると、pgpool自体が定期的にPostgreSQLに接続を試みて、接続が失敗するとステータスをdownに変更します。
ヘルスチェック機能を有効にしてみます。
[root@postgresql11-testserver-1 ap2]# emacs /etc/pgpool-II/pgpool.conf - health_check_period = 0 + health_check_period = 10 - health_check_user = 'nobody' + health_check_user = 'postgres' [root@postgresql11-testserver-1 ap2]# systemctl restart pgpool.service [root@postgresql11-testserver-2 data]# date ; systemctl stop postgresql-11.service Wed Jan 2 23:23:25 JST 2019
ヘルスチェックを10秒ごとに実行するよう設定したので、Postgresqlを落としてから10秒以内にdownを検知します。
検知した際のpgpoolのログは以下のようになります。
Jan 2 23:23:30 postgresql11-testserver-1 pgpool[13058]: [6-1] 2019-01-02 23:23:30: pid 13058: LOG: failed to connect to PostgreSQL server on "192.168.86.135:5433", getsockopt() detected error "Connection refused" Jan 2 23:23:30 postgresql11-testserver-1 pgpool[13058]: [7-1] 2019-01-02 23:23:30: pid 13058: ERROR: failed to make persistent db connection Jan 2 23:23:30 postgresql11-testserver-1 pgpool[13058]: [7-2] 2019-01-02 23:23:30: pid 13058: DETAIL: connection to host:"192.168.86.135:5433" failed Jan 2 23:23:30 postgresql11-testserver-1 pgpool[13058]: [8-1] 2019-01-02 23:23:30: pid 13058: LOG: health check failed on node 1 (timeout:0)ErogameScapeのようにアクセスが絶え間なくあるWebサービスでPgpoolを使用している場合、ヘルスチェック機能によるdownの検知よりユーザーさんの接続によるdownの検知が早いことがほとんどなので、ヘルスチェック機能を有効にする意味があまりないですが、あまり接続がない用途だったり、Weightを0に設定しているPostgreSQLがある場合は有効にするといいかなと思います。