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