[pgpool-general-jp: 1374] Re: pcp_promote_nodeによるマスタ昇格ができない

Tatsuo Ishii ishii @ sraoss.co.jp
2015年 5月 6日 (水) 18:27:20 JST


pcp_promote_nodeによるノード昇格は、単に指定されたノードをpgpool-IIの内
部ステータス的にprimaryにするだけです。対象のPostgreSQLを実際に昇格させ
るわけではありません。

> 初めまして、吉崎と申します。
> 
> 
> 今回PostgreSQL2台とpgpool1台でマスタスレーブモードで動作させようと
> しております。
> 
> その際、pcp_promote_nodeコマンドを用いてマスタ昇格させようとすると
> 失敗を生じます。
> 
> pgpoolは3.3系と3.4系両方試験させていただきました。
> 
> 環境は下記となります。
> 
> pgpool{pgpool-1}(version3.3.6または3.4.2)
>> ├PostgreSQL1{pgpool-pgsql-1}(version9.4.1)
> └PostgreSQL2{pgpool-pgsql-2}(version9.4.1)
> 
> 上記の変更箇所の環境設定は下記になります
> pgpool.conf
> --------------------------------------------------------------
> listen_addresses = '*'
> port = 5432
> backend_hostname0 = 'pgpool-pgsql-1'
> backend_hostname1 = 'pgpool-pgsql-2'
> backend_port1 = 5432
> backend_weight1 = 1
> backend_data_directory1 = '/var/lib/pgsql/data'
> backend_flag1 = 'ALLOW_TO_FAILOVER'
> log_destination = 'syslog'
> syslog_facility = 'LOCAL1'
> master_slave_mode = on
> master_slave_sub_mode = 'stream'
> sr_check_user = 'postgres'
> health_check_period = 20
> health_check_user = 'postgres'
> failover_command = '/etc/pgpool-II/failover.sh %d %P %H %R'
> recovery_user = 'postgres'
> recovery_1st_stage_command = 'recovery_1st_stage'
> --------------------------------------------------------------
> 
> postgresql.conf
> -----------------------------------------
> listen_addresses = '*'
> wal_level = hot_standby
> synchronous_commit = on
> archive_mode = on
> archive_command = 'cp %p /var/lib/pgsql/pg_archive/%f'
> max_wal_senders = 5
> wal_keep_segments = 64
> wal_sender_timeout = 20s
> hot_standby = on
> wal_receiver_status_interval = 5s
> hot_standby_feedback = on
> log_filename = 'postgresql-%Y%m%d.log'
> -----------------------------------------
> 
> pg_hba.conf
> -----------------------------------------
> host    all             postgres        192.168.0.0/16          trust
> host    replication     postgres        192.168.0.0/16          trust
> host    replication     repl_user       192.168.0.0/16          trust
> -----------------------------------------
> 
> 上記の設定で、pcp_attach_node、pcp_detach_node実行
> またマスタ障害時のフェイルオーバの動作、リカバリは正常に動作しております。
> 
> ただ、pcp_promote_nodeコマンドやpgpoolAdminを用いてのマスタ昇格は
> マスタデータベースが切り離されるだけで、スレーブデータベースはマスタ昇格
> しておりません。
> 
> 
> 下記にコマンド実行時の結果、ログを表示させていただきます
> (方法は、スレーブのPostgreSQL2をマスタ昇格させようとしております)
> --------------------------------------------------
> pcp_promote_node -d 10 pgpool-1 9898 postgres postgres 1
> DEBUG: send: tos="R", len=46
> DEBUG: recv: tos="r", len=21, data=AuthenticationOK
> DEBUG: send: tos="E", len=6
> DEBUG: recv: tos="d", len=20, data=CommandComplete
> DEBUG: send: tos="X", len=4
> --------------------------------------------------
> 
> pgpoolログ
> --------------------------------------------------
> Apr 28 13:06:44 pgpool-1 pgpool[12261]: promote_backend: 1 promote node
> request from pid 12261
> Apr 28 13:06:44 pgpool-1 pgpool[7365]: starting promotion. promote host
> pgpool-pgsql-2(5432)
> Apr 28 13:06:44 pgpool-1 pgpool[7365]: Restart all children
> Apr 28 13:06:44 pgpool-1 pgpool[7365]: starting follow degeneration.
> shutdown host pgpool-pgsql-1(5432)
> Apr 28 13:06:44 pgpool-1 pgpool[7365]: failover: 1 follow backends have
> been degenerated
> Apr 28 13:06:44 pgpool-1 pgpool[7365]: failover: set new primary node: 1
> Apr 28 13:06:44 pgpool-1 pgpool[7365]: failover: set new master node: 1
> Apr 28 13:06:44 pgpool-1 pgpool[12275]: do_child: failback event found.
> restart myself.
> Apr 28 13:06:44 pgpool-1 pgpool[12277]: do_child: failback event found.
> restart myself.
> Apr 28 13:06:44 pgpool-1 pgpool[12276]: do_child: failback event found.
> restart myself.
> Apr 28 13:06:44 pgpool-1 pgpool[12278]: do_child: failback event found.
> restart myself.
> Apr 28 13:06:44 pgpool-1 pgpool[12279]: do_child: failback event found.
> restart myself.
> Apr 28 13:06:44 pgpool-1 pgpool[12262]: worker process received restart
> request
> Apr 28 13:06:44 pgpool-1 pgpool[7365]: promotion done. promoted host
> pgpool-pgsql-2(5432)
> Apr 28 13:06:44 pgpool-1 pgpool[12280]: do_child: failback event found.
> restart myself.
> Apr 28 13:06:44 pgpool-1 pgpool[12282]: do_child: failback event found.
> restart myself.
> Apr 28 13:06:44 pgpool-1 pgpool[12281]: do_child: failback event found.
> restart myself.
> Apr 28 13:06:45 pgpool-1 pgpool[12261]: pcp child process received
> restart request
> Apr 28 13:06:45 pgpool-1 pgpool[7365]: PCP child 12261 exits with status
> 256 in failover()
> Apr 28 13:06:45 pgpool-1 pgpool[7365]: fork a new PCP child pid 12283 in
> failover()
> Apr 28 13:06:45 pgpool-1 pgpool[7365]: worker child 12262 exits with
> status 256
> Apr 28 13:06:45 pgpool-1 pgpool[7365]: fork a new worker child pid 12284
> --------------------------------------------------

また、pcp_promote_nodeはフェイルオーバを引き起こしnode 0を切り離して終
了します。そのため、node 0はダウン状態となります。

> --------------------------------------------------
> pcp_node_info 10 pgpool-1 9898 postgres postgres 0
> pgpool-pgsql-1 5432 3 0.500000
> --------------------------------------------------
> 
> --------------------------------------------------
> pcp_node_info 10 pgpool-1 9898 postgres postgres 1
> pgpool-pgsql-2 5432 1 0.500000
> --------------------------------------------------
> 
> pgpoolAdmin上では下記のように表示されます
> --------------------------------------------------
> node 0 	pgpool-pgsql-1 	5432 	ノードダウン プライマリとして稼働中
> postgres: アップ 	0.500 		|
> node 1 	pgpool-pgsql-2 	5432 	ノード稼働中。接続有り。 スタンバイとして
> 稼働中 	postgres: アップ 	0.500
> --------------------------------------------------

pgpoolAdminは直接PostgreSQLにプライマリかどうかを聞きに行くため、このよ
うな表示になります。

> 上記状態でpgpool上でcreatedbを用いてデータベース作成しようとすると
> 下記エラーとなります
> --------------------------------------------------
> createdb -h pgpool-1 test
> createdb: データベースの生成に失敗しました:ERROR:  cannot execute
> CREATE DATABASE in a read-only transaction
> --------------------------------------------------
> 
> このためPostgreSQL1をpcp_attach_nodeでノードを復帰させると
> 問題なくcreatedbを実行できデータベース上にもデータベースが
> 作成されています。
> 
> どこか設定に問題がありノード昇格が出来なくなっているのでしょうか

この環境の場合でしたら、node 0のPostgreSQLをシャットダウンするのがnode
1を昇格させる確実な方法です。

pcp_promote_node は歴史的な経緯でサポートされていますが、普通は使わない
ほうが良いでしょう。

> 以上、よろしくお願いします
> 
> _______________________________________________
> pgpool-general-jp mailing list
> pgpool-general-jp @ sraoss.jp
> http://www.sraoss.jp/mailman/listinfo/pgpool-general-jp


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