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

sai kato tmi.katosai @ gmail.com
2014年 11月 13日 (木) 16:39:42 JST


石井様

お世話になっております。加藤です。

ご回答ありがとうございます。
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を実行してよいのか?
> >
> >
> >
> >
> >
> > ご存知の方がおられましたらご教授お願い致します。
> >
> > お手数ですが、よろしくお願いします。
>
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
URL: <http://www.sraoss.jp/pipermail/pgpool-general-jp/attachments/20141113/a8e1a937/attachment-0001.html>


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