[pgcluster: 714] pgreplicateが固まります

Seiryu Fumio BX7S-SIRY @ asahi-net.or.jp
2005年 3月 9日 (水) 20:19:46 JST


はじめまして、清流と申します。
長文失礼致します。

現在、PGClusterの導入するための動作テストを行っているのですが、
以下の条件でpgreplicateが固まってしまいます。

・全体構成
クラスタサーバー2台(db-cl1、db-cl2)
レプリケーションサーバー2台(db-rp1、db-rp2)
すべて別サーバ上で稼働。

・OSなど
OS: Red Hat Enterprise Linux ES release 3 (Taroon Update 4)
CPU: Xeon 3.4GHz Dual
メモリ: クラスター 5GB、レプリケーション 4GB
PostgreSQL 7.3.8 + PGCluster 1.0.8d
クラスターの/proc/sys/kernel/shmmax: 268435456
クラスターの/proc/sys/kernel/shmall: 268435456

・落ちたときの状況
db-cl1で下記の「テスト用初期化SQL」を実行し、テーブルとデータ(10万レコード)を用意。
db-cl2にもテーブルとレコードがあることを確認。
db-cl1で下記の「テスト用SQL1」を実行しつつ、
db-cl2で下記の「テスト用SQL2」を実行する。

そうするとそれぞれが1500レコードぐらいを更新したところで、
クラスターで以下のようなエラーメッセージが表示され、
レプリケーションサーバーが固まります。
ERROR:  replication server should be down, transaction aborted.

レプリケーションサーバーが落ちた後は、UPDATEなどを実行しても、
反応が返ってこなくなります。SELECTは実行できます。
全サーバを再起動すると、正常に戻ります。
また SELECT と UPDATE を外して begin と end だけにしても、
さらに end を abort にしても同じく固まります。
このときの設定や、pgreplicateのデバッグログの一部を以下に貼り付けます。

デバッグログとソースを見た限りでは、ログの最後から15行目のところに
sem_lock がありますが、そのあとに sem_unlock がないので、
最後の sem_lock がずっと待機になっているのではないかと思いますが、
それ以上のことは分かりませんでした。

・固まらないケース1
db-cl1から「テスト用SQL1」のようなSQLを
同時に5つ実行してみましたが、正常に処理されました。

・固まらないケース2
db-cl1とdb-cl2から、「テスト用SQL1」のようなSQLのUPDATE文だけを
同時に5つずつ実行してみましたが、正常に処理されました。

それでは、よろしくお願いします。

--------------------------テスト用初期化SQL--------------------------
CREATE TABLE session_id (
    id text not null, 
    name text, 
    ip text, 
    limitime int4, 
    cookie int4 );

CREATE UNIQUE INDEX session_id_id ON session_id ( id );

INSERT INTO session_id VALUES ( 'a-0', 'aaa', '192.168.0.1', 1000, 1 );
〜省略〜
INSERT INTO session_id VALUES ( 'a-9999', 'aaa', '192.168.0.1', 1000, 1 );
INSERT INTO session_id VALUES ( 'b-0', 'aaa', '192.168.0.1', 1000, 1 );
〜省略〜
INSERT INTO session_id VALUES ( 'j-9999', 'aaa', '192.168.0.1', 1000, 1 );
--------------------------テスト用初期化SQL--------------------------

----------------------------テスト用SQL1----------------------------
begin;
SELECT * FROM session_id WHERE id = 'a-0' for update;
UPDATE session_id SET name = 'tran' WHERE id = 'a-0';
end;
begin;
SELECT * FROM session_id WHERE id = 'a-1' for update;
UPDATE session_id SET name = 'tran' WHERE id = 'a-1';
end;
〜省略〜
begin;
SELECT * FROM session_id WHERE id = 'a-9999' for update;
UPDATE session_id SET name = 'tran' WHERE id = 'a-9999';
end;
----------------------------テスト用SQL1----------------------------

----------------------------テスト用SQL2----------------------------
begin;
SELECT * FROM session_id WHERE id = 'b-0' for update;
UPDATE session_id SET name = 'tran' WHERE id = 'b-0';
end;
begin;
SELECT * FROM session_id WHERE id = 'b-1' for update;
UPDATE session_id SET name = 'tran' WHERE id = 'b-1';
end;
〜省略〜
begin;
SELECT * FROM session_id WHERE id = 'b-9999' for update;
UPDATE session_id SET name = 'tran' WHERE id = 'b-9999';
end;
----------------------------テスト用SQL2----------------------------

----------------pgreplicateのデバッグログの最後100行----------------
DEBUG:PGRsend_replicate_packet_to_server():connect db:pgcltest port:5432 user:root host:db-cl1 query:UPDATE session_id SET name = 'tran' WHERE id = 'f-1503'
DEBUG:PGRreturn_result():PGRreturn_result[]
DEBUG:PGRreturn_result():128 send
DEBUG:PGRsend_replicate_packet_to_server():PQexec send :UPDATE session_id SET name = 'tran' WHERE id = 'f-1503'
DEBUG:read_answer():answer[PGR_QUERY_DONE_NOTICE_CMD]
DEBUG:read_answer():QUERY DONE
DEBUG:sem_unlock[1]
DEBUG:PGRdo_replicate():query :: end
DEBUG:cmdSts=T
DEBUG:cmdType=E
DEBUG:port=5432
DEBUG:pid=29805
DEBUG:from_host=db-cl2
DEBUG:dbName=pgcltest
DEBUG:userName=root
DEBUG:recieve sec=1110103971
DEBUG:recieve usec=467900
DEBUG:query_size=3
DEBUG:query=end
DEBUG:sem_lock[1]
DEBUG:PGRreturn_result():PGRreturn_result[3,1110103971,466812,1]
DEBUG:PGRreturn_result():128 send
DEBUG:PGRsend_replicate_packet_to_server():host(db-cl2) : port(5432)
DEBUG:pgr_createConn():PQsetdbLogin host[db-cl2] port[5432] db[pgcltest] user[root]
DEBUG:read_answer():answer[PGR_QUERY_DONE_NOTICE_CMD]
DEBUG:read_answer():QUERY DONE
DEBUG:pgr_createConn():PQsetdbLogin ok!!
DEBUG:PGRsend_replicate_packet_to_server():connect db:pgcltest port:5432 user:root host:db-cl2 query:begin
DEBUG:PGRsend_replicate_packet_to_server():sync_command(SELECT PGR_SYSTEM_COMMAND_FUNCTION(3,1110103971,466812,1) )
DEBUG:PGRsend_replicate_packet_to_server():PQexec send :begin
DEBUG:sem_unlock[1]
DEBUG:PGRdo_replicate():query :: SELECT * FROM session_id WHERE id = 'a-1618' for update
DEBUG:cmdSts=T
DEBUG:cmdType=S
DEBUG:port=5432
DEBUG:pid=30111
DEBUG:from_host=db-cl1
DEBUG:dbName=pgcltest
DEBUG:userName=root
DEBUG:recieve sec=1110103971
DEBUG:recieve usec=473954
DEBUG:query_size=55
DEBUG:query=SELECT * FROM session_id WHERE id = 'a-1618' for update
DEBUG:PGRsend_replicate_packet_to_server():host(db-cl1) : port(5432)
DEBUG:PGRsend_replicate_packet_to_server():connect db:pgcltest port:5432 user:root host:db-cl1 query:end
DEBUG:sem_lock[1]
DEBUG:PGRreturn_result():PGRreturn_result[]
DEBUG:PGRreturn_result():128 send
DEBUG:PGRsend_replicate_packet_to_server():PQexec send :end
DEBUG:read_answer():answer[PGR_QUERY_DONE_NOTICE_CMD]
DEBUG:read_answer():QUERY DONE
DEBUG:sem_unlock[1]
DEBUG:PGRdo_replicate():query :: begin
DEBUG:cmdSts=T
DEBUG:cmdType=B
DEBUG:port=5432
DEBUG:pid=29805
DEBUG:from_host=db-cl2
DEBUG:dbName=pgcltest
DEBUG:userName=root
DEBUG:recieve sec=1110103971
DEBUG:recieve usec=501537
DEBUG:PGRreturn_result():PGRreturn_result[]
DEBUG:PGRreturn_result():128 send
DEBUG:query_size=5
DEBUG:query=begin
DEBUG:sem_lock[1]
DEBUG:PGRsend_replicate_packet_to_server():host(db-cl2) : port(5432)
DEBUG:PGRsend_replicate_packet_to_server():connect db:pgcltest port:5432 user:root host:db-cl2 query:SELECT * FROM session_id WHERE id = 'a-1618' for update
DEBUG:read_answer():answer[PGR_QUERY_DONE_NOTICE_CMD]
DEBUG:read_answer():QUERY DONE
DEBUG:PGRsend_replicate_packet_to_server():PQexec send :SELECT * FROM session_id WHERE id = 'a-1618' for update
DEBUG:sem_unlock[1]
DEBUG:PGRdo_replicate():query :: UPDATE session_id SET name = 'tran' WHERE id = 'a-1618'
DEBUG:cmdSts=T
DEBUG:cmdType=U
DEBUG:port=5432
DEBUG:pid=30111
DEBUG:from_host=db-cl1
DEBUG:dbName=pgcltest
DEBUG:userName=root
DEBUG:recieve sec=1110103971
DEBUG:recieve usec=503459
DEBUG:query_size=55
DEBUG:query=UPDATE session_id SET name = 'tran' WHERE id = 'a-1618'
DEBUG:sem_lock[1]
DEBUG:PGRsend_replicate_packet_to_server():host(db-cl1) : port(5432)
DEBUG:PGRdo_replicate():query :: UPDATE session_id SET name = 'tran' WHERE id = 'f-1504'
DEBUG:cmdSts=T
DEBUG:cmdType=U
DEBUG:port=5432
DEBUG:pid=29805
DEBUG:from_host=db-cl2
DEBUG:dbName=pgcltest
DEBUG:userName=root
DEBUG:recieve sec=1110104061
DEBUG:recieve usec=522430
DEBUG:query_size=55
DEBUG:query=UPDATE session_id SET name = 'tran' WHERE id = 'f-1504'
DEBUG:sem_lock[1]
----------------pgreplicateのデバッグログの最後100行----------------

--------------------------postgresql.conf--------------------------
tcpip_socket = true
max_connections = 256
port = 5432
shared_buffers = 25600
sort_mem = 4096
effective_cache_size = 4000
LC_MESSAGES = 'ja_JP.eucJP'
LC_MONETARY = 'ja_JP.eucJP'
LC_NUMERIC = 'ja_JP.eucJP'
LC_TIME = 'ja_JP.eucJP'
--------------------------postgresql.conf--------------------------

----------------------------cluster.conf----------------------------
<Replicate_Server_Info>
        <Host_Name> db-rp1 </Host_Name>
        <Port> 8001 </Port>
        <Recovery_Port> 8101 </Recovery_Port>
</Replicate_Server_Info>
<Replicate_Server_Info>
        <Host_Name> db-rp2 </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 </Rsync_Option>
<When_Stand_Alone> read_only  </When_Stand_Alone>
<Status_Log_File> /var/log/pgsql/cluster.sts </Status_Log_File>
<Error_Log_File> /var/log/pgsql/cluster.log </Error_Log_File>
----------------------------cluster.conf----------------------------

--------------------------pgreplicate.conf--------------------------
<Status_Log_File> /var/log/pgsql/pgreplicate.sts </Status_Log_File>
<Error_Log_File> /var/log/pgsql/pgreplicate.log </Error_Log_File>
<Replication_Port> 8001 </Replication_Port>
<Recovery_Port> 8101 </Recovery_Port>
<Response_Mode> normal </Response_Mode>
<Cluster_Server_Info>
        <Host_Name> db-cl1 </Host_Name>
        <Port> 5432 </Port>
        <Recovery_Port> 7001 </Recovery_Port>
</Cluster_Server_Info>
<Cluster_Server_Info>
        <Host_Name> db-cl2 </Host_Name>
        <Port> 5432 </Port>
        <Recovery_Port> 7001 </Recovery_Port>
</Cluster_Server_Info>
--------------------------pgreplicate.conf--------------------------

----
Seiryu Fumio <BX7S-SIRY @ asahi-net.or.jp>



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