[pgsql-jp: 33983] pgpool でデッドロック?

Mana Takebe takebemana @ yahoo.co.jp
2004年 9月 14日 (火) 20:14:38 JST


武部と申します。

Tomcat+PostgreSQLでアプリケーションを構築しており、
主にレプリケートの目的で、pgpoolを利用しようと考えていま
すが、
アプリケーションの負荷試験を行ったところ、
pgpoolでレプリケートしていると、デッドロックのような
現象が発生し、更新処理が止まってしまいます。
(replication_strictはtrueに設定しています。)

ロック状態を確認したところ以下のようになっており、
slave側ではp2の方がSQLの実行としては後
(postgreのlog_statement
の出力から)
なのですがトランザクションID 5417630ロックを先に取得して
しまって
いるように見えます。
(p1,p2というのは同じSQLを実行するmasterとslaveのペアに同
じ名前をつけています。)

master側---------------------------------
p1(psで見るとidle in tranzaction状態)
                    |          |     5417667 | 25384 |
ExclusiveLock    | t
 other_table        | db1      |             | 25384 |
AccessShareLock  | t
 other_table        | db1      |             | 25384 |
RowShareLock     | t
 TABLE_A            | db1      |             | 25384 |
AccessShareLock  | t
 TABLE_A            | db1      |             | 25384 |
RowExclusiveLock | t


p2 (psで見るとINSERT waiting状態)
 pk_other_table     | db1      |             | 25382 |
AccessShareLock  | t
 TABLE_A            | db1      |             | 25382 |
AccessShareLock  | t
 TABLE_A            | db1      |             | 25382 |
RowExclusiveLock | t
                    |          |     5417667 | 25382 |
ShareLock        | f
                    |          |     5417693 | 25382 |
ExclusiveLock    | t
 other_table        | db1      |             | 25382 |
AccessShareLock  | t
 other_table        | db1      |             | 25382 |
RowShareLock     | t


slave側---------------------------------
p1 (psで見るとINSERT waiting 状態)
 pk_other_table     | db1      |             | 3389 |
AccessShareLock  | t
 other_table        | db1      |             | 3389 |
AccessShareLock  | t
 other_table        | db1      |             | 3389 |
RowShareLock     | t
                    |          |     5417630 | 3389 |
ShareLock        | f
 TABLE_A            | db1      |             | 3389 |
AccessShareLock  | t
 TABLE_A            | db1      |             | 3389 |
RowExclusiveLock | t
                    |          |     5417605 | 3389 |
ExclusiveLock    | t

p2 idle (psで見るとidle in tranzaciton状態)
 other_table        | db1      |             | 3387 |
AccessShareLock  | t
 other_table        | db1      |             | 3387 |
RowShareLock     | t
 TABLE_A            | db1      |             | 3387 |
AccessShareLock  | t
 TABLE_A            | db1      |             | 3387 |
RowExclusiveLock | t
                    |          |     5417630 | 3387 |
ExclusiveLock    | t


現状、replication_strictがtrueですが、
master側のSQLがロック待ちになっている状態でも
salve側にSQLが実行されているという状況に見えるのですが、
これは正しい状態なのでしょうか?
設定がうまくいっていないのでしょうか?

なにかアドバイスをいただければ幸いです。






__________________________________
Do You Yahoo!?
http://bb.yahoo.co.jp/




pgsql-jp メーリングリストの案内