[pgcluster: 666] ロードバランサーについて

Akihiro Manabe spooky_mana @ ybb.ne.jp
2005年 2月 15日 (火) 21:32:22 JST


お世話になります、真鍋といいます。

PGCluster1.0.8dを使って以下の構成で環境を構築しています。

■全体の構成
・ロードバランサー    1台
・レプリケーションサーバ 1台
・クラスタサーバ     3台

■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万件のデータをDBの接続先をロードバランサーにして
インサートするだけのphpを用意し、
クラスタサーバ上でabを使ってテストをしました。
このときのabのコマンドは、
 ab -n 1 -c 3 http://localhost/test.php
です。
このabを実行した結果、DBに3万件入力されるはずのデータが、
2万件前後しか入っていなかったりと、データにばらつきが出て、
3万件がちゃんとインサートされることがありませんでした。

一方、phpからのDBの接続先を自分自身(localhost)にした場合、
つまり、ロードバランサー抜きのレプリケーションのみで
実行した場合は3万件のインサートが問題なく行われました。

ロードバランサーをデバッグモードで動かしたりして、情報を見たのですが、
特にエラーらしきものが発生しているようには見受けられませんでした。

以下に設定ファイルの内容を記載させていただきましたが、どこかおかしい箇所
はありますでしょうか?また、上記の試験方法がそもそも認識を間違えているこ
とがあれば是非教えていただければ幸いです。


■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>         6001     </Recovery_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>       7779        </Recovery_Port>
</Cluster_Server_Info>
<Cluster_Server_Info>
    <Host_Name>   real2 </Host_Name>
    <Port>        5432                </Port>
    <Recovery_Port>       7779        </Recovery_Port>
</Cluster_Server_Info>
<Cluster_Server_Info>
    <Host_Name>   real3   </Host_Name>
    <Port>        5432                </Port>
    <Recovery_Port>       7779       </Recovery_Port>
</Cluster_Server_Info>
<LoadBalance_Server_Info>
        <Host_Name>   lb2  </Host_Name>
        <Recovery_Port>       7780            </Recovery_Port>
</LoadBalance_Server_Info>
<Replication_Port>    8001            </Replication_Port>
<Recovery_Port>       8101            </Recovery_Port>
<Response_Mode>       normal          </Response_Mode>

■cluster.conf
<Replicate_Server_Info>
        <Host_Name> replicate2 </Host_Name>
        <Port> 8001 </Port>
        <Recovery_Port> 8101 </Recovery_Port>
</Replicate_Server_Info>
<Recovery_Port> 7001 </Recovery_Port>
<Rsync_Path> /usr/bin/rsync </Rsync_Path>
<Rsync_Option> ssh -2 </Rsync_Option>
<When_Stand_Alone> read_only  </When_Stand_Alone>

■テストに使ったtest.php
<?
$hostname = $_SERVER['SERVER_NAME'];
$microsec = microtime();
$host = "10.10.50.100";
$port = "5432";
$db = "testdb";
$user = "test";
$con = pg_connect( "host=$host port=$port dbname=$db user=$user" );
for( $i=0; $i<10000; $i++ ){
        $value1 = rand( 1, 10000 );
        $value2 = rand( 1, 10000 );
        $value3 = rand( 1, 10000 );
        $query = "insert into testtbl values ('" . $hostname . ":" . $microsec . "', $i, $value2, $value3 )";
        $result = pg_exec( $con, $query );
        if( $result ){
                print "$i OK<br>\n";
        }
        else{
                print "$i NG<br>\n";
        }
}
pg_close( $con );
?>

■pglb -nv で動かした際のログ(最後20行のみ)
DEBUG:ProcessFrontendResponse():read kind from frontend Q(51)
DEBUG:pool_read_string: read all from pending data. po:0 len:0
DEBUG:Query(): insert into testtbl values ('localhost:0.66770200 1108470179', 98, 6255, 6731 )
DEBUG:pool_process_query():read kind from backend P
DEBUG:pool_read_string: read all from pending data. po:6 len:18
DEBUG:pool_process_query():read kind from backend pending data C len: 17 po: 7
DEBUG:pool_read_string: read all from pending data. po:23 len:1
DEBUG:CompleteCommandResponse(): string: "INSERT 361628 1"
DEBUG:pool_process_query():read kind from backend pending data Z len: 0 po: 0
DEBUG:ProcessFrontendResponse():read kind from frontend Q(51)
DEBUG:pool_read_string: read all from pending data. po:0 len:0
DEBUG:Query(): insert into testtbl values ('localhost:0.66770200 1108470179', 99, 815, 6084 )
DEBUG:pool_process_query():read kind from backend P
DEBUG:pool_read_string: read all from pending data. po:6 len:18
DEBUG:pool_process_query():read kind from backend pending data C len: 17 po: 7
DEBUG:pool_read_string: read all from pending data. po:23 len:1
DEBUG:CompleteCommandResponse(): string: "INSERT 361629 1"
DEBUG:pool_process_query():read kind from backend pending data Z len: 0 po: 0
DEBUG:ProcessFrontendResponse():read kind from frontend X(58)
DEBUG:pool_connection_pool_timer():pool_connection_pool_timer: called

-- 
Akihiro Manabe




pgcluster メーリングリストの案内