kuniku’s diary

はてなダイアリーから移行(旧 d.hatena.ne.jp/kuniku/)、表示がおかしな箇所はコメントをお願いします。記載されている内容は日付およびバージョンに注意してください。直近1年以上前は古い情報の可能性が高くなります。

pgpoolの利用

postgresの利用性・耐障害性などを高めるpgpool、その設定方法などについて

インストール、設定、利用

pgpoolのモード

      • raw
      • コネクションプールモード
      • レプリケーションモード
      • マスタースレーブモード
      • パラレルモード

でpgpool.confで設定しなければならないのか記載されている。

  • クライアント認証(HBA)のための pool_hba.conf の設定

pgpool側の認証でなく、postgres側の認証を利用することができる。


pgpoolの自動起動redhat系の場合)
/usrlocal/src/pgpool.xxx などのインストール前の展開した中に
redhat/pgpool.init があるので、それを /etc/rc.d/init.d/pgpool などとしてコピーして利用する。

pgpoolのファイル内で、

上記サイトを参考に 最初の方の設定 pgpool.confファイルのパスやログやpidなどの場所を指定し、

service pgpool start とすれば起動はできる。(確認するには、postgres側も起動しておく)

ただ、 http://d.hatena.ne.jp/vector_xenon/20090617/1245233507 にあるとおり、

service xxxx stop

を実行してもstopできない。(centos5.xにおいて確認)

デフォルトのiniでは、killproc でプロセス終了させてるけど、パス指定(プログラム指定)が /usr/XXXX と記載されているので,そこを /usr/local/pgsql/pgpool.2.x.x/boin/pgpool などと直接指定しまうことでも可能。
※2009-11-09,10追記の内容も合わせて確認してください。

stop(){
        echo -n $"Stopping ${NAME} service: "
        if [ $UID -ne 0 ]; then
                RETVAL=1
                failure
        else
                killproc /usr/bin/pgpool  ←ここを直接パス指定しちゃう
#                $PGPOOLDAEMON stop >> "$PGPOOLLOG" 2>&1 < /dev/null
                RETVAL=$?
                [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/${NAME}
        fi;
        echo
        return $RETVAL
}

ただし、pgpoolのプロセスが複数存在する場合は、killprocの全部killされない?
http://www.02.246.ne.jp/~torutk/linux/centos5/daemon.html の 「同じプロセス名が複数存在する場合、killprocで終了できない」より)


もともと # で $PGPOOLDAEMON stop ってコメントアウントされてるんだよね。

2009-11-09,10追記ここから

pgpool-II-2.2.5のpgpool.initは、

killproc /usr/bin/pgpool がデフォルトになってました。

また、前述の

killproc /usr/bin/pgpool ←ここを直接パス指定しちゃう

  ↓ のようにする方が無難だと思います。

$PGPOOLDAEMON -m fast stop -f $PGPOOLCONF & >> "$PGPOOLLOG" 2>&1 < /dev/null

起動時にpgpool.confファイルを指定した場合は、
-f + ファイルパスのパラメータを付与
pgpoolを強制停止する場合は、 -m fast を付与


実行した結果
killproc で停止する場合は、以下をコンソールに表示
$ service pgpool stop
$ pgpool サービスを停止中: [OK]

-m fast stopで停止した場合は、以下をコンソールに表示

$ service pgpool stop
$ pgpool サービスを停止中: stop request sent to pgpool. waiting for termination...done.


なお、rootユーザなどがpgpoolを起動・停止するのではなく、個別に作成した専用ユーザが起動・停止する場合のサンプルは、

start(){
 ・・・

#       $PGPOOLDAEMON -f $PGPOOLCONF $OPTS & >> "$PGPOOLLOG" 2>&1 < /dev/null
        su - postgres -c "$PGPOOLDAEMON -f $PGPOOLCONF $OPTS" & >> "$PGPOOLLOG" 2>&1 < /dev/null
 ・・・

}

stop(){
 ・・・
 #               killproc /usr/bin/pgpool
 #               killproc /usr/local/pgpool/bin/pgpool
 #               $PGPOOLDAEMON stop & >> "$PGPOOLLOG" 2>&1 < /dev/null
 #               $PGPOOLDAEMON -m fast stop -f $PGPOOLCONF  & >> "$PGPOOLLOG" 2>&1 < /dev/null
                su - postgres -c "$PGPOOLDAEMON -m fast stop -f $PGPOOLCONF"  & >> "$PGPOOLLOG" 2>&1 < /dev/null
 ・・・

}
  • ポイント
    • 「su - postgres」としているところを pgpoolを実行するユーザにする。
    • 「-m fast stop」(または-m immediate)のため、接続しているプロセスがあっても強制終了します。切断されるのを待機するには、-mオプションを指定しない。
    • 「-f pgpool.confのファイルパス」として起動させているので、停止時も同様に-fを指定しました。

2009-11-09,10追記ここまで

ソース
http://www.google.co.jp/codesearch/p?hl=ja&sa=N&cd=2&ct=rc#SpF3rymF6LA/redhat/pgpool.init&q=pgpool.ini
は、コメントアウトされていないけど、展開したファイルではコメント行があった。
なお、googleソースコードはIE8ではjsエラーで見られないけど、FF3.5なら見られる。他のブラウザでは未確認。

注意!!

restart(){
    stop
    start
}

は、stopして、startしてるから問題なし。

reload(){
echo -n $"Reloading ${NAME}: "
   if [ -n "`pidfileofproc $PGPOOLDAEMON`" ] ; then
      killproc $PGPOOLDAEMON -HUP
   else
      failure $"Reloading ${NAME}"
   fi
   RETVAL=$?
   echo
}

reloadは、上記だけど

killproc $PGPOOLDAEMON -HUP

としてるのが、動作するかは試していません。



参考、リンク

  • pgpool-II の今と今後の展望

http://www.postgresql.jp/events/enterprise1_pgpool.pdf

  • pgpool-II 導入・設定ガイド

http://www-06.ibm.com/jp/domino01/mkt/cnpages7.nsf/ec7481a5abd4ed3149256f9400478d7d/4925722f004efe92492573ad0076e4fe/$FILE/pgpool-II_Install_Guide_v1_2.pdf