[pgcluster: 978] Re: フェイルオーバのテストで pglbが落ちたり、クラスタを見失ったり(?)します

chiharu @ cg8.so-net.ne.jp chiharu @ cg8.so-net.ne.jp
2007年 4月 5日 (木) 12:19:22 JST


こんにちは、ナカノです。

レスありがとうございます>三谷様

sslは使用していません。
念のためsslオプションを外してリコンフィグ・リコンパイルしてみましたが現象変わりませんでした。
confファイル内のホスト名を全てIPに書き換えても変わらず。

最悪コネクションプーリングを捨てても、と思いプーリングoffでフェイルオーバをしてみたところ、1つ目のクラスタを落とした後、一回だけ2つめのクラスタサーバに接続成功、それ以降は全て0 ClusterDB can be usedとなり、アクセスしなくなってしまいます。
1つめのクラスタを落とした後のpglbのログは以下のようになっていました。
2007-04-05 11:49:46 [11707] DEBUG:set_recovery():received no:101
2007-04-05 11:49:46 [11707] DEBUG:PGRset_status_on_cluster_tbl():host:172.xx.xx.xxx port:5440 max:2 use:2 status99
                                               ----- psqlでpglbにアクセスしてみたら成功。
                                                                ----- select文実行成功
2007-04-05 11:50:18 [11706] DEBUG:PGRscan_cluster:1 ClusterDB can be used
2007-04-05 11:50:18 [11706] DEBUG:PGRscan_cluster:172.24.178.193 [5440],useFlag->99 max->2 use_num->0
2007-04-05 11:50:18 [11706] DEBUG:PGRscan_cluster:172.24.178.193 [5441],useFlag->1 max->2 use_num->0
2007-04-05 11:50:18 [11706] DEBUG:PGRset_status_on_cluster_tbl():host:172.xx.xx.xxx port:5441 max:2 use:1 status2
2007-04-05 11:50:18 [11730] DEBUG:PGRdo_child():I am 11730
2007-04-05 11:50:18 [11730] DEBUG:do_accept():I am 11730 accept fd 6
2007-04-05 11:50:18 [11730] DEBUG:read_startup_packet():Protocol Major: 3 Minor: 0 database: master user: postgres
(中略)
2007-04-05 11:51:58 [11730] DEBUG:Query(): select * from project;
2007-04-05 11:51:58 [11730] DEBUG:pool_process_query():read kind from backend T
2007-04-05 11:51:58 [11730] DEBUG:pool_process_query():read kind from backend pending data D len: 226 po: 795
2007-04-05 11:51:58 [11730] DEBUG:pool_process_query():read kind from backend pending data C len: 17 po: 1004
2007-04-05 11:51:58 [11730] DEBUG:pool_process_query():read kind from backend pending data Z len: 5 po: 1016
2007-04-05 11:51:58 [11730] DEBUG:ReadyForQuery(): message length: 5
2007-04-05 11:51:58 [11730] DEBUG:ReadyForQuery(): transaction state: I
                                               -----psql終了させたらそれ以降0 ClusterDB can be used
2007-04-05 11:52:01 [11730] DEBUG:ProcessFrontendResponse():read kind from frontend X(58)
2007-04-05 11:52:09 [11706] DEBUG:PGRscan_cluster:0 ClusterDB can be used
2007-04-05 11:52:09 [11706] DEBUG:PGRscan_cluster:172.xx.xx.xxx [5440],useFlag->99 max->2 use_num->0

2007-04-05 11:52:09 [11706] DEBUG:PGRscan_cluster:0 ClusterDB can be used
2007-04-05 11:52:09 [11706] DEBUG:PGRscan_cluster:172.24.178.193 [5440],useFlag->99 max->2 use_num->0

お手数おかけしてすいません。よろしくお願いします。


> -----Original Message-----
> From: a.mitani @ sra-europe.com
> Sent: Wed, Apr 4 2007 23:09:57 JST
> To: PGClusterメーリングリスト
> Subject: [pgcluster: 977] Re: フェイルオーバのテストで pglbが落ちたり、クラスタを見失ったり(?)します
> 
> こんにちは.
> 
> ロードバランサはSSLに対応していないのですが,
> ひょっとしてSSL通信されていたりしますか?
> 
> 三谷@オランダ
> 
> 
> 
> > こんばんは、初めて投稿させていただきます。ナカノと申します。
> > 社内環境で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.c
> > onf で最初に記述してあるクラスタサーバ(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 メーリングリストの案内