[pgcluster: 442] クラスタDB停止時のレプリケーションサーバの振る舞いについて
AOSHIMA Kentaro
pgcluster@ml.postgresql.jp
Wed, 04 Aug 2004 13:50:38 +0900
三谷様
皆様
いつも大変お世話になっております。
青嶋と申します。
吉田さんとともに検証をしております。
昨日ご報告させて頂いた件について、
av11への早速ご対応頂きましてありがとうございました。
別件ではありますが、お教え頂ければ幸いです。
===はじめに===
PGRsend_load_balance_packet内で、
ロードバランサのホスト名等がデバック文にて表示されないことから、
この部分で、オンコードにてロードバランサのホスト名を記述して
動作の確認を行いました。(av11で修正されたところでしょうか?)
(recovery.c PGRsend_load_balance_packet内でlbp->hostName等を
オンコードでロードバランサの設定を行いました)
===事象===
レプリケーションサーバが検知したクラスタDBのエラー(停止)を
ロードバランサに通知した際、ロードバランサはそのパケット内容を理解してい
ないのではという事象が発生致しました。
===手順について===
手順は以下のとおりです。
デバッグ文を埋め込みソースを追った経過も記載致します。
設定ファイルの詳細は文末に記載致しました。
(1)レプリケーション、クラスタDB(2つ)、ロードバランサの順で起動
ログ等にERRORはありませんでした。
(2)2台のクラスタDBのうち一つを停止した後、
クライアントから接続を行い、Insert文を発行
(3)レプリケーションサーバのデバック文を見たところ
停止しているクラスタDBへ数回レプリケートを行おうと試み、
接続不可能なため、停止したクラスタDBを"not ready"と見なしています。
(4)レプリケーションサーバは停止したDBに対して、
replicate.cのPGRset_host_statusにてDB_TBL_ERROR(-1)を設定します。
send_cluster_status_load_balance内でクラスタDBへの送信パケットの
packet_noをDB_TBL_ERROR と設定しています。
(5)PGRsend_load_balance_packetにて、
(4)で作成したパケットをロードバランサのRecoveryPortに向けて
送信しています。
(6)ロードバランサ側では、そのパケットをレシーブするものの
case文内で処理されずそのままスルーしているようでした。
その際の"received no"は、65535でした。
===質問===
クラスタDBのエラー検知・ロードバランサの振る舞いにについて
以下のように理解しております。
下記1,2理解のもとで、(1)〜(6)を考慮すると、
(6)のcase文にTBL_ERRORを設定する箇所が無いように思われるのですが、
如何でしょうか?
1 レプリケーションサーバが検知したクラスタDBのエラーを、
ロードバランサのRecoveryPortに向けて通知する。
2 1であるとした場合、
ロードバランサが受け取ったパケットは、set_recovery内で処理され、
ロードバランサが持つClusterTblの該当クラスタのuseFlagが
TBL_ERRORに設定され、以後振り分け対象としない。
以上、大変お忙しいところ恐縮ではありますが、
上記事象について、御教授頂ければ幸いです。
また、当方の理解不足による誤り等ございましたら、
ご指摘賜りたく存じます。
よろしくお願いいたします。
==詳細情報===
サーバの構成は以下の通りです。
・ロードバランサ1台
・クラスタDB2台
・レプリケーションサーバ1台
・テスト用マシン2台
・OS:RedHatEL AS3.0
・PGCluster1.0.7を使用
・全て同一セグメント上のLANに配置
=============== LB:pglb.conf ===============
<Cluster_Server_Info>
<Host_Name> dl1401 </Host_Name>
<Port> 5432 </Port>
<Max_Connect> 20 </Max_Connect>
</Cluster_Server_Info>
<Cluster_Server_Info>
<Host_Name> dl1402 </Host_Name>
<Port> 5432 </Port>
<Max_Connect> 20 </Max_Connect>
</Cluster_Server_Info>
<Backend_Socket_Dir> /tmp </Backend_Socket_Dir>
<Receive_Port> 5432 </Receive_Port>
<Recovery_Port> 7780 </Recovery_Port>
<Max_Cluster_Num> 5 </Max_Cluster_Num>
<Use_Connection_Pooling> no </Use_Connection_Pooling>
=============== DB1,DB2:cluster.conf ===============
<Replicate_Server_Info>
<Host_Name> gx240 </Host_Name>
<Port> 8777 </Port>
<Recovery_Port> 7778 </Recovery_Port>
</Replicate_Server_Info>
<Recovery_Port> 7779 </Recovery_Port>
<Rsync_Path> /usr/bin/rsync </Rsync_Path>
<Rsync_Option> ssh -1 </Rsync_Option>
<When_Stand_Alone> read_only </When_Stand_Alone>
=============== DB1,DB2:postgresql.conf ===============
max_connections = 5
port = 5432
=========== Replication:pgreplicate.conf ============
<Cluster_Server_Info>
<Host_Name> dl1401 </Host_Name>
<Port> 5432 </Port>
<Recovery_Port> 7779 </Recovery_Port>
</Cluster_Server_Info>
<Cluster_Server_Info>
<Host_Name> dl1402 </Host_Name>
<Port> 5432 </Port>
<Recovery_Port> 7779 </Recovery_Port>
</Cluster_Server_Info>
<LoadBalance_Server_Info>
<Host_Name> gx150 </Host_Name>
<Recovery_Port> 7780 </Recovery_Port>
</LoadBalance_Server_Info>
<Replication_Port> 8777 </Replication_Port>
<Recovery_Port> 7778 </Recovery_Port>
============================
青嶋 憲太郎 AOSHIMA Kentaro
aoshima.kentaro@nttcom.co.jp
============================