[pgpool-general-jp: 1219] Re: バックエンドDB3台構成時のフェイルオーバについて

Yugo Nagata nagata @ sraoss.co.jp
2013年 11月 6日 (水) 19:15:18 JST


稲垣さん

長田です。

返信が遅くなってしまい申し訳ありません。

添付頂いた failover-stream.sh を拝見したところ
db01 と db03 では同じ内容、db02 では違う内容となっていました。

db01/db03 では「ダウンしたノードのIDが 0 の場合にフェールオーバ(trigger 
ファイルを touch)」となっており、db02 では「ダウンしたノードID が 2 の
場合にフェールオーバ」となっていました。(以下抜粋)

 ($failed_node にはダウンしたノードID (%d) が入っている)
 # Do nothing if standby goes down.
 if [ $failed_node != 0 ]; then
     exit 0;          ~~ これが db02 では 2
 fi

この設定ですとノードID = 1 の場合にはフェイルオーバが発生せず、db02 が
落ちた場合はこれに相当する現象と思われます。

> db01、db02、db03のどのサーバがPrimaryであっても、Standbyに切り替わるよう
> 設定したいと思っております

スクリプトの中で「以前の Primary ノードID」を用いるには、pgpool.conf の
failover_command の中で %P を指定します。
(参考:http://www.pgpool.net/docs/latest/pgpool-ja.html#FAILBACK_COMMAND)

例えば

 failover_command = "failover.sh %d %P %H"

と指定すると、failover.sh には以下が渡されます。

 - ダウンしたサーバのノードID
 - 旧プライマリサーバのノードID
 - 新しいマスタ(pgpool.conf に指定したバックエンドの内、生きていて番号が
   最も若いもの)のホスト名

この設定で failover.sh を以下のようにすると「(旧)プライマリが落ちた場合には
新しいマスターを新プライマリに昇格させる」という処理が可能です。
(単純に新マスターを新プライマリにできる場合の処理です。)

 failed_node_id = $1
 old_primary_id = $2
 new_master_host = $3

 if [ $filed_node_id = $old_primary_id ];then
   su - postgres -c "/usr/bin/ssh -T $new_master_host /bin/touch $trigger_file"
 fi


On Tue, 29 Oct 2013 19:31:03 +0900
稲垣 <tadashi.1027 @ gmail.com> wrote:

> いつもお世話になっております。
> アイ・エス・ビー稲垣です。
> 
> バックエンドDB3台構成時のフェイルオーバ発生時に切り変わるときと、
> 切り替わらないときがあります。
> db01が落ちたときはdb02に切り替わる確立が高いですが、
> db02が落ちたときは必ず切り替わりません。
> 切り替わらない上にfailover: set new primary node: -1になってしまいます。
> 
> db01、db02、db03のどのサーバがPrimaryであっても、Standbyに切り替わるよう
> 設定したいと思っております。
> 
> お忙しいところ大変失礼いたしますが、ご教授のほど宜しくお願い致します。
> 
> 添付ファイルはdb01〜db03までのpgpool.confとfailover-stream.sh<http://pgpool.xn--conffailover-stream-ei4r.sh>
> になります。
> 構成、バージョン、フェイルオーバ時のログは以下のようになっております。
> 
> 【構成】
> pgpool-IIとPostgreSQLを同居させたサーバ3台構成です。
> 
> host    ipaddress
> db01   192.168.100.34
> db02   192.168.100.35
> db03   192.168.100.36
> 
> 【バージョン】
> pgpool-II version 3.3.1 (tokakiboshi)
> psql (PostgreSQL) 9.2.4
> 
> 【フェイルオーバ時のログ】
> Oct 29 18:46:23 m2m-pdbs01 pgpool-II[48029]: connect_inet_domain_socket:
> getsockopt() detected error: Connection refused
> Oct 29 18:46:23 m2m-pdbs01 pgpool-II[48029]: make_persistent_db_connection:
> connection to 172.16.64.35(5432) failed
> Oct 29 18:46:23 m2m-pdbs01 pgpool-II[48029]: health check failed. 1 th host
> 172.16.64.35 at port 5432 is down
> Oct 29 18:46:23 m2m-pdbs01 pgpool-II[48029]: set 1 th backend down status
> Oct 29 18:46:23 m2m-pdbs01 pgpool-II[48029]: wd_start_interlock: start
> interlocking
> Oct 29 18:46:23 m2m-pdbs01 pgpool-II[48044]: wd_send_response: failover
> request from other pgpool is canceled because it's while switching
> Oct 29 18:46:23 m2m-pdbs01 pgpool-II[48044]: wd_send_response:
> WD_STAND_FOR_LOCK_HOLDER received but lock holder exists already
> Oct 29 18:46:24 m2m-pdbs01 pgpool-II[48029]: starting degeneration.
> shutdown host 172.16.64.35(5432)
> Oct 29 18:46:24 m2m-pdbs01 pgpool-II[48029]: Restart all children
> Oct 29 18:46:24 m2m-pdbs01 pgpool-II[48029]: find_primary_node_repeatedly:
> waiting for finding a primary node
> Oct 29 18:46:32 m2m-pdbs01 pgpool-II[31414]: connect_inet_domain_socket:
> getsockopt() detected error: Connection refused
> Oct 29 18:46:32 m2m-pdbs01 pgpool-II[31414]: make_persistent_db_connection:
> connection to 172.16.64.35(5432) failed
> Oct 29 18:46:32 m2m-pdbs01 pgpool-II[31414]: check_replication_time_lag:
> could not connect to DB node 1, check sr_check_user and sr_check_password
> Oct 29 18:46:34 m2m-pdbs01 pgpool-II[48029]: wd_end_interlock: end
> interlocking
> Oct 29 18:46:35 m2m-pdbs01 pgpool-II[48029]: failover: set new primary
> node: -1
> Oct 29 18:46:35 m2m-pdbs01 pgpool-II[48029]: failover: set new master node:
> 0


-- 
Yugo Nagata <nagata @ sraoss.co.jp>


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