2018年12月

Pgpool-IIのSHOW POOL_NODESのload_balance_nodeについて

Pgpool-IIのSHOW POOL_NODESのload_balance_nodeはSHOW POOL_NODESを実行したセッションがどのノードを使用しているかを示します。
具体的にはload_balance_nodeがtrueになっているノードに検索クエリを投げます。

例えば、
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 | 0          | true              | 0                 | 2018-
12-29 23:53:02
 1       | 192.168.86.135 | 5433 | up     | 0.500000  | standby | 0          | false             | 0                 | 2018-
12-30 00:01:57
(2 rows)
だった場合は、node_idが0のPostgreSQLに検索クエリを投げます。
SHOW POOL_NODESの悲しいところは、上記の状態でnode_idが1のノード(Postgres)がdownした場合でも、node_idが1のノード(Postgres)に検索クエリを投げるセッションが検索クエリを投げない限り、node_idが1のノードのstatusがupのままになることです。

試してみます。
node_idが1のPostgresを落とします。
[root@postgresql11-testserver-2 ap2]# systemctl stop postgresql-11.service
node_idが1のPostgresを落とした状態で、node_idが0のノードのload_balance_nodeのstatusがUPとなっているセッションで、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 | 0          | true              | 0                 | 2018-
12-29 23:53:02
 1       | 192.168.86.135 | 5433 | up     | 0.500000  | standby | 0          | false             | 0                 | 2018-
12-30 00:01:57
(2 rows)
さらにデータをINSERTしてからSHOW POOL_NODESを実行してもnode_idが1のノードのstatusがupのままです。
ap2=# INSERT INTO sample (a) VALUES (9) ;
INSERT 0 1
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 | 0          | true              | 0                 | 2018-
12-29 23:53:02
 1       | 192.168.86.135 | 5433 | up     | 0.500000  | standby | 0          | false             | 0                 | 2018-
12-30 00:01:57
(2 rows)

SHOW POOL_NODESを実行する際は、node_1のノードの最新の状態を取得してからstatusを表示するようにするといいのになと思いました。

Pgpool-IIのSHOW POOL_NODESのload_balance_nodeについては以下のドキュメントが参考になります。

pgpoolのSHOW POOL_NODESでroleが両方ともstandbyになってしまう

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  | standby | 3          | true              | 0                 | 2018-
12-16 22:53:53
 1       | 192.168.86.135 | 5433 | up     | 0.500000  | standby | 4          | false             | 0                 | 2018-
12-16 22:53:53
(2 rows)
pgpoolはpostgresqlサーバーがprimaryなのかstandbyなのかをSELECT pg_is_in_recovery()の結果で判断しています。 SELECT pg_is_in_recovery()を実行するユーザーとそのユーザーのパスワードとデータベースは、pgpool.confで指定します。 ユーザー名は「sr_check_user」、パスワードは「sr_check_password」、データベースは「sr_check_database」で指定します。 pgpool.confのデフォルト設定は以下のとおりです。
sr_check_user = 'nobody
sr_check_password = ''
sr_check_database = 'postgres'
この設定の場合、nobodyでパスワードなしでデータベースpostgresにアクセスできないと、SELECT pg_is_in_recovery()が実行できません。
実行できるように、pgpool.confだったり、pg_hda.confだったり、データベースpostgresqlにユーザーnobodyを追加したりします。

実行できるようにすると、以下のように正しくroleが表示されます。

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 | 0          | true              | 0                 | 2018-
12-16 23:12:16
 1       | 192.168.86.135 | 5433 | up     | 0.500000  | standby | 0          | false             | 0                 | 2018-
12-16 23:12:16
(2 rows)
参考 : FAQ - pgpool Wiki
記事検索