[pgpool-general-jp: 1533] DBフェイルオーバ後の「show pool_nodes」コマンドの role列について

中村憲一 nakamura.kenichi @ po.ntt-tx.co.jp
2018年 5月 11日 (金) 11:13:51 JST


はじめまして、お世話になります、中村と申します。


DBフェイルオーバを実施した際の、DBノード情報の各pgpoolノードへの
伝播タイミングについてご質問させてください。


【概要】
DBフェイルオーバ後に pgpoolのスタンバイノードから「show 
pool_nodes」コマンドを
実行すると、フェイルオーバによる role列の変更が反映されていませんでした。
また、role列の反映漏れに伴うエラーログが、pgpoolのスタンバイノード上で、継続的に出力されています。

なお、pgpoolのマスタノードでは role列の情報が変わっています。
また、status 列の値は pgpoolの両ノードで up から down へと遷移しています。

【質問】
上記の事象は、
・pgpool-IIの再起動
・障害になったDBノードの復旧と pcp_attach_node の実行
のいずれかを行うことで解消しますが、DBノードの情報の変更を、
自動的に pgpoolのスタンバイノードへ反映させる方法はないでしょうか?


以下、検証環境、DB構成および再現手順です。

【環境】
 CentOS 7.2
 PostgreSQL 10.2
 pgpool-II 3.7.3(3.7.2でも同様)

【構成】
 DBノード0(マスタ)
 DBノード1(スタンバイ)
  ※同期レプリケーション構成
 pgpoolノード0(MASTER)
 pgpoolノード1(STANDBY)
  ※pgpoolは2台構成

【再現手順】
1. DBノード2台、pgpoolノード2台 
ともに正常に稼動させる(pgpoolノード3台でも同様)
2. DBノード0(マスタ)を pg_ctl stop で停止させる
3. DBノード0(マスタ)の障害を 
pgpoolノード0(MASTER)が検知し、DBフェイルオーバを行う
4. DBフェイルオーバにより、DBノード1(スタンバイ)がマスタに昇格する

この状態で pgpoolノード1(STANDBY)の psqlより「show pool_nodes」コマンドを
実行すると、実態と異なる、role列の値が出力されます。

5. DBノード0 
をスタンバイとして復旧し、レプリケーション構成に再組み込み(pcp_attach_node)する

この状態で pgpoolノード1(STANDBY)上で「show 
pool_nodes」コマンドを実行すると、
role列の結果が正しい値になります。



「show pool_nodes」で表示される情報は以下のとおり変化します。

(1) 正常動作時
pgpoolノード0(MASTER)、pgpoolノード1(STANDBY)の 
status列、role列の値が同じである。(正しい状態)

▼pgpoolノード0(MASTER)
-bash-4.2$ psql -p 9999 -U postgres -c "show pool_nodes" postgres
  node_id |    hostname    | port | status | lb_weight |  role   | 
select_cnt | load_balance_node | replication_delay
---------+----------------+------+--------+-----------+---------+------------+-------------------+-------------------
  0       | 192.168.56.246 | 5432 | up     | 0.500000  | primary | 2 
      | true              | 0
  1       | 192.168.56.243 | 5432 | up     | 0.500000  | standby | 0 
      | false             | 0
(2 行)

▼pgpoolノード1(STANDBY)
-bash-4.2$ psql -p 9999 -U postgres -c "show pool_nodes" postgres
  node_id |    hostname    | port | status | lb_weight |  role   | 
select_cnt | load_balance_node | replication_delay
---------+----------------+------+--------+-----------+---------+------------+-------------------+-------------------
  0       | 192.168.56.246 | 5432 | up     | 0.500000  | primary | 0 
      | false             | 0
  1       | 192.168.56.243 | 5432 | up     | 0.500000  | standby | 0 
      | true              | 0
(2 行)


(2) DBフェイルオーバ実施後
DBノード0(マスタ)を停止し、フェイルオーバで 
DBノード1(スタンバイ)がマスタに昇格すると、
pgpoolノード0(MASTER)と pgpoolノード1(STANDBY)の 
status列の値は同じであるが、
role列の値が異なる。(誤った状態との認識)

▼pgpoolノード0(MASTER)
-bash-4.2$ psql -p 9999 -U postgres -c "show pool_nodes" postgres
  node_id |    hostname    | port | status | lb_weight |  role   | 
select_cnt | load_balance_node | replication_delay
---------+----------------+------+--------+-----------+---------+------------+-------------------+-------------------
  0       | 192.168.56.246 | 5432 | down   | 0.500000  | standby | 2 
      | false             | 0
  1       | 192.168.56.243 | 5432 | up     | 0.500000  | primary | 0 
      | true              | 0
(2 行)

▼pgpoolノード1(STANDBY)
-bash-4.2$ psql -p 9999 -U postgres -c "show pool_nodes" postgres
  node_id |    hostname    | port | status | lb_weight |  role   | 
select_cnt | load_balance_node | replication_delay
---------+----------------+------+--------+-----------+---------+------------+-------------------+-------------------
  0       | 192.168.56.246 | 5432 | down   | 0.500000  | primary | 0 
      | false             | 0
  1       | 192.168.56.243 | 5432 | up     | 0.500000  | standby | 0 
      | true              | 0
(2 行)

※しばらく放置しても role列の値に変化なし。


(3) DB復旧、再組み込み後
停止した DBノード0(マスタ)をスタンバイとして再組み込みし、pcp_attach_node すると 

pgpoolノード1(STANDBY)の role列の値が、pgpoolノード0(MASTER)の 
role列の値と同じ値になった。(正しい状態)

▼pgpoolノード0(MASTER)
-bash-4.2$ pcp_attach_node -n 0
Password:
pcp_attach_node -- Command Successful

-bash-4.2$ psql -p 9999 -U postgres -c "show pool_nodes" postgres
  node_id |    hostname    | port | status | lb_weight |  role   | 
select_cnt | load_balance_node | replication_delay
---------+----------------+------+--------+-----------+---------+------------+-------------------+-------------------
  0       | 192.168.56.246 | 5432 | up     | 0.500000  | standby | 2 
      | false             | 0
  1       | 192.168.56.243 | 5432 | up     | 0.500000  | primary | 0 
      | true              | 0
(2 行)

▼pgpoolノード1(STANDBY)
-bash-4.2$ psql -p 9999 -U postgres -c "show pool_nodes" postgres
  node_id |    hostname    | port | status | lb_weight |  role   | 
select_cnt | load_balance_node | replication_delay
---------+----------------+------+--------+-----------+---------+------------+-------------------+-------------------
  0       | 192.168.56.246 | 5432 | up     | 0.500000  | standby | 0 
      | false             | 0
  1       | 192.168.56.243 | 5432 | up     | 0.500000  | primary | 0 
      | true              | 0
(2 行)


以上です。
ご確認のほど、よろしくお願い致します。



-- 
/*------------------------------------------------
中村 憲一
NTTテクノクロス株式会社 IV2BU
MAIL : nakamura.kenichi @ po.ntt-tx.co.jp
------------------------------------------------*/



pgpool-general-jp メーリングリストの案内