[pgcluster: 975] フェイルオーバのテストでpglbが落ちたり、クラスタを見失ったり(?)します
chiharu @ cg8.so-net.ne.jp
chiharu @ cg8.so-net.ne.jp
2007年 4月 4日 (水) 22:23:10 JST
こんばんは、初めて投稿させていただきます。ナカノと申します。
社内環境でPGClusterを使用したく動作検証を行っていますが、クラスタフェイルオーバのテストでロードバランサが思ったように動作せずに困っています。
当方の設定がおかしいのだろうと思いますが、どなたかご教授いただけないでしょうか。
動作環境)
OS: RedHat Enterprise Linux WS4
PGCluster Ver.:1.5.0rc16
config時のオプション)
$ configure --enable-thread-safety --enable-nls=ja --enable-multibyte=UNICODE --with-perl --with-python --with-tcl --with-openssl
ホストを3つ用意し、1つにpglb、1つにpgreplicate、残り1つでクラスタサーバを2つ動かします。
hostA hostB hostC
------------ ---------------- -------------
| | | | | |
| | | ------------ | | |
| |---| |portmaster| |---| |
| pglb | | ------------ | |pgreplicate|
|(port5432)| | (port5440) | | |
| | | | | |
| | | ------------ | | |
| |---| |portmaster| |---| |
| | | ------------ | | |
| | | (port5441) | | |
| | | | | |
------------ ---------------- -------------
起動手順)
クラスタ2つ->レプリケータ->バランサの順で起動します。
hostB% pg_ctl start -D /usr/local/pgsql/data
hostB% pg_ctl start -D /usr/local/pgsql/data2
hostC$ pgreplicate -D /usr/local/pgsql/etc -l
hostA# pglb -D /usr/local/pgsql/etc -n -v -l
psqlでhostA上のpglbにアクセスし、参照/更新が正常に行なわれるを確認。
現象1)
pglbをコネクションプーリングonにした状態で、pglb.conf/pgreplicate.conf で最初に記述してあるクラスタサーバ(5440 @ hostB)を落すと、数分後にhostA上のpglbが落ちてしまいます。
pglb(デバッグモード)のログ:
2007-04-03 21:08:49 [27163] DEBUG:PGRset_status_on_cluster_tbl():host:hostB port:5440 max:2 use:0 status1
2007-04-03 21:08:49 [27163] DEBUG:PGRset_status_on_cluster_tbl():host:hostB port:5441 max:2 use:0 status1
2007-04-03 21:08:49 [27163] DEBUG:init_pglb():Child_Tbl size is[144]
2007-04-03 21:08:49 [27163] DEBUG:PGRcreate_child():create child [5440 @ hostB]
2007-04-03 21:08:49 [27163] DEBUG:PGRcreate_child():create child [5440 @ hostB]
2007-04-03 21:08:49 [27163] DEBUG:PGRcreate_child():create child [5441 @ hostB]
2007-04-03 21:08:49 [27163] DEBUG:PGRcreate_child():create child [5441 @ hostB]
--- ここで 5440 @ hostBに対して pg_ctl stop -D /usr/local/pgsql/data -m i
2007-04-03 21:09:56 [27164] DEBUG:set_recovery():received no:101
2007-04-03 21:09:56 [27164] DEBUG:PGRset_status_on_cluster_tbl():host:hp8193 port:5440 max:2 use:1 status99
2007-04-03 21:09:56 [27163] ERROR:scan_cluster_by_pid():pid:27164 not found in child table
2007-04-03 21:09:56 [27163] ERROR:scan_cluster_by_pid():pid:27166 not found in child table
----ここで落ちる。
このときのpgreplicateのDEBUGログ:
2007-04-03 21:09:56 [9807] ERROR:PGRcreateConn():Retry. h_errno is 0,reason is 'could not connect to server: Connection refused
Is the server running on host "172.xx.xx.xxx" and accepting
TCP/IP connections on port 5440?
'
2007-04-03 21:09:56 [9807] ERROR:PGRcreateConn():Retry. h_errno is 0,reason is 'could not connect to server: Connection refused
Is the server running on host "172.xx.xx.xxx" and accepting
TCP/IP connections on port 5440?
'
2007-04-03 21:09:56 [9807] DEBUG:PGRsend_load_balance_packet():host[hostA] port[6001]
pglbを再起動した後、5440 @ hostB をリカバリモードで起動するとrsync による同期を取った後、通常運用可能となります。
2つめのクラスタ(5441 @ hostB)を落した時はバランサは落ちません。
1つめのクラスタが落ちてもバランサが落ちずに2つ目のクラスタで運用が続くようにしたいです。
現象2)
pglbをコネクションプーリングoffにして、現象1)と同様、pglb.conf/pgreplicate.conf で最初に記述してあるクラスタサーバ(5440 @ hostB)を落した後psqlでpglbにアクセスすると、以下の様なエラーが出てしまい、運用を続けることができません。
psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
pglbをデバッグモードで起動してみると、クラスタサーバが落ちたことを認識した後も常に同じクラスタ(5440 @ hostB)に対してのみアクセスしているようです。
2007-04-03 20:10:28 [7957] DEBUG:PGRscan_cluster:0 ClusterDB can be used
2007-04-03 20:10:28 [7957] DEBUG:PGRscan_cluster:hostB [5440],useFlag->2
max->2 use_num->0
2007-04-03 20:10:28 [8061] DEBUG:PGRdo_child():I am 8061
2007-04-03 20:10:28 [8061] DEBUG:do_accept():I am 8061 accept fd 6
2007-04-03 20:10:28 [8061] DEBUG:read_startup_packet():Protocol Major: 1234
Minor: 5679 database: user:
2007-04-03 20:10:28 [8061] DEBUG:PGRdo_child():SSLRequest: sent N; retry
startup2007-04-04 20:10:28 [8061] DEBUG:read_startup_packet():Protocol Major:
3 Minor: 0 database: master user: postgres
2007-04-03 20:10:28 [8061] ERROR:connect_inet_domain_socket(): connect()
failed: Connection refused
2007-04-03 20:10:28 [8061] DEBUG:PGRset_status_on_cluster_tbl():host:hostB
port:5440 max:2 use:2 status98
2007-04-03 20:10:40 [7957] ERROR:load_balance_main():all clusters were dead.
で、ログをよくみると、
"0 ClusterDB can be used"とか"all clusters were dead." 等、
pglbは全てのクラスタが落ちているとかんちがいしているようです。
(2つめのクラスタサーバが生きているのはpsqlで直接アクセスして確認。)
同一ホスト上で複数のクラスタを動かしているのが原因かと思い、2つ目のクラスタを新たにhostDを用意して移してみましたが2ケースとも同じ現象になります。
confファイル内のホスト名は、ドメインなしのホスト名のみ/FQDNどちらでやっても現象変わらずです。
hostA の pglb.conf ---
<Cluster_Server_Info>
<Host_Name> hostB </Host_Name>
<Port> 5440 </Port>
<Max_Connect> 2 </Max_Connect>
</Cluster_Server_Info>
<Cluster_Server_Info>
<Host_Name> hostB </Host_Name>
<Port> 5441 </Port>
<Max_Connect> 2 </Max_Connect>
</Cluster_Server_Info>
<Host_Name> hostA </Host_Name>
<Backend_Socket_Dir> /tmp </Backend_Socket_Dir>
<Receive_Port> 5432 </Receive_Port>
<Recovery_Port> 6001 </Recovery_Port>
<Max_Cluster_Num> 3 </Max_Cluster_Num>
<Use_Connection_Pooling> no </Use_Connection_Pooling> #現象1のときはここをyes
<LifeCheck_Timeout> 3s </LifeCheck_Timeout>
<LifeCheck_Interval> 15s </LifeCheck_Interval>
<Log_File_Info>
<File_Name> /usr/local/pgsql/log/pglb.log </File_Name>
<File_Size> 1M </File_Size>
<Rotate> 3 </Rotate>
</Log_File_Info>
5440 @ hostB のcluster.conf -----
<Replicate_Server_Info>
<Host_Name> hostC </Host_Name>
<Port> 8001 </Port>
<Recovery_Port> 8101 </Recovery_Port>
</Replicate_Server_Info>
<Host_Name> hostB </Host_Name>
<Recovery_Port> 7040 </Recovery_Port>
<Rsync_Path> /usr/bin/rsync </Rsync_Path>
<Rsync_Option> ssh -1 </Rsync_Option>
<Rsync_Compress> yes </Rsync_Compress>
<Pg_Dump_Path> /usr/local/pgsql/bin/pg_dump
</Pg_Dump_Path>
<When_Stand_Alone> read_only </When_Stand_Alone>
<Replication_Timeout> 1min </Replication_Timeout>
<LifeCheck_Timeout> 3s </LifeCheck_Timeout>
<LifeCheck_Interval> 11s </LifeCheck_Interval>
5441 @ hostB のcluster.conf -----
<Replicate_Server_Info>
<Host_Name> hostC </Host_Name>
<Port> 8001 </Port>
<Recovery_Port> 8101 </Recovery_Port>
</Replicate_Server_Info>
<Host_Name> hostB </Host_Name>
<Recovery_Port> 7040 </Recovery_Port>
<Rsync_Path> /usr/bin/rsync </Rsync_Path>
<Rsync_Option> ssh -1 </Rsync_Option>
<Rsync_Compress> yes </Rsync_Compress>
<Pg_Dump_Path> /usr/local/pgsql/bin/pg_dump
</Pg_Dump_Path>
<When_Stand_Alone> read_only </When_Stand_Alone>
<Replication_Timeout> 1min </Replication_Timeout>
<LifeCheck_Timeout> 3s </LifeCheck_Timeout>
<LifeCheck_Interval> 11s </LifeCheck_Interval>
hostC の pgreplicate.conf ---
<Cluster_Server_Info>
<Host_Name> hostB </Host_Name>
<Port> 5440 </Port>
<Recovery_Port> 7040 </Recovery_Port>
</Cluster_Server_Info>
<Cluster_Server_Info>
<Host_Name> hostB </Host_Name>
<Port> 5441 </Port>
<Recovery_Port> 7041 </Recovery_Port>
</Cluster_Server_Info>
<LoadBalance_Server_Info>
<Host_Name> hostA </Host_Name>
<Recovery_Port> 6001 </Recovery_Port>
</LoadBalance_Server_Info>
<Host_Name> hostC </Host_Name>
<Replication_Port> 8001 </Replication_Port>
<Recovery_Port> 8101 </Recovery_Port>
<RLOG_Port> 8301 </RLOG_Port>
<Response_Mode> normal </Response_Mode>
<Use_Replication_Log> no </Use_Replication_Log>
<Replication_Timeout> 1min </Replication_Timeout>
<LifeCheck_Timeout> 3s </LifeCheck_Timeout>
<LifeCheck_Interval> 15s </LifeCheck_Interval>
<Log_File_Info>
<File_Name> /usr/local/pgsql/log/pgreplicate.log </File_Name>
<File_Size> 1M </File_Size>
<Rotate> 3 </Rotate>
</Log_File_Info>
お手数おかけしますがよろしくお願いします。
pgcluster メーリングリストの案内