[pgcluster: 791] 同時に2つのセッションからアクセスすると無応答になる
ASP森山 和宏
moriyama @ allforsp.co.jp
2005年 6月 24日 (金) 12:11:21 JST
はじめまして、森山と申します。
現在PGCluster 1.3.0c と 1.1.1a のフルパッケージ版を
試させていただいています。
OS:Red Hat Linux release 9 (Shrike)
Kernel 2.4.20-8 on an i686
構成
LBサーバ 1
クラスタDB 3
RPサーバ 1
テストのため1台のサーバで全部を起動しています。
1.3.0c と 1.1.1a は交互に起動しテストしました。
構成後レプリケーション確認のため
マスタDBだけに1レコードを発生させ、残り2つのクラスタDBを-Rをつけて起動し
正常にマスタDBよりレプリケーションされることは確認しました。
LBサーバからも1レコードを発生させ、すべてのクラスタサーバにデータが登録
されるのを確認しました。
ロックを含むDB更新を1実行で1000回繰り返す処理をPHPより実行したところ
1セッションでは正常に終了するが、2セッション同時に実行すると、必ず無応答に
なってしまいました。
現象は、ロードバランサ経由でも、2つのクラスタサーバに直接つないでも同様に無応答になりました。
処理の内容はこんな感じです
DB接続
トランザクション開始
テーブルロック
テーブル内のカウント番号の最大値を取得するSQLを実行
カウントに+1
レコードをインサート
トランザクション終了
(トランザクション開始から終了を1000回繰り返し)
DB切断
試しに、TeraTermにてDBを2セッション開き下記の順番でDBにコマンドを
入力したところ必ず無応答になりました。
セッション1:S1
セッション2:S2
S1:BEGIN;
S2:BEGIN;
S1:LOCK TABLE A;
S1:INSERT INTO A(no) VALUES (1);
S2:SELECT * FROM A;←(無応答:これは正しい)
S1:ROLLBACK;←(無応答:ここがおかしい)
S2:CTRL+C でSELECTをキャンセル(キャンセルメッセージは帰ってくるが無応答)
この状態でPSコマンドを実行してみると下記感じで処理が止まっています。
また、この状態をしばらく放置してもロック解除はされないようです。
23511 pts/1 S 0:00 ./bin/psql -p 5432 cl_testdb
23513 pts/4 S 0:00 postgres: postgres cl_testdb [local] idle in
transaction
23515 pts/3 S 0:00 ./bin/psql -p 5432 cl_testdb
23517 pts/4 S 0:00 postgres: postgres cl_testdb [local] SELECT
waiting
23521 pts/4 S 0:00 postgres: postgres cl_testdb 192.168.1.103 idle
in transaction
23524 pts/4 S 0:00 postgres: postgres cl_testdb 192.168.1.103 idle
in transaction
23535 pts/4 S 0:00 postgres: postgres cl_testdb 192.168.1.103 SELECT
waiting
23536 pts/4 S 0:00 postgres: postgres cl_testdb 192.168.1.103 SELECT
waiting
何か回避策は有りますでしょうか。
以上、よろしくお願い致します。
pgcluster メーリングリストの案内