[pgsql-jp: 34157] pgpoolのリードエラーについて

Naoki Kaneto kane @ ics.co.jp
2004年 10月 26日 (火) 15:12:04 JST


金戸と申します。
はじめて投稿いたします、よろしくお願いします。

Red Hat Linux release 7.3
postgres (PostgreSQL) 7.4.3
pgpool version 2.2

これらのバージョンでセカンダリのcheck_fdがエラーになります。
主にJDBC+JAVA,PG-AdminIII,psql,DBI+Perl,ODBC+MsAccessなどで発生します。

またDBI+Perlでエラー発生率が高くpsqlは低いです、Perlの十分の一ほどです。
さらに、読むデータによって頻度も変わります。データの違いはほぼ件数のみで
す。

最初、サーバA(PenIII600MHz+512MB)とサーバB(Xeon2.8GHz+2GB)で
下記構成での動作を目指しましたが上記エラーが発生しました。

    サーバA
       --postgres1
pgpool-l           サーバB
       ------------postgres2

性能差があるのがエラーの原因かと思い下記に変更しましたが
改善されませんでした。

サーバA       サーバB
       -------postgres1
pgpool-l
       -------postgres2

この構成でDBI+Perlを用いてテストしました。

rsync -av /home/pg/hoge1/* /home/pg/hoge2/
pg_ctl start -D /home/pg/hoge1 -o -i -p 9001
pg_ctl start -D /home/pg/hoge2 -o -i -p 9002
pgpool -dn
で起動

50個ほどのtableにそれぞれを成形するviewが存在し、そのviewを一つにまとめ
る
統合viewがあり、その統合view1,500件から64件(id='13')と50件(id='14')抽出
しました。
統合viewはvarchar 3フィールドとtext 4フィールドで構成されています。

pgpool.conf内容(テスト用に接続を少なくしていますが多数でも発生していま
す)
------------
num_init_children =2
max_pool = 1
child_life_time = 0
connection_life_time = 0
replication_mode = true
replication_strict = 両パターンでテスト
replication_timeout = *3パターンでテスト
load_balance_mode = *true false ともに変化無し
weight_master=1-0
weight_secondary=0-1 weightがそれぞれ1-0,0-1も変化無し
replication_stop_on_mismatch = false

ログ
------
DEBUG: pid 3254: pool_process_query: waiting for secondary for data
ready
DEBUG: pid 3254: read kind from backend pending data D len: 765 po: 258
DEBUG: pid 3254: read kind from backend pending data D len: 507 po: 516
DEBUG: pid 3254: read kind from backend pending data D len: 249 po: 774
DEBUG: pid 3254: pool_process_query: waiting for secondary for data
ready
ERROR: pid 3254: pool_check_fd: data is not ready tp->tv_sec 0
tp->tp_usec 0
ERROR: pid 3254: pool_process_query: secondary data is not ready at
synchronous point. abort this session
ERROR: pid 3254: pool_process_query: kind does not match between
backends master(C) secondary()
LOG: pid 3254: do_child: exits with status 1 due to error

---pool_check_fd: data is not ready が発生しない率

replication_timeout 1 の成功率(%)
			SQL文			replication_strict
						true	false
/*STRICT*/ SELECT COUNT(*) ... WHERE id='13'	100	43
/*STRICT*/ SELECT * ...  WHERE id='13'		  0	56
SELECT COUNT(*) ... WHERE id='13'		100	51
SELECT * ...  WHERE id='13'			  0	56

/*STRICT*/ SELECT COUNT(*) ... WHERE id='14'	100	52
/*STRICT*/ SELECT * ...  WHERE id='14'		100	35
SELECT COUNT(*) ... WHERE id='14'		100	55
SELECT * ...  WHERE id='14'			100	23

replication_timeout 5000 の成功率(%)
						true	false
/*STRICT*/ SELECT COUNT(*) ... WHERE id='13'	100	100
/*STRICT*/ SELECT * ...  WHERE id='13'		  0	 89
SELECT COUNT(*) ... WHERE id='13'		100	100
SELECT * ...  WHERE id='13'			  0	 78

/*STRICT*/ SELECT COUNT(*) ... WHERE id='14'	100	100
/*STRICT*/ SELECT * ...  WHERE id='14'		100	 86
SELECT COUNT(*) ... WHERE id='14'		100	100
SELECT * ...  WHERE id='14'			100	 72

eplication_timeout 15000 の成功率(%)
						true	false
/*STRICT*/ SELECT COUNT(*) ... WHERE id='13'	100	100
/*STRICT*/ SELECT * ...  WHERE id='13'		  0	 87
SELECT COUNT(*) ... WHERE id='13'		100	100
SELECT * ...  WHERE id='13'			  0	 77

/*STRICT*/ SELECT COUNT(*) ... WHERE id='14'	100	100
/*STRICT*/ SELECT * ...  WHERE id='14'		100	 85
SELECT COUNT(*) ... WHERE id='14'		100	100
SELECT * ...  WHERE id='14'			100	 75


その後逆の環境でサーバAでinitdb後テストしてみました
strict=true の時の値が変化しています。
数値の低下はサーバの性能でしょうか・・

サーバB       サーバA
       -------postgres1
pgpool-l
       -------postgres2

replication_timeout 5000 の成功率(%)
						true	false
/*STRICT*/ SELECT COUNT(*) ... WHERE id='13'	100	100
/*STRICT*/ SELECT * ...  WHERE id='13'		 35	 75
SELECT COUNT(*) ... WHERE id='13'		100	100
SELECT * ...  WHERE id='13'			 48	 61



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