[pgsql-jp: 41133] pgpoolでできることを教えてください

MauMau maumau307 @ gmail.com
2012年 6月 14日 (木) 19:14:00 JST


こんにちは、MauMauといいます。

次のようなことをすべて実現するためにpgpoolを使うことはできるか、
できるとしたら、ポイントとなる設定はどのようなものかについて、お知恵をいただきたいです。
もしこちらのMLが適切ではなく、pgpool専用のMLがあれば、あわせてご指摘お願いします。
(英語のMLもあるでしょうか)

1.PostgreSQL 9.1の同期レプリケーションでプライマリ1台、スタンバイ1台の
 HA構成をとる。
2.pgpoolはアプリケーション・サーバと同じホストで動作させる。
3.プライマリが停止したら、自動的にスタンバイをプライマリに昇格させる。
4.すべての問い合わせをプライマリで実行させる。
 つまり、負荷分散はしない。
 これは、負荷分散に伴う制限や懸念を回避するため。
 たとえば、white/black_function_listを設定する必要があることや、
 更新したはずのデータが見えないことがあるのではないかという懸念。
 後者については、同一トランザクション内での更新後の参照は
 プライマリで実行されることは知っていますが、なんとなく心配なだけです。
5.アプリケーションを一切変更しない(できない)。
 たとえば、/*NO LOAD BALANCE*/をSQL文に追加するといったこと。
6.DBサーバのフェイルオーバ時に、アプリケーションにはセッションが継続しているように見せたい。
 つまり、プライマリがダウンしても、アプリケーションがセッションを再確立せずにすむようにしたい。
たとえば、psqlを再起動したり、PQconnectdb()を呼び出さずにすませたい。
 アプリケーションがトランザクションを実行中だった場合、
 いったんアプリケーションはSQL文実行に対してエラーを受け取るが、
 トランザクションをロールバックしてBEGINから再実行すればよいということ。
7.DBサーバのフェイルオーバ後に、可能な限り早く業務を再開するため、
 スタンバイ・サーバにプライマリと同じセッションを確立しておきたい。
 つまり、pgpoolがプライマリのダウンを検出してからスタンバイに接続するのではなく、
 事前に確立しておいたセッション上でトランザクションを再実行したい。
8.無応答になったバックエンド(=セッション)を、直観的な方法で終了させたい。
 たとえば、ストアド・プロシージャ内の無限ループのために応答がない場合に、
 それを呼び出したアプリケーションをCtrl+Cやkillで終了させると、
 バックエンドも終了してほしい。
 pg_stat_activityとpg_terminate_backend()を使うしかないとなると、
 データベース管理者にそれをお願いしなければならないため。
9.pgpoolでのSQL文解析のオーバヘッドをなくしたい。

特に4や5のためにdelay_thresholdやbackend_weightが有用なのかどうか、
9のためにrawモードというものが効果的なのか、といったことを知りたいです。

いろいろ書いてすみませんが、よろしくお願いします。


以上です。




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