[pgpool-general-jp: 1237] Re: バックエンドDB3台構成時のフェイルオーバについて
InagakiTadashi
tadashi.1027 @ gmail.com
2013年 11月 20日 (水) 19:05:36 JST
石井様
いつもお世話になっております。
アイ・エス・ビー稲垣です。
すみません。ご返信が遅くなりました。
以下のような書き方だと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>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://www.sraoss.jp/pipermail/pgpool-general-jp/attachments/20131120/7bd47397/attachment-0001.html>
pgpool-general-jp メーリングリストの案内