[pgsql-jp: 36603] Re: Webサーバ冗長化構成での pgpool の配置

keigo ito keigo.ito @ gmail.com
2006年 1月 10日 (火) 11:35:43 JST


石井さん:

伊藤です。迅速、丁寧なご回答、まことに有難うございます。

> 石井です。
>
> > ・WebServer1
> >     pgpool -----+---- DBServer1(master)
> >                 |
> >                 +---- DBServer2(secondary)
> >
> > ・WebServer2
> >     pgpool -----+---- DBServer1(master)
> >                 |
> >                 +---- DBServer2(secondary)
> >
> ・・・・・・・・
> ・・・・・・・・
> 理論的には、DBserver1/2の状態がpgpoolその1、その2で違って見えるはずが
> ないので、特に問題ないと思います。あるとすれば、ネットワークやスイッチ
> の不具合で、
>
> 1) pgpoolその1から見るとDBserver1につながらなくなったので、pgpoolその2
>   はDBserver1を切り離した
>
> 2) pgpoolその2から見るとDBserver1も2も健全なので、レプリケーション状態
>   を維持した
>
> という状況が発生したときくらいですかね。こういう状況にpgpoolだけで対応
> するのはなかなかつらいので、ネットワーク経路の二重化とかで対応して欲し
> いものだと思いますが...
>

了解しました。
NWによる障害を私の環境では想定していない(100%起きないわけではないですが)ので、当初の計画通り、pgpoolを配置することにします。


> > ・pgpool.conf 設定内容(抜粋)(WebServer1,WebServer2)
> > replication_mode = true
> > replication_strict = true
> > load_balance_mode = true
> > replication_stop_on_mismatch = true
> > insert_lock = true
>
> 個人的には、
>
> replication_stop_on_mismatch = false
>
> で運用した方が、ささいなことで縮退しないのでよいと思います。
> そのかわりhealth checkを入れてDBサーバの状態を監視するようにした方が良
> いのではないでしょうか。health checkがないと、DBにアクセスに行くまで障
> 害を検知できませんので。

アドバイスの通り、
replication_stop_on_mismatch = false
health_check_timeout = 10
health_check_period = 10
health_check_user = 'xxx'

を追加しました。
蛇足ですが、
> replication_stop_on_mismatch = false
>
> で運用した方が、ささいなことで縮退しないのでよいと思います。

この「ささいなこと」とはどういったことが考えられますか?

README によると、
> replication_stop_on_mismatch
>
> trueを指定するとマスタとセカンダリの間でデータの不一致があった場合
> に強制的に縮退運転に入ります.このオプションがfalseの場合は,該当の
> 問い合わせを強制的に終了するだけに留めます.デフォルト値はfalseです.

とのことですが、具体的にどういったことが想定されるのか、「ささいなこと」の不一致によるデータ整合性の欠如の問題がないのか等、向学のためにご教授頂ければと思います。

以上、よろしくお願いいたします。


On 1/7/06, Tatsuo Ishii <ishii @ sraoss.co.jp> wrote:
> 石井です。
>
> > ・WebServer1
> >     pgpool -----+---- DBServer1(master)
> >                 |
> >                 +---- DBServer2(secondary)
> >
> > ・WebServer2
> >     pgpool -----+---- DBServer1(master)
> >                 |
> >                 +---- DBServer2(secondary)
> >
> > 上図のようにWebサーバの冗長構成を組んでおり、各Webサーバ上でpgpoolを配置しています。
> > Webサーバのローカルでpgpoolを稼動させているのは、UNIXドメインソケット経由でWebサーバ
> > から接続させることで高速化させようという狙いです。
> >
> >
> > ◆ ここで問題(疑問)なのですが、万が一、
> >
> >   Web1 の pgpool で縮退運転が開始 → master up, secondary down の状態
> >   Web2 の pgpool で縮退運転が開始 → master down, secondary up の状態
> >
> > といったことが起こり得るため、上図のような構成は不適切なのでしょうか?
>
> 理論的には、DBserver1/2の状態がpgpoolその1、その2で違って見えるはずが
> ないので、特に問題ないと思います。あるとすれば、ネットワークやスイッチ
> の不具合で、
>
> 1) pgpoolその1から見るとDBserver1につながらなくなったので、pgpoolその2
>   はDBserver1を切り離した
>
> 2) pgpoolその2から見るとDBserver1も2も健全なので、レプリケーション状態
>   を維持した
>
> という状況が発生したときくらいですかね。こういう状況にpgpoolだけで対応
> するのはなかなかつらいので、ネットワーク経路の二重化とかで対応して欲し
> いものだと思いますが...
>
> > ◆ その問題を解消するには、やはりアプリケーション全体で pgpool を1つだけにすべきなのでしょうか?
> > その場合、pgpool自体の冗長構成を組むことができないのでしょうか?
> > (pgpoolがシングルポイントになってしまう)
>
> pgpoolが single point of failureになります。回避するためには、
> heartbeatとかを導入すればできそうな気がしますが、まだ試したことはあり
> ません。
>
> > ◆ 同じようなWebServer 2台、DBServer 2台の構成で、最適なシステム構成をご存知の方、実績の
> > ある方がいらっしゃいましたら、ぜひアドバイスを頂けないでしょうか?
> >
> > まだまだPostgreSQL、pgpoolを勉強中であります。
> > 何卒、よろしくお願いいたします。
> >
> >
> > ◇ 参考
> >
> > ・OS(WebServer1,WebServer2,DBServer1,DBServer2)
> > Red Hat Enterprise Linux ES release 3
> >
> > ・PostgreSQL(DBServer1,DBServer2)
> > PostgreSQL 8.1
> >
> > ・pgpool.conf 設定内容(抜粋)(WebServer1,WebServer2)
> > replication_mode = true
> > replication_strict = true
> > load_balance_mode = true
> > replication_stop_on_mismatch = true
> > insert_lock = true
>
> 個人的には、
>
> replication_stop_on_mismatch = false
>
> で運用した方が、ささいなことで縮退しないのでよいと思います。
> そのかわりhealth checkを入れてDBサーバの状態を監視するようにした方が良
> いのではないでしょうか。health checkがないと、DBにアクセスに行くまで障
> 害を検知できませんので。
> --
> Tatsuo Ishii
> SRA OSS, Inc. Japan
>



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