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

sai kato tmi.katosai @ gmail.com
2014年 11月 11日 (火) 10:58:34 JST


はじめまして、加藤と申します。



(文字化けしておりましたので、再送させていただきます)

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/20141111/784d0328/attachment-0001.html>


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