[pgpool-general-jp: 1329] Re: failover_commandの中でpcp_attach_nodeするとBackendError

Tatsuo Ishii ishii @ sraoss.co.jp
2014年 11月 19日 (水) 09:11:43 JST


加藤様

スタンバイノードが落ちた時のログ(/var/log/pgpool/failover2.log)を見せて
いただけますか?
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese:http://www.sraoss.co.jp

> 石井様
> 
> お世話になっております。加藤です。
> 
> ご回答ありがとうございます。
> failover.shは以下の通りです。
> ------------------------------------------------
> #! /bin/sh
> # Execute command by failover.
> # special values:  %d = node id
> #                  %h = host name
> #                  %p = port number
> #                  %D = database cluster path
> #                  %m = new master node id
> #                  %M = old master node id
> #                  %H = new master node host name
> #                  %P = old primary node id
> #                  %R = new master database cluster path
> #                  %r = new master port number
> #                  %% = '%' character
> failed_node_id=$1
> failed_host_name=$2
> failed_port=$3
> failed_db_cluster=$4
> 
> new_master_id=$5
> old_master_id=$6
> new_master_host_name=$7
> old_primary_node_id=$8
> new_master_port_number=$9
> new_master_db_cluster=${10}
> 
> log=/var/log/pgpool/failover2.log
> 
> PGPOOL_HOME=/usr/pgsql-9.3
> PG_CTL=$PGPOOL_HOME/bin/pg_ctl
> POSTMASTER=$PGPOOL_HOME/bin/postmaster
> 
> PCP_PORT=9898
> PCP_SUPER_USER=postgres
> 
> 
> echo "" >> $log
> date >> $log
> echo "user[`whoami`] failed_node_id[$failed_node_id]
> failed_host_name[$failed_host_name] failed_port[$failed_port]
> failed_db_cluster[$failed_db_cluster] ### old_master_id[$old_master_id]
> old_primary_node_id[$old_primary_node_id] ### new_master_id[$new_master_id]
> new_master_host_name[$new_master_host_name]
> new_master_port_number[$new_master_port_number]
> new_master_db_cluster[$new_master_db_cluster]" >> $log
> 
> # masterが落ちた場合
> if [ a"$failed_node_id" = a"$old_primary_node_id" ];then # master failed
> echo "ssh -l postgres -T $new_master_host_name $PG_CTL -D
> $new_master_db_cluster promote" >> $log
> ssh -l postgres -T $new_master_host_name $PG_CTL -D $new_master_db_cluster
> promote
> else
> 
> ############################
> # スタンバイノードの起動
> ############################
> echo "ssh -l postgres -T $failed_host_name $POSTMASTER -i -p $failed_port
> -D $failed_db_cluster &" >> $log
> ssh -l postgres -T $failed_host_name $POSTMASTER -i -p $failed_port -D
> $failed_db_cluster & >> $log 2>&1 < /dev/null
> sleep 2
> 
> 
> ############################
> # スタンバイノードの復帰
> ############################
> echo "/usr/local/pgpool-3.3/bin/pcp_attach_node 5 localhost $PCP_PORT
> $PCP_SUPER_USER $PCP_SUPER_USER $failed_node_id" >> $log
> /usr/local/pgpool-3.3/bin/pcp_attach_node 5 localhost $PCP_PORT
> $PCP_SUPER_USER $PCP_SUPER_USER ${failed_node_id} >> $log 2>&1
> 
> fi
> ------------------------------------------------
> 
> お忙しいところすみませんが、ご確認いただけないでしょうか。
> よろしくお願い致します。
> 
> 
> 2014年11月13日 8:14 Tatsuo Ishii <ishii @ sraoss.co.jp>:
> 
>> 石井です。
>>
>> 添付してあるfailover.shは抜粋だと思います。
>> 全部見られたらなにか分かるかもしれません。
>> --
>> Tatsuo Ishii
>> SRA OSS, Inc. Japan
>> English: http://www.sraoss.co.jp/index_en.php
>> Japanese:http://www.sraoss.co.jp
>>
>> From: sai kato <tmi.katosai @ gmail.com>
>> Subject: [pgpool-general-jp: 1324]
>> failover_commandの中でpcp_attach_nodeするとBackendError
>> Date: Tue, 11 Nov 2014 10:58:34 +0900
>> Message-ID: <
>> CAEn1G_G712mFK0LFvxiZ+8c7t+NCk_wUqzWpmLG2FJCRTm+rqA @ mail.gmail.com>
>>
>> > はじめまして、加藤と申します。
>> >
>> >
>> >
>> > (文字化けしておりましたので、再送させていただきます)
>> >
>> > PgpoolⅡ3.3.4でエラーが発生しましたが、原因がわからないため、
>> >
>> > 困っております。
>> >
>> > ■環境
>> >
>> > OS:全てCentOS6.4
>> >
>> > DB:PostgreSQL9.3.4
>> >
>> > Pgpool:PgpoolⅡ3.3.4
>> >
>> >
>> >
>> > PC1:pgpool
>> >
>> >    |-------PC2:DB1(マスタ)
>> >
>> >    |-------PC2:DB2(スレーブ)
>> >
>> >    |-------PC2:DB3(スレーブ)
>> >
>> >
>> >
>> > DB1、DB2、DB3は同期レプリケーションをしており、
>> >
>> > DB1がマスタ、DB2,DB3はスレーブとなっております。
>> >
>> >
>> >
>> > ■現象
>> >
>> > マスタのDB1がフェールオーバした場合は、以下のコマンドが実行されました。
>> >
>> > ①failover_command
>> >
>> > ②follow_master_command
>> >
>> >
>> >
>> > コマンドの内容は以下の通りです。
>> >
>> > ①:スレーブを新マスタへ昇格
>> >
>> > ②:・旧マスタのrecovery.conf設定とDB起動、オンライン復帰
>> >
>> > ・他のスレーブのrecovery.conf設定とDB再起動、オンライン復帰
>> >
>> >
>> >
>> > 上記コマンドにより、DB1は自動でオンライン復帰することが出来ました。
>> >
>> >
>> >
>> > 次に、スレーブのDB2がフェールオーバした場合は、以下のコマンドが実行されました。
>> >
>> > ①failover_command
>> >
>> >
>> >
>> > failover_commandしか実行されないため、このコマンドにスレーブDBのリカバリの
>> >
>> > 処理をさせようと考えました。
>> >
>> > コマンドの内容は以下の通りです。
>> >
>> > ①:スレーブDBの起動、オンライン復帰
>> >
>> >
>> >
>> > ①のコマンドの中でオンライン復帰(pcp_attach_node)が実行されると、
>> >
>> > BackendErrorとなりました。
>> >
>> >
>> >
>> > エラーの後に、①で実施したpcp_attach_nodeをプロンプト上から実行すると、
>> >
>> > 成功しました。
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> > ■pgpool.log
>> >
>> > ログは以下の通りです。
>> >
>> > 2014-10-31 16:04:56 LOG:   pid 1732: pcp child process received restart
>> > request
>> >
>> > 2014-10-31 16:04:56 LOG:   pid 1573: PCP child 1732 exits with status 256
>> > in failover()
>> >
>> > 2014-10-31 16:04:56 LOG:   pid 1573: fork a new PCP child pid 1788 in
>> > failover()
>> >
>> > 2014-10-31 16:04:56 DEBUG: pid 1573: health check: clearing alarm
>> >
>> > 2014-10-31 16:04:56 DEBUG: pid 1573: failover_handler called
>> >
>> > 2014-10-31 16:04:56 DEBUG: pid 1573: failover_handler: starting to select
>> > new master node
>> >
>> > 2014-10-31 16:04:56 ERROR: pid 1573: failover_handler: invalid node_id -1
>> > MAX_NUM_BACKENDS: 128
>> >
>> > 2014-10-31 16:04:56 DEBUG: pid 1573: reap_handler called
>> >
>> > 2014-10-31 16:04:56 DEBUG: pid 1573: reap_handler: call wait3
>> >
>> > 2014-10-31 16:04:56 LOG:   pid 1573: worker child 1733 exits with status
>> 256
>> >
>> > 2014-10-31 16:04:56 LOG:   pid 1573: fork a new worker child pid 1789
>> >
>> >
>> >
>> > ログのエラー内容からみると、pcp_attach_nodeに指定したノードIDが不正のようです。
>> >
>> >
>> >
>> > ■pgpool.conf
>> >
>> > 設定は以下の通りです。
>> >
>> > replication_mode = off
>> >
>> > load_balance_mode = on
>> >
>> > connection_cache = off
>> >
>> > master_slave_mode = on
>> >
>> > master_slave_sub_mode = 'stream'
>> >
>> > sr_check_period = 10
>> >
>> > sr_check_user = 'postgres'
>> >
>> > sr_check_password = 'postgres'
>> >
>> > delay_threshold = 10000000
>> >
>> > backend_hostname0 = 'xxxx' ←PC2のIP
>> >
>> > backend_port0 = 5432
>> >
>> > backend_weight0 = 1
>> >
>> > backend_hostname1 = 'xxxx' ←PC2のIP
>> >
>> > backend_port1 = 5433
>> >
>> > backend_weight1 = 1
>> >
>> > backend_hostname2 = 'xxxx' ←PC2のIP
>> >
>> > backend_port2 = 5434
>> >
>> > backend_weight2 = 1
>> >
>> > follow_master_command = '/usr/local/pgpool-3.3/bin/follow_master.sh %d %h
>> > %p %D %m %M %H %P %r %R'
>> >
>> > failover_command = '/usr/local/pgpool-3.3/bin/failover.sh %d %h %p %D %m
>> %M
>> > %H %P %r %R'
>> >
>> >
>> >
>> >
>> >
>> > ■failover.sh
>> >
>> > ############################
>> >
>> > # スタンバイノードの起動
>> >
>> > ############################
>> >
>> > ssh -l postgres -T $failed_host_name $POSTMASTER -i -p $failed_port -D
>> > $failed_db_cluster & >> $log 2>&1 < /dev/null
>> >
>> > sleep 2
>> >
>> >
>> >
>> > ############################
>> >
>> > # スタンバイノードの復帰
>> >
>> > ############################
>> >
>> > /usr/local/pgpool-3.3/bin/pcp_attach_node 5 localhost $PCP_PORT
>> > $PCP_SUPER_USER $PCP_SUPER_USER $failed_node_id >> $log 2>&1
>> >
>> >
>> >
>> >
>> >
>> > ■質問
>> >
>> > ①pcp_attach_nodeが失敗する原因は何でしょうか?対応方法はあるでしょうか?
>> >
>> > ②スレーブDBのフェールオーバ時の対応は上記で合っているでしょうか?
>> >
>> > →failover_commandの中でpcp_attach_nodeを実行してよいのか?
>> >
>> >
>> >
>> >
>> >
>> > ご存知の方がおられましたらご教授お願い致します。
>> >
>> > お手数ですが、よろしくお願いします。
>>


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