[pgsql-jp: 37855] Re: kind mismatch between backends

Hisakazu Nakai nakai @ shinko.co.jp
2006年 12月 26日 (火) 10:48:01 JST


中井です。

お手数をお掛けしています。
pgpool.conf を添付します。

listen_addresses = '*'
port = 5432
socket_dir = '/tmp'
backend_host_name = ''
backend_port = 9999
backend_socket_dir = '/tmp'
secondary_backend_host_name = 'bay95'
secondary_backend_port = 5432
num_init_children = 32
max_pool = 4
child_life_time = 300
connection_life_time = 0
child_max_connections = 0
logdir = '/tmp'
replication_mode = true
replication_strict = true
replication_timeout = 5000
load_balance_mode = false
weight_master = 0.5
weight_secondary = 0.5
replication_stop_on_mismatch = true
reset_query_list = 'ABORT; RESET ALL; SET SESSION AUTHORIZATION DEFAULT'
print_timestamp = true
master_slave_mode = false
connection_cache = true
health_check_timeout = 20
health_check_period = 0
health_check_user = 'nobody'
insert_lock = true
ignore_leading_white_space = false
log_statement = true
event_command = '/usr/local/bin/pgpool_event_comm'

 <* * * * * kind does not について * * * * *>
Tatsuo Ishii wrote:
>> 2006-12-22 08:32:12 ERROR: pid 22580: read_kind: kind does not match
>> between backends master(82) secondary(69)
> 
> 82は"R"で,認証要求のパケットです.なのでたぶんこれは正常.secondaryの
> 69("i")が変ですね.これは"Empty Query Response"で,空のクエリを送った
> ときの応答です.なぜこんなものが返ってくるのか...調べてみます.

2006-12-18 に pgpool を起動してから、今回、コンソールから psql で
チェックするまでの間は、何も ERROR のログは出ていません。
replication_stop_on_mismatch = true になっていますが、
kind does not match ですぐに縮退運転に入ったわけではないです。

開発用のシステムで show pool_status; を実行すると、
kind does not match のエラーがでます。数分間操作して
いましたが、3回でました。開発用のシステムも
replication_stop_on_mismatch = true になっていますが、
縮退運転に入る様子はありません。
ところが、開発用システムで pgpool を再起動すると、
コンソールから psql で接続しても、kind does not match のエラーが
出なくなりました。

 <* * * * * prepared statement について * * * * *>
>>> > >> 2006-12-22 08:37:00 LOG:   pid 22580: statement: DEALLOCATE "S_1"
>>> > >> 2006-12-22 08:37:00 LOG:   pid 22580: statement: DEALLOCATE "S_2"
>>> > >
>>> > > というのがあります.pid 22580はpsqlで接続しているんですよね?この
メッセー
>>> > > ジはprepared queryが使われたことを示していますが,実際使ってますか?
>> >
>> > 使っていません。このメッセージは不定期に頻繁に出ています。

> 確認ですが,psql以外から接続するときには,このシステムではJavaから接続
> するなどして,prepared queryを使うこともあるのでしょうか?

プロセスIDからするとコンソールからpsqlで接続しているときのことなので、
ありえないような気がします。psqlでセッションを張っている最中に、
その pgpool が他のクライアントとセッションを張るということは
ないですよね。

 <* * * * * health check について * * * * *>
> secondryから応答がないことと,health checkが
> 失敗したのは無関係です.secondryから応答がないということは,実際のデー
> タのやりとりの際にpgpoolの子プロセスで検出されています.health checkは
> pgpoolの親プロセスがタイマーで定期的に実施しています.
> 
>> 2006-12-22 08:39:02 ERROR: pid 22580: health check failed during
>> write.
> 
> は,socketをopenし,スタートアップパケットをpostmasterに送信するために
> writeしたら失敗した,ということを示します.この現象が発生するのは,
> postmasterをshutdownしている最中とか,存在しないDBユーザでhealth check
> した際に起こります(ユーザは"health_check_user"で指定します).
> 
>> >> master  at port 9999 is down
> 
> で,そのwriteに失敗したのはmasterのpostmasterだったと,このログは報告
> しています.

pgpool.conf では、health_check_period = 0 となっており、自動的には
health check はしていません。ログを調べましたが、他に health check の
記録はありませんでした。

 <* * * * * これまでのまとめ * * * * *>
 1. psqlでコンソール接続なのに prepared statement が頻繁に動いている。
 2. show pool_status から 1分以上たって、唐突に kind does not match が
  出ている。
 3. 唐突にsecondary からの応答が無いと表示し、health check を行い、
  master の反応が無いからと言って、secondary だけの縮退運転に入った。
 4. 以上の問題は、すべて、コンソールからpsql接続のプロセスにおいて
  起きている。

なにか psql で接続しているときにとんでもないことをやったように
見えました。やったつもりは無いんですが。

追伸:kill HUP対応のときに log のファイルをオープンするモードを
   追記モードにして頂けると便利かなと思いました。

-- 
-=-=-=-=  SHINKO ELECTRIC INDUSTRIES CO., LTD.           =-=-=-=-
=-=-=-=-    Research & Development Div.                  -=-=-=-=
-=-=-=-=      Infomation Technology Research Dept.       =-=-=-=-
=-=-=-=-  Name:Hisakazu Nakai          TEL:026-263-3922  -=-=-=-=
-=-=-=-=  Mail:nakai @ shinko.co.jp      FAX:026-263-4562  =-=-=-=-



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