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