[pgpool-general-jp: 59] Re: pgpoolの縮退運転について
Tatsuo Ishii
ishii @ sraoss.co.jp
2006年 12月 14日 (木) 10:16:17 JST
石井です.
> 石井さん
>
> 山崎と申します。
> 返答が遅れ、申し訳ございません。
>
> > > 最近は、同時接続ユーザ数が多い場合に並列実行されるトランザクションの中で
> > > 瞬間的に発生したmaster/secondary間のデータ不一致状態にSELECTを実行してしまう
> > > ケースがあるのでは?とも考え始めました。
> > > (pgpoolの利用を前提に作られたアプリではないので、log_statementによるSQLの
> > > 記録を見る限りは、明示的なロックなどは入っていないように思われるので。)
> >
> > その可能性はあります.
> >
> > なので,load_balance_mode = off のときは,masterにだけSELECTを発行(現
> > 在はsecondryにもSELECTを投げている)するようにしたらどうかな,と思って
> > います.ただ,副作用のあるSELECTが来る可能性があるので,コメントかスイッ
> > チで動作を選べるようにした方がよいかもしれません.
>
> 先程の浅羽さんへの返信に書かせて頂いた通り、一部の重いSELECT文において
> master側とsecondary側のログの記録が8秒もずれている事がありましたので、
それはしょうがないですね.replication_strict = trueの場合,master側の
SELECTが完了するのを待ってからsecondary側にSELECTを投げるので,SELECT
の重さに比例して時間のずれは発生します.
> いっそのこと、
> ・load_balance_mode = on にして、検索系クエリは片側にしか投げないようにする
> ・replication_strict = false にしてmasterからの実行結果を待たずに並列処理させる
> のいずれかの方法を取るしかないか、とも考えております。
>
> ただ、上記の仕様に変更した場合にmaster/secondaryのデータ同一性がきちんと
> 保証されるだろうか、という点を危惧しております。
上記2点はデータの同一性の保障,という点とは無関係だと思います.どちら
かというと,デッドロックが気になりますね.
> 現状でも100%安全とは思っていないのですが、master/secondaryの両方に
> SELECT文を発行し、差異がある場合は縮退させる事で被害が拡大することは
> 防止できるという点では、それなりに保全性は高いと考えています。
> (ただ、この場合でも差異が出ていたmaster側のデータが信頼されるべき値で
> あった場合、縮退してしまうとそのデータそのものは不正な状態で残ってしまう、
> という認識ですが)
pgpoolでは無理ですが,pgpool-IIなら3ノード以上をサポートしているので,
ノード数を奇数にしておけば,データが不一致になったときに多数決でどれを
落とすかを決められます.まだそういう機能はpgpool-IIにはありませんが,
原理的にはその方向で実装可能です.
もちろんこれでも勝った方のノードのデータが正しい,という保障は無いので
すが,そこまでコンピュータに求めるのは無理でしょう.最終的には人間が判
断すべきことと思います.
> 並列処理されるトランザクション全てが無事に実行完了すれば、
> master/secondaryのデータ同一性は問題ないだろう、という楽観的見方においては
> 瞬間的に差異が出る事を無視しても、実務上は問題ないレベルで運用できるだろう、
> というのが落とし所なのかもしれませんけれども。
そうですね.というか,こう(「トランザクション全てが無事に実行完了すれ
ば,データは同一であろう」という立場)でないレプリケーションソフトとい
うのはあるんでしょうか?
> 現状、パフォーマンスも若干悪いという面もあるので、
> load_balance_mode が問題なさそうであれば採用したいと考えています。
>
> あるいはpgpoolそのものにmaster/secondary間のデータの同一性を監視するような
> 機能を設ける予定など、ありますでしょうか?
まず「同一性とは何か」という定義が必要です.RDBでは,テーブル内の行の
並びは意味を持たないことになっているので,行を並び換えれば同じものにな
るのであれば,それは同じである,という解釈だとすると,そのことをリアル
タイムで検証するのは容易ではありません.
> (そういう機能を期待するならPGClusterなどを使うべき、というご意見も
> あるのかもしれませんが)
私の理解では,PGClusterでもそのあたりの事情は同じです.
1) 各ノードのデータが瞬間的にずれていることはあり得る
2) 各ノードのデータが同一であるかどうかは検証していない
私の知る限り,pgpool,PGCluster,Slony-Iなど,すべてこのあたりの事情は
同じです.
1)を防止するためには,各ノードの更新がすべて完了するまではそのデータを
見せない,という仕掛けが必要です.一番簡単なのは,まず排他ロックを取り,
それから処理に入る方法ですが,これでは致命的にパフォーマンスが阻害され
ます.pgpoolでは,PGClusterと違ってすべての更新処理を直列化するのでは
なく,並列処理も許すことによってパフォーマンスを上げてますから,このメ
リットがなくなってしまうのは痛い...なかなか難しい問題です.
全然話は変わりますが,こういうpgpoolへの疑問,あるいはpgpoolへのリクエ
ストなどについて気軽に語り合うような場があったら参加したい,という方は
いらっしゃいますか?まずはセミナーまでいかないような,勉強会位の規模の
ものを想定しています.
こういったことについても,ご希望,ご意見があれば是非御聞かせください.
(個人メールでも結構です)
--
Tatsuo Ishii
SRA OSS, Inc. Japan
pgpool-general-jp メーリングリストの案内