[pgsql-jp: 32937] Re: pgpoolのfailover について
Tatsuo Ishii
t-ishii @ sra.co.jp
2004年 5月 14日 (金) 18:28:58 JST
石井です.
> 初めまして、平野と申します。
>
> PostgreSQLのサーバのfail overを実現しようと、pgpoolを
> 検証させて頂いております。かなり気に入っているのですが、
> fail overしない状況がありましたので、報告します。
>
> 3台のサーバを用意して、
>
> A: pgpool のみインストールされたPC (postgreSQLなし) (Turbolinux 8)
> B: postgreSQL7.4.2がインストールされたPC (Primary) (Turbolinux 8)
> C: postgreSQL7.4.2がインストールされたPC (Secondary) (Fedora Core 1)
>
> という構成で、
>
> 1) B C ともpostmasterの起動している状態で、Aにてpgpool -dn を起動
> 2) Bより psql -h A test でpgpoolに接続
> 3) CのLANケーブルを抜く
> 4) psqlから何か問い合わせ(\dt)を送る
> 5) 反応なし (数分経っても終了しない,
> かなり(?)待つと正しくfailoverする)
>
> というテストを行ったのですが、failoverせずに、黙りになって
> しまいます。この時の、pgpoolの出力は、
>
> | DEBUG: pid 18297: read kind from frontend Q(51)
> | DEBUG: pid 18297: pool_read_string: readsize: 1024 readp: 0 secondary: 0
> | DEBUG: pid 18297: pool_read_string: buf:SELECT n.nspname as "Schema",
> | -- snip --
> | ORDER BY 1,2;: readlen: 523
> | DEBUG: pid 18297: strlength: 523
> | DEBUG: pid 18297: pool_read_string: string: :SELECT n.nspname as "Schema",
> | -- snip --
> | DEBUG: pid 18297: pool_read_string: next string: ::
> | DEBUG: pid 18297: pool_read_string: final read 523 string: :SELECT n.nspname as
> | -- snip --
> | DEBUG: pid 18297: pool_read_string: total result 523 string: :SELECT n.nspname a
> | -- snip --
> | DEBUG: pid 18297: read kind from backend P
>
> というような感じで、ここで止まってしまっています。
>
> マニュアル通りに、DBノード側でpostmasterプロセスを停止した
> 場合は、正しく、
>
> | test=> \dt
> | server closed the connection unexpectedly
> | This probably means the server terminated abnormally
> | before or while processing the request.
> | The connection to the server was lost. Attempting reset: Failed.
> | !>
>
> という状態になりましたので、pgpool <-> postgreSQLサーバ 間の
> コネクションの断が検出出来ていないのだと思います。
>
> 実際、netstatで見たところ、
>
> | $ netstat -a | grep 5432
> | tcp 0 0 *:5432 *:* LISTEN
> | tcp 0 0 test2.test:5432 192.168.5.161:1202 ESTABLISHED
> | tcp 0 524 test2.test:1298 192.168.5.163:5432 ESTABLISHED
> | tcp 118 0 test2.test:1297 192.168.5.161:5432 ESTABLISHED
> | unix 2 [ ACC ] STREAM LISTENING 48405 /tmp/.s.PGSQL.5432
>
> Bサーバ(192.168.5.161)もCサーバ(192.168.5.163)同様にestablished
> の状態になっています。
端的に言うと,これはちょっと避けるのが難しい問題だと思います.TCPレベ
ルでretryしていると思うのです.実際,pgpoolでなくても,psqlで
postmasterに接続し,psqlの動いているホストからLANケーブルを引っこ抜く
とまったく同じ状況になります.netstatで見ると,やはりESTABLISHEDになっ
ています.
> 実際の障害では、障害の起きたサーバのpostmasterがshutdown
> してくれるとは到底考えられないので、何とかしたいと考えているの
> ですが、何かいい方法はありませんでしょうか。
>
> 無理なら、とりあえず、時間のかかるqueryはないものとして、
> タイムアウトさせて逃げようか、とも思っていますが。
たぶん根本的な解決は,多くのHAソフトがやっているような,ハートビートを
方法だと思いますが,何かアイデアがあれば私も教えて欲しいです.
--
Tatsuo Ishii
pgsql-jp メーリングリストの案内