[pgsql-jp: 34117] pgpool 2.2 on FreeBSDでレプリケーションに失敗する
Kenichirou Kimura (木村健一郎)
kimura @ project-com.com
2004年 10月 15日 (金) 13:05:22 JST
木村と申します。
pgpoolをいつも便利に使わせて頂いています。
先日pgpool-2.2がリリースされましたので、さっそくこれまでpgpool-2.0.9で
運用していたシステムにインストールしたのですが、これまでうまくいってい
たレプリケーションに失敗するようになりました。環境は以下のような状態で
す。
・192.168.1.101(マスター)
OS: FreeBSD 4.10-STABLE
pgpool → localhost:5432をlisten
PostgreSQL 7.3.6 → localhost:5434 をlisten
・192.168.1.100(セカンダリー)
OS: FreeBSD 4.10-STABLE
PostgreSQL 7.3.6 → localhost:5432 をlisten
pgpool.confの設定(関係しそうな部分だけ)
listen_addresses = 'localhost'
port = 5432
backend_host_name = ''
backend_port = 5434
backend_socket_dir = '/tmp'
secondary_backend_port = 5432
secondary_backend_host_name = '192.168.1.100'
replication_mode = true
replication_strict = true
replication_timeout = 5000
で、pgpoolとそれぞれのPostgreSQLを起動してpsqlでpgpool経由で接続しよう
とすると
psql: kind mismatch between backends
とエラーが出ました。pgpoolを-ndをつけて起動しログを見ると、
DEBUG: pid 43811: pool_process_query: waiting for secondary for data ready
ERROR: pid 43811: pool_check_fd: select() failed. reason Invalid argument
ERROR: pid 43811: pool_process_query: secondary data is not ready at synchronous
point. abort this session
ERROR: pid 43811: pool_process_query: kind does not match between backends maste
r(C) secondary(^@)
LOG: pid 43811: do_child: exits with status 1 due to error
となってました。
pool_process_query.cの292行目で
if (pool_check_fd(SECONDARY(backend), 0))
とpool_check_fd()を呼んだ際に、selectで失敗しているのですが、さらに調
べたところどうもFreeBSDではselectの第5引数に渡すtimevalで、
timeval.tv_usecが1000000(1秒)を越えているとselectがEINVALを返している
ようです。
そのため、pgpool.confでreplication_timeoutを1000未満の値にすると動きま
すし、timevalをセットする部分を以下のように修正すると動きました。
timeout.tv_sec = pool_config.replication_timeout / 1000;
timeout.tv_usec = pool_config.replication_timeout - (timeout.tv_sec * 1000);
おなじpgpool-2.2でも、RedHat Linux AS 3.0ではこの現象は起こらず普通に
動いていますので、FreeBSD固有の問題ではないかと思っています。他に
FreeBSDで運用されてる方はいかがでしょうか?
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
木村健一郎
pgsql-jp メーリングリストの案内