[pgsql-jp: 35674] Re: pgpoolでのレプリケーションでエラー発生
Tatsuo Ishii
t-ishii @ sra.co.jp
2005年 7月 6日 (水) 13:51:35 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のバージョンに依存していないようなので上
> 記のようなタイミング依存の問題かとも思ったのですが。
想像通りだと思います.ちなみに,PGClusterでも同様の現象が起きると思い
ます.
# PGClusterはSELECTをデフォルトでロードバランスするので気が付かれない
# のですが...
> (ロードバランスモードにするといいのかしら...)
それでもいいですし,後はテーブルロックをかける方法もあります.もちろん,
トランザクションの並列実行性が犠牲になってしまいますが.
--
Tatsuo Ishii
pgsql-jp メーリングリストの案内