PGPool2のレプリケーションモードを試す

以前にも一度テストしていますが、少し組み合わせが変わったので再テストしてみました。

今回の目的は、pgpool-2のレプリケーションモードを使っている状態でフェールオーバーが正常に稼働するかというものの検証です。以前は複数のDBに対して同期をSoly-Iに任せるという運用にしていたのだけど、もう少し単純化したいのでpgpool-2でレプリケーションと縮退運転の両方を満たせるか試しています。

テストした環境は以下の通り。

本当は3台の環境でテストするのが望ましいと思うけれど、今回は2台の環境でテスト。1台にpgpoolとpostgresqlを同居させて、もう1台にはpostgresqlしか無い状態にしてあります(どちらも仮想環境)。

インストールで気になったのは以下の点

  • PostgreSQL8.4系からinitdb時のロケール処理が変わっているようなので文字コード設定などは要注意
  • pgpoolは標準で/usr/local/配下 (bin/etc等)に入るのでそれが困る方は要注意
  • postgresql.confにlocalhost以外からのアクセスは許可するように設定する必要あり

この状態で設定したpgpool.confは以下の通り(sampleからの差分)。replicationモードを有効にしてhealth_checkを20秒に1回にしてあります。

63,64c63
< replication_mode = true
    • -
> replication_mode = false 72,73c71 < replication_stop_on_mismatch = true
    • -
> replication_stop_on_mismatch = false 98,99c96 < health_check_period = 20
    • -
> health_check_period = 0 102,103c99 < health_check_user = 'postgres'
    • -
> health_check_user = 'nobody' 190,195d185 < backend_hostname0 = '192.168.0.140' < backend_port0 = 5432 < backend_weight0 = 1 < backend_hostname1 = '192.168.0.136' < backend_port1 = 5432 < backend_weight1 = 1

この設定でpgpoolを起動してアクセスすると、指定したバックグラウンドのdbに接続します。よく分かっていないのが以下の点です

  • ターミナルから接続すると同じDBサーバーばかりにアクセスが行われている。backend_weightが効いてないように感じる
  • 上記条件から一度接続して繋がっていない側のPostgreSQLは停止しても全く問題なく稼働する
  • 2つのDBに接続されているはずだが、希に繋がっているPostgreSQLを停止すると接続先可能な相手が全て停止したというメッセージがでて、縮退運転に切り替わらない場合がある

切り替わらない場合があるのが致命的なので、もう少しテストは必要ですね。ただ、20秒に1回で自動チェックは有効なようで、接続しているPostgreSQLを停止してしばらくしてからアクセスするときちんと切り替わっているのが不思議なところです。

この辺はもう少し詳しくテストしてみるつもりです。