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

Tatsuo Ishii ishii @ sraoss.co.jp
2013年 11月 21日 (木) 00:08:11 JST


$new_masterに入るのは、hostname0, 1, 2の中で、生きている(ダウン状態でな
い)最も若いidを持つホスト名です。したがって、稲垣さんのpgpool.confであれば、

db01: down
db02: up
db03: up

なら、db02が入ります。

db01: up
db02: down
db03: up

なら、db01が入ります。

それでも思ったような動作にならないのであれば、watchdogを切って試してみ
てください。watchdogの障害の可能性もあるので。
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese: http://www.sraoss.co.jp

> 石井様
> 
> いつもお世話になっております。
> アイ・エス・ビー稲垣です。
> 
> すみません。ご返信が遅くなりました。
> 
> 以下のような書き方だとdb03がprimaryでdb01,db02がstandbyの場合、
> $new_masterにdb01やdb02が入らないのですが、ここをハードコーディングで
> 固定値にするしか方法はないんでしょうか。
> 
> 
> [failover-stream.sh]
> ========================================================================
> #! /bin/ti
> failed_node=$1
> old_primary=$2
> new_master=$3
> trigger_file=$4
> 
> if [ $failed_node -eq $old_primary ]; then
>   su - postgres -c "/usr/bin/ssh -T $new_master /bin/touch $trigger_file"
> fi
> 
> exit 0
> ========================================================================
> 
> 色々と試行錯誤しておりますが、現状ではフェイルオーバが行われず、
> 運用でカバーする方向で検討しています。
> 
> できればシステムとしてフェイルオーバできるような状態になっていることが
> 望ましいと考えております。
> 
> 以上、ご教授の程宜しくお願い致します。
> 
> 
> 2013/11/12 7:10、Tatsuo Ishii <ishii @ sraoss.co.jp> のメール:
> 
>> 横から失礼します。石井です。
>> 
>>> 長田さん
>>> 
>>> いつもお世話になっております。
>>> アイ・エス・ビー稲垣です。
>>> 
>>> 追加の質問ご教授ありがとうございまいした。
>>> ではfailbackはpgpool-II管理下に組み込むだけで、
>>> さらにPrimary状態に戻すような考え方ではないのですね。
>> 
>> はい、そういう仕様です。
>> 
>>> 現状ではdb01→db02→db03と順にフェイルオーバした場合に
>>> db03→db01 or db02にフェイルオーバできない状況です。
>>> 
>>> こちらはpgpool-IIの仕様なんでしょうか?
>> 
>> 違います。
>> 
>>> db03から復旧したdb01 or db02にフェイルオーバするよう
>>> 設定することは可能でしょうか。
>> 
>> db03に障害が起きた後、どのサーバにフェイルオーバするか、どのサーバをプ
>> ライマリにするか(しないか)は、failover scriptの書き方次第です。
>> 
>>> 立て続けの質問になってしまい申し訳ございません。
>>> 
>>> 
>>> 2013/11/11 15:54、Yugo Nagata <nagata @ sraoss.co.jp> のメール:
>>> 
>>>> 稲垣さん
>>>> 
>>>> 長田です。
>>>> 
>>>> On Thu, 7 Nov 2013 23:09:45 +0900
>>>> InagakiTadashi <tadashi.1027 @ gmail.com> wrote:
>>>> 
>>>>> 長田さん
>>>>> 
>>>>> いつもお世話になっております。
>>>>> アイ・エス・ビー稲垣です。
>>>>> 
>>>>> 設定を以下にし、failover-stream.shの内容もご指摘の
>>>>> ものに変更したらうまく行きました。
>>>>> どうもありがとうございました。
>>>> 
>>>> ご連絡ありがとうございます。
>>>> うまくいってよかったです!
>>>> 
>>>>> 
>>>>> また、追加の質問になっていまいますが、pgpool-IIでは
>>>>> db03がPrimaryの状態でdb01、db02とオンラインリカバリで復旧し、
>>>>> その後db03に障害発生した場合の切り替えをfailbackと
>>>>> いうんでしょうか。
>>>>> failbackがわかりづらかったので質問させていただきました。
>>>> 
>>>> 世間一般の言う「主系・待機系の役割を障害の前の状態に戻すこと」の意味とは
>>>> 違う意味で用いているので混乱されるかもしれません。
>>>> 
>>>> pgpool-IIでは fail backを「一度でpgpool-II管理下から切り離したノード
>>>> (但しダウン状態ではない)を、再びpgpool-II管理下に復帰させる操作」の意
>>>> 味で使っています。
>>>> 
>>>>> 
>>>>> [postgresql.conf]
>>>>> ========================================================================
>>>>> ailover_command = “failover-stream.sh %d %P %H /tmp/trigger_file0"
>>>>> 
>>>>> [failover-stream.sh]
>>>>> ========================================================================
>>>>> #! /bin/sh
>>>>> failed_node=$1
>>>>> old_primary=$2
>>>>> new_master=$3
>>>>> trigger_file=$4
>>>>> 
>>>>> if [ $failed_node -eq $old_primary ]; then
>>>>> su - postgres -c "/usr/bin/ssh -T $new_master /bin/touch $trigger_file"
>>>>> fi
>>>>> 
>>>>> exit 0
>>>>> 
>>>>> [実行結果]
>>>>> ========================================================================
>>>>> [postgres @ db03 ~]$ psql -h 192.168.100.98 -p 9999
>>>>> psql (9.2.4)
>>>>> Type "help" for help.
>>>>> 
>>>>> postgres=# SHOW POOL_NODES;
>>>>> node_id |    hostname    | port | status | lb_weight |  role   
>>>>> ---------+----------------+------+--------+-----------+---------
>>>>> 0       | 192.168.100.34 | 5432 | 2      | 0.333333  | primary
>>>>> 1       | 192.168.100.35 | 5432 | 2      | 0.333333  | standby
>>>>> 2       | 192.168.100.36 | 5432 | 2      | 0.333333  | standby
>>>>> (3 rows)
>>>>> 
>>>>> postgres=# SHOW POOL_NODES;
>>>>> The connection to the server was lost. Attempting reset: ^[[ASucceeded.
>>>>> postgres=# SHOW POOL_NODES;
>>>>> node_id |    hostname    | port | status | lb_weight |  role   
>>>>> ---------+----------------+------+--------+-----------+---------
>>>>> 0       | 192.168.100.34 | 5432 | 3      | 0.333333  | standby
>>>>> 1       | 192.168.100.35 | 5432 | 2      | 0.333333  | primary
>>>>> 2       | 192.168.100.36 | 5432 | 2      | 0.333333  | standby
>>>>> (3 rows)
>>>>> 
>>>>> postgres=# SHOW POOL_NODES;
>>>>> The connection to the server was lost. Attempting reset: Succeeded.
>>>>> postgres=# SHOW POOL_NODES;
>>>>> node_id |    hostname    | port | status | lb_weight |  role   
>>>>> ---------+----------------+------+--------+-----------+---------
>>>>> 0       | 192.168.100.34 | 5432 | 3      | 0.333333  | standby
>>>>> 1       | 192.168.100.35 | 5432 | 3      | 0.333333  | standby
>>>>> 2       | 192.168.100.36 | 5432 | 2      | 0.333333  | primary
>>>>> (3 rows)
>>>>> 
>>>>> postgres=# 
>>>>> 
>>>>> ========================================================================
>>>>> 
>>>>> 
>>>>> 
>>>>> 2013/11/06 19:15、Yugo Nagata <nagata @ sraoss.co.jp> のメール:
>>>>> 
>>>>>> 稲垣さん
>>>>>> 
>>>>>> 長田です。
>>>>>> 
>>>>>> 返信が遅くなってしまい申し訳ありません。
>>>>>> 
>>>>>> 添付頂いた 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.confとfailover-stream.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>
>>>>> 
>>>> 
>>>> 
>>>> -- 
>>>> Yugo Nagata <nagata @ sraoss.co.jp>
> 


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