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