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

InagakiTadashi tadashi.1027 @ gmail.com
2013年 11月 11日 (月) 22:57:12 JST


長田さん

いつもお世話になっております。
アイ・エス・ビー稲垣です。

追加の質問ご教授ありがとうございまいした。
ではfailbackはpgpool-II管理下に組み込むだけで、
さらにPrimary状態に戻すような考え方ではないのですね。

現状ではdb01→db02→db03と順にフェイルオーバした場合に
db03→db01 or db02にフェイルオーバできない状況です。

こちらはpgpool-IIの仕様なんでしょうか?
db03から復旧したdb01 or db02にフェイルオーバするよう
設定することは可能でしょうか。

立て続けの質問になってしまい申し訳ございません。


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.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>
>> 
> 
> 
> -- 
> Yugo Nagata <nagata @ sraoss.co.jp>

-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://www.sraoss.jp/pipermail/pgpool-general-jp/attachments/20131111/a5fac2a3/attachment-0001.html>


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