[pgcluster: 761] PGCluster-1.3.0cのロードバランサーでクラスタサーバの障害を検知出来ない

Akihiro Manabe pgcluster@ml.postgresql.jp
Wed, 16 Mar 2005 18:58:34 +0900


お世話になります。
真鍋です。

以前、バージョン1.0.8の件で質問させて頂いていましたが、
前回のバージョンアップで解決しました。
ありがとうございました。

今回、OIDのレプリケートが必要になってきたため、
PGCluster-1.3.0cを用いてテストを行っているのですが、
ロードバランサーでクラスタサーバの障害を検知出来ません。
原因または解決策をご存じの方はいらっしゃいませんか。

環境は以下の通りです。

■全体の構成及びマシン名
・ロードバランサー(lb2)         1台
・レプリケーションサーバ(replicate-tmp) 1台
・クラスタサーバ(real1〜3)        3台
(すべてPGCluster-1.3.0c)

■OS及びマシンスペック
・ロードバランサー
 OS: Debian3.1-sarge
 CPU: Pentium 3 668MHz
 Memory: 256M
・レプリケーションサーバ
 OS: Debian3.1-sarge
 CPU: Pentium 3 1GHz
 Memory: 256M
・クラスタサーバ(3台とも)
 OS: Debian3.1-sarge(LVS使用のためkernel-2.4.22-1-ipvsに変更)
 CPU: Pentium 4 3.2GHz
 Memory: 1G

この環境で以下の手順でテストを行いました。

1. レプリケート、クラスタ3台、ロードバランサーの順で起動
2. pgcbenchを使って負荷分散の動作確認
  コマンドは
   'pgcbench -i -h lb2 -p 5432 testdb'
   'pgcbench -c 100 -t 1000 -h lb2 -p 5432 testdb'
  をreal3で実行
3. real2のpostgresqlをシャットダウン(pg_ctl stop)
4. 再度pgcbenchをreal3で実行(pgcbench -c 100 -t 1000 -h lb2 -p 5432 testdb')
5. real2をリカバリモードで起動(pg_ctl start -o '-R')

手順3でクラスタサーバを落としているのですが、
レプリケーションサーバのステータスログでは
クラスタサーバの障害が表示されましたが、
ロードバランサーのステータスログでは表示されませんでした。

次に手順4で再度pgcbenchを実行したところ、
ロードバランサーから落としたクラスタサーバにクエリが飛んでおり、
障害後の切り離しが出来ていないようです。
これはtcpdumpを用いて確認しています。
(tcpdump -i eth1 src host lb2 and dst port 5432)

最後に手順5でクラスタサーバを復帰させたところ、
レプリケーションサーバのステータスログ、
ロードバランサーのステータスログともに
クラスタサーバの復帰が表示されました。

以上の作業を行った際のログと設定ファイルは以下の通りです。

■pgreplicate.sts
Wed Mar 16 18:03:22 2005  port(5432) host:real1 start use
Wed Mar 16 18:03:22 2005  port(5432) host:real2 start use
Wed Mar 16 18:03:22 2005  port(5432) host:real3 start use
Wed Mar 16 18:03:22 2005  cascade(replicate-tmp) port(8001) start use
Wed Mar 16 18:05:58 2005  port(5432) host:real2 error
Wed Mar 16 18:07:31 2005  port(5432) host:real2 initialize
Wed Mar 16 18:07:31 2005  port(5432) host:real2 initialize
Wed Mar 16 18:07:32 2005  port(5432) host:real2 error
Wed Mar 16 18:07:44 2005  port(5432) host:real2 start use
Wed Mar 16 18:07:44 2005  port(5432) host:real2 start use

■pglb.sts
Wed Mar 16 18:03:07 2005  port(5432) host:real1 start use
Wed Mar 16 18:03:07 2005  port(5432) host:real2 start use
Wed Mar 16 18:03:07 2005  port(5432) host:real3 start use
Wed Mar 16 18:06:12 2005  port(5432) host:real1 start use
Wed Mar 16 18:06:12 2005  port(5432) host:real2 start use

■pglb.conf
<Cluster_Server_Info>
    <Host_Name>   real1               </Host_Name>
    <Port>        5432                </Port>
    <Max_Connect> 32                  </Max_Connect>
</Cluster_Server_Info>
<Cluster_Server_Info>
    <Host_Name>   real2               </Host_Name>
    <Port>        5432                </Port>
    <Max_Connect> 32                  </Max_Connect>
</Cluster_Server_Info>
<Cluster_Server_Info>
    <Host_Name>   real3               </Host_Name>
    <Port>        5432                </Port>
    <Max_Connect> 32                  </Max_Connect>
</Cluster_Server_Info>
<Backend_Socket_Dir>    /tmp     </Backend_Socket_Dir>
<Receive_Port>          5432     </Receive_Port>
<Recovery_Port>         6101     </Recovery_Port>
<LifeCheck_Port>        6201     </LifeCheck_Port>
<Max_Cluster_Num>        128     </Max_Cluster_Num>
<Use_Connection_Pooling>  no     </Use_Connection_Pooling>

■pgreplicate.conf
<Cluster_Server_Info>
    <Host_Name>           real1       </Host_Name>
    <Port>                5432        </Port>
    <Recovery_Port>       7101        </Recovery_Port>
    <LifeCheck_Port>      7201        </LifeCheck_Port>
</Cluster_Server_Info>
<Cluster_Server_Info>
    <Host_Name>           real2       </Host_Name>
    <Port>                5432        </Port>
    <Recovery_Port>       7101        </Recovery_Port>
    <LifeCheck_Port>      7201        </LifeCheck_Port>
</Cluster_Server_Info>
<Cluster_Server_Info>
    <Host_Name>           real3       </Host_Name>
    <Port>                5432        </Port>
    <Recovery_Port>       7101        </Recovery_Port>
    <LifeCheck_Port>      7201        </LifeCheck_Port>
</Cluster_Server_Info>
<LoadBalance_Server_Info>
    <Host_Name>           lb2         </Host_Name>
    <Recovery_Port>       6101        </Recovery_Port>
    <LifeCheck_Port>      6201        </LifeCheck_Port>
</LoadBalance_Server_Info>
<Status_Log_File>  /tmp/pgreplicate.sts  </Status_Log_File>
<Error_Log_File>   /tmp/pgreplicate.log  </Error_Log_File>
<Replication_Port>       8001            </Replication_Port>
<Recovery_Port>          8101            </Recovery_Port>
<LifeCheck_Port>         8201            </LifeCheck_Port>
<RLOG_Port>              8301            </RLOG_Port>
<Response_Mode>        normal            </Response_Mode>
<Use_Replication_Log>      no            </Use_Replication_Log>
<Reserved_Connections>      1            </Reserved_Connections>

■cluster.conf
<Replicate_Server_Info>
        <Host_Name> replicate-tmp </Host_Name>
        <Port> 8001 </Port>
        <Recovery_Port> 8101 </Recovery_Port>
        <LifeCheck_Port> 8201 </LifeCheck_Port>
</Replicate_Server_Info>
<Recovery_Port> 7101 </Recovery_Port>
<LifeCheck_Port> 7201 </LifeCheck_Port>
<Rsync_Path> /usr/bin/rsync </Rsync_Path>
<Rsync_Option> ssh -2 </Rsync_Option>
<When_Stand_Alone> read_only  </When_Stand_Alone>
<Status_Log_File>  /tmp/cluster.sts </Status_Log_File>
<Error_Log_File> /tmp/cluster.log  </Error_Log_File>


-- 
Akihiro Manabe <spooky_mana@ybb.ne.jp>