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