[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 メーリングリストの案内