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