[pgsql-jp: 35670] pgpoolでのレプリケーションでエラー発生

Kenichirou Kimura ( 木村健一郎 ) kimura @ project-com.com
2005年 7月 6日 (水) 10:36:59 JST


木村と申します。

pgpoolでレプリケーションをしていますが、稀にアプリケーションとpgpoolの
コネクションが切断されるという現象に遭遇しています。
切断されるときに実行しているSQLはいつもselect系で、pgpoolのログを毎回
取ってはいないので確証はありませんがどうも「masterとsecondaryから戻っ
てきたselectの結果の数が違うからエラー」という現象に遭遇しているように
見えます。

ちなみに、そのときPostgreSQL側のログにはunexpected EOF on client
connectionと出ています。

遭遇する典型的なケースは以下のような場合です。

・2つのクライアント(C1,C2)が接続し、それぞれが非同期にSQLを発行している
・C1は頻繁に「select * from hoge where id = xxx」という問い合わせを行う。
・C2は、あるタイミングで「delete from hoge where id = xxx」を発行する
・C2がdeleteを発行したタイミングでのC1のselectで、pgpoolからコネクショ
 ンを切断される

色々考えたのですが、もしかして以下のような現象が起こり得るのではないか
と思いました。議論を簡単にするため、上記where文中のidは、テーブルhoge
におけるprimary key(つまり、selectの結果数は1か0)とします。


     master             |       secondary
------------------------+---------------------
C1のselectがpgpoolから  |
到達。select処理開始     |
----------------------------------------------
C2からのdeleteがpgpool  | 
から到達。delete開始     |
----------------------------------------------
C1のselect処理完了。     |C2からのdeleteがpgpool
C2のdeleteより前なので、  |から到達。delete開始
結果は1件。              |
-----------------------------------------------
C2のdelete処理完了。    |C2のdelete処理完了。
                        |
----------------------------------------------
                       |C1からのselectがpgpool
                       |から到達。select開始。
----------------------------------------------
                       |C1のselect処理完了。
                       |C2のdeleteのあとなので、
                       |結果は0件。
----------------------------------------------
  pgpoolは、C1のselectの結果数がmasterと
  secondaryで異なるのでエラーと判断する


タイミングによっては、上記のようなことは起こり得るのでしょうか?
pgpoolのバージョン、PostgreSQLのバージョンに依存していないようなので上
記のようなタイミング依存の問題かとも思ったのですが。

(ロードバランスモードにするといいのかしら...)

以上、よろしくお願いします。

--------------------------------
木村



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