2019年01月

Pgpool-IIのヘルスチェック


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がある場合は有効にするといいかなと思います。











yum remove "php*"

phpという名前で始まるパッケージを削除したい場合、「yum remove php-*」でなく、「yum remove "php*"」とphp*をダブルクォーテーションで囲む必要があります。
[ap2@postgresql11-testserver-1 ~]$ rpm -qa | grep php
php-pecl-igbinary-2.0.8-1.el7.remi.7.1.x86_64
php-pear-1.10.6-1.el7.remi.noarch
php-json-7.1.24-1.el7.remi.x86_64
php-mbstring-7.1.24-1.el7.remi.x86_64
php-snmp-7.1.24-1.el7.remi.x86_64
php-pgsql-7.1.24-1.el7.remi.x86_64
php-common-7.1.24-1.el7.remi.x86_64
php-opcache-7.1.24-1.el7.remi.x86_64
php-xml-7.1.24-1.el7.remi.x86_64
php-process-7.1.24-1.el7.remi.x86_64
php-pecl-msgpack-2.0.2-1.el7.remi.7.1.x86_64
php-pdo-7.1.24-1.el7.remi.x86_64
php-mysqlnd-7.1.24-1.el7.remi.x86_64
php-soap-7.1.24-1.el7.remi.x86_64
php-pecl-memcached-3.0.4-2.el7.remi.7.1.x86_64
php-gd-7.1.24-1.el7.remi.x86_64
php-ldap-7.1.24-1.el7.remi.x86_64
php-7.1.24-1.el7.remi.x86_64
php-xmlrpc-7.1.24-1.el7.remi.x86_64
php-cli-7.1.24-1.el7.remi.x86_64
php-fedora-autoloader-1.0.0-1.el7.noarch
php-devel-7.1.24-1.el7.remi.x86_64
[root@postgresql11-testserver-1 ap2]# yum remove php-*
Loaded plugins: fastestmirror, langpacks, priorities
No Match for argument: php-fedora-autoloader-1.0.0-1.el7.src.rpm
No Packages marked for removal
[root@postgresql11-testserver-1 ap2]# yum remove "php*"
Loaded plugins: fastestmirror, langpacks, priorities
Resolving Dependencies
--> Running transaction check
---> Package php.x86_64 0:7.1.25-2.el7.remi will be erased
---> Package php-cli.x86_64 0:7.1.25-2.el7.remi will be erased
---> Package php-common.x86_64 0:7.1.25-2.el7.remi will be erased
---> Package php-devel.x86_64 0:7.1.25-2.el7.remi will be erased
---> Package php-fedora-autoloader.noarch 0:1.0.0-1.el7 will be erased
---> Package php-gd.x86_64 0:7.1.25-2.el7.remi will be erased
---> Package php-json.x86_64 0:7.1.25-2.el7.remi will be erased
---> Package php-ldap.x86_64 0:7.1.25-2.el7.remi will be erased
---> Package php-mbstring.x86_64 0:7.1.25-2.el7.remi will be erased
---> Package php-mysqlnd.x86_64 0:7.1.25-2.el7.remi will be erased
---> Package php-opcache.x86_64 0:7.1.25-2.el7.remi will be erased
---> Package php-pdo.x86_64 0:7.1.25-2.el7.remi will be erased
---> Package php-pear.noarch 1:1.10.7-3.el7.remi will be erased
---> Package php-pecl-igbinary.x86_64 0:2.0.8-1.el7.remi.7.1 will be erased
---> Package php-pecl-memcached.x86_64 0:3.1.3-1.el7.remi.7.1 will be erased
---> Package php-pecl-msgpack.x86_64 0:2.0.3-1.el7.remi.7.1 will be erased
---> Package php-pgsql.x86_64 0:7.1.25-2.el7.remi will be erased
---> Package php-process.x86_64 0:7.1.25-2.el7.remi will be erased
---> Package php-snmp.x86_64 0:7.1.25-2.el7.remi will be erased
---> Package php-soap.x86_64 0:7.1.25-2.el7.remi will be erased
---> Package php-xml.x86_64 0:7.1.25-2.el7.remi will be erased
---> Package php-xmlrpc.x86_64 0:7.1.25-2.el7.remi will be erased
--> Finished Dependency Resolution

Dependencies Resolved

============================================================================================================================
 Package                            Arch                Version                              Repository                Size
============================================================================================================================
Removing:
 php                                x86_64              7.1.25-2.el7.remi                    @remi-php71              9.4 M
 php-cli                            x86_64              7.1.25-2.el7.remi                    @remi-php71               14 M
 php-common                         x86_64              7.1.25-2.el7.remi                    @remi-php71              7.9 M
 php-devel                          x86_64              7.1.25-2.el7.remi                    @remi-php71               10 M
 php-fedora-autoloader              noarch              1.0.0-1.el7                          @epel                     15 k
 php-gd                             x86_64              7.1.25-2.el7.remi                    @remi-php71              204 k
 php-json                           x86_64              7.1.25-2.el7.remi                    @remi-php71               80 k
 php-ldap                           x86_64              7.1.25-2.el7.remi                    @remi-php71              129 k
 php-mbstring                       x86_64              7.1.25-2.el7.remi                    @remi-php71              2.8 M
 php-mysqlnd                        x86_64              7.1.25-2.el7.remi                    @remi-php71              850 k
 php-opcache                        x86_64              7.1.25-2.el7.remi                    @remi-php71              800 k
 php-pdo                            x86_64              7.1.25-2.el7.remi                    @remi-php71              386 k
 php-pear                           noarch              1:1.10.7-3.el7.remi                  @remi-php71              2.1 M
 php-pecl-igbinary                  x86_64              2.0.8-1.el7.remi.7.1                 @remi-php71              314 k
 php-pecl-memcached                 x86_64              3.1.3-1.el7.remi.7.1                 @remi-php71              335 k
 php-pecl-msgpack                   x86_64              2.0.3-1.el7.remi.7.1                 @remi-php71              160 k
 php-pgsql                          x86_64              7.1.25-2.el7.remi                    @remi-php71              363 k
 php-process                        x86_64              7.1.25-2.el7.remi                    @remi-php71              180 k
 php-snmp                           x86_64              7.1.25-2.el7.remi                    @remi-php71              110 k
 php-soap                           x86_64              7.1.25-2.el7.remi                    @remi-php71              616 k
 php-xml                            x86_64              7.1.25-2.el7.remi                    @remi-php71              855 k
 php-xmlrpc                         x86_64              7.1.25-2.el7.remi                    @remi-php71              165 k

Transaction Summary
============================================================================================================================
Remove  22 Packages

Installed size: 52 M
Is this ok [y/N]:

pgpool_statusファイルについて

pgpool_statusはpgpoolがpostgresqlのdownを検出するとそのdownの状態を記録するファイルです。
例えばnode_idが1のpostgresqlがdownするとpgpool_statusにnode_idが1のpostgresqlがdownしたことが記録されます。

例えば、SHOW POOL_NODESの結果が以下だった場合、
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 | 1          | true              | 0                 | 2019-
01-02 17:43:57
 1       | 192.168.86.135 | 5433 | down   | 0.500000  | standby | 0          | false             | 0                 | 2019-
01-02 20:10:19
(2 rows)
pgpool_statusファイルの内容は以下のようになります。
[ap2@postgresql11-testserver-1 tmp]$ cat pgpool_status
up
down
pgpool_statusファイルはpgpool起動時に読み込まれます。
上記のpgpool_statusファイルの状態でpgpoolを起動すると、node_idが1のpostgresqlがpgpoolに組み込める状態だったとしてもpgpool_statusファイルの2行目(node_idが1)がdownなのでdownであがってきます。
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 | 1          | true              | 0                 | 2019-
01-02 17:43:57
 1       | 192.168.86.135 | 5433 | down   | 0.500000  | standby | 0          | false             | 0                 | 2019-
01-02 20:10:19
(2 rows)
downであがってきて欲しくない場合は、pgpool_statusファイルを消してpgpoolを起動するか、pgpoolを起動する際に、「-D」または「--discard-status」をオプションに指定して起動します。
pgpool

Pgpool-IIのログの出力先の設定について

Pgpool-IIのログの出力先はpgpool.confのlog_destination以降の項目で設定します。

logdirという設定項目がありますが、これはpgpool_statusというファイルを出力するディレクトリを設定する項目です。

※logdirという項目の名前が今となってはイマイチなので、例えばpgpool_status_output_dirのような名前にかえてくれるとうれしいと思っていますが、どこから要望を出したらいいか分かりません…



記事検索