[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 メーリングリストの案内