[pgpool-general-jp: 570] 縮退運転時の挙動について
SHIROUZU Hiroaki
shirouzu @ ipmsg.org
2009年 7月 3日 (金) 16:24:38 JST
お世話になっております。
白水と申します。
可用性向上だけを目的とした、pgpool-II と 2台のPostgresサーバ
を使った冗長構成において、縮退発生時の挙動について、CGI側での
定番の対処法があれば、お教えください。
構成
Postgres DBサーバ(8.3.7) * 2台
CGI(python2.4) + pgpool-IIサーバ(2.2.2) * 1台
現在気になっているのは、1台のDBサーバが落ちた際、
「コネクションが切れる等による一時的なエラー」
に対する対処方法です。
たとえば、上記現象では python の pgモジュールは例外(pg.InternalError)
を返すため、CGIを内部的にトランザクション単位でリトライする対処
を考えましたが、
http://ml.postgresql.jp/pipermail/pgsql-jp/2004-September/017578.html
のように、例外を返した場合も、縮退したDBに正しくデータがコミット
されている場合があるため、2重登録エラーになる場合が考えられます。
(このあたり、pgpool-IIでは挙動が変化していましたらすみません)
こういう場合の一般的な作法がありましたら、お教えください。
現在のところ、CGI内でのDB操作は、さほど複雑なものではないため、
以下のような案を検討しています。
0. 事前に commit確認用テーブルを追加作成しておく
1. begin直後に 上記テーブルに、
"一意なトランザクションID", "開始ステータス"
といった内容のレコードを挿入
2. 一連のクエリを処理
3. 最後に、2で追記したレコードを "処理済ステータス" に変更
4. commit実行
1-3において例外が発生した場合は、再コネクション後、1から再実行。
4 において例外が発生した場合は、再コネクション後、確認テーブル
でのステータスを確認して、開始ステータスの場合は、1から再実行、
処理済みステータスの場合は、成功として扱う。
といったイメージです。
本当は、secondaryでの commitエラーはクライアント側に伝わらない形
が理想的なのですが…
--
SHIROUZU Hiroaki
http://www.ipmsg.org/private/
pgpool-general-jp メーリングリストの案内