[pgsql-jp: 33622] Re: pgpool 2.0.2 報告

Jun Kitamura kitamura @ zoozee.jp
2004年 7月 12日 (月) 11:32:08 JST


北村です。

> > > o 同じ名前のテーブルなのに,構造が異なる
> > > o 同じ名前のテーブルなのに,行数が異なる
> > > 
> > > もアウトです.
> > 
> > カラム数とタプル数のチェックのみでしょうか?
> 
> どういうチェックを行っているかお話しした方が早そうなので,解説します.

おぉ。ありがとうございます。PostgreSQLプロトコルのレベルでチェッ
クしているんですね。
以前、西尾さんが発見された「order by 問題([pgsql-jp: 33436])」
の時は、1行全体のバイナリでチェックしていたって事ですかね(ソー
ス見れば良いんで返答無用)。その後、ヘッダの長さのチェックだ
けに変えた・・・と。ある意味、以前の方法ならば、primary と 
secondary 間の厳密なチェックが可能なわけですね。捨てがたいか
もw。

> > デフォルト値や制約も「構造」という言葉に含みますか?
> 
> 上記により,ことSELECTに関しては問題になりません.ただ,psqlの\dtなど
> では,psqlの内部で発行したSELECT結果の行数が異なるため,エラーになりま
> す.

なるほど。今回の一連のスレッド([pgsql-jp: 33529])は、コレが
原因なわけですね。もっとも、石井さんの意図されている「データ
ベースクラスタの物理的内容の一致」から大きく外れていた事が主
因ですが。

> > > それと,シーケンスやSERIAL型も要注意です.PGClusterと違って明示的にシー
> > > ケンスを同期させる機構を持たないpgpoolでは,たとえば複数接続から同時に
> > > SERIAL型を使っている同じテーブルにデータを追加すると,シーケンスの値が
> > > ずれることがあります.
> > 
> > この場合、SELECT 時に、master と secondary の値が違う、とい
> > うことで縮退運転されてしまいますか?
> 
> pgpoolでは,各行の値の中身までは見ていないのでそれ自体はエラーになり
> ません.ただし,アプリケーションでシーケンスの値に基づいて発行した
> SELECT文の結果行数が異なった結果,エラーになってしまうことがあります.
> 
> ちなみに,pgpool 2.0以降では,こうした際に縮退運転するかしないかを選択
> できるようになっています.

なるほど。デフォルトの STRICTモードであれば問題ないかと思い
ましたが勘違いしていました。STRICTモードとは、あくまで 
pgpool が primary と secondary の応答順序を守るというモード
で、複数接続からのセッションの順番を守るものではないのですね。

> > master と secondary の値が違えてしまうケースとして、更新・追
(snip)
> こういった問題はなかなか頭の痛いところですが,解決方法としては以下のよ
> うなものが考えられます.
> 
> 1) current_timestamp や random()を使用せず,アプリケーションの方で値を
>    生成してSQL文に埋め込む.ただし,フロントエンドの間で時計がずれてい
>    るとcurrent_timestampがずれる可能性はあります.
> 
> 2) (これは単なるアイデアレベルですが)pgpoolの中にそうした値を生成す
>    る機能を入れる.そして値をSELECT文で取得できるようにしておき,それ
>    をアプリケーションに使ってもらう.
> 
> 3) current_timestamp や random()そのものを入れ替える(同じような発想で,
>    Slony-Iではシーケンス関数を入れ替えてます).こうした方法が良いか悪
>    いかは,議論のあるところだと思いますが.
> 
> まあ,今後どうするかはこれからじっくり考えたいと思います.

3)が妥当な気がします。
当初、2)が良い(あるいは実装されている)かとも思いましたが、こ
と random() で言えば、ユーザー定義関数内の random() などは 
pgpool では拾えないのでどうしようもないです。となると、ユー
ザー定義関数側で独自の擬似乱数関数を使うなどの方法になり、結
局 3) ですね。
シーケンス(シリアル型)も、最大値+1 というユーザー定義関数を
作れば解決です(当然この場合、シーケンスの「番号先確保で高速
処理」の恩恵は受けられないですが)。

1) はある意味、現時点でのもっとも簡単な解だとは思いますが、
ロジックを DBMS に乗せるか、アプリケーションに乗せるか、設計
者の趣味(?w)の話だと思います。私は可能な限り DBMS に乗せちゃ
いますが。

ご教示ありがとうございました。




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