□PgPool-IIでなくて、PgBouncerを使ってみる
参考
http://taichino.com/engineer-life/linux/3965
http://nippondanji.blogspot.jp/2008/05/apache-moddbd.html
先日来、GSLB(Global Server Load Balancing)機能のためにあれこれしているのだけど、データベースの負荷が上がって思うように処理ができない。見た感じセッションが多すぎてデータベースがアップアップな状態です。
それならばと定石のコネクションプーリングであるPgPool-IIを導入していますが、これIPv6に対応していないのと、設定が複雑なのでちょっと面倒です。
で、何かいい方法がないかなぁとネットをぶらぶらしていたら、PgBouncerというものがありました。
しかもこれ、IPv6での接続にも対応しています。(・∀・)イイネ!!
冗長化とか可用性とかはおいといて、とにかくデータベースの負荷を下げたいのでPgBouncerを使ってみることにしました。
インストール方法は参考ページはじめあちこちに書いてあるので省略しますが、はまったことだけ書いておきます。
・「auth_type = trust」なので、別にユーザー登録要らないんじゃ?
「/etc/pgbouncer/pgbouncer.ini」で
> auth_file = /etc/pgbouncer/userlist.txt
と定義しているんだけど、その手前でtrustにしちゃっているんだから要らないのでは?(結局まだ確認してない)
・「/etc/pgbouncer/pgbouncer.ini」には余計なことを書いてはいけない
コメントを書こうものなら「/var/log/pgbouncer.log」(/var/log/pgbouncer/pgbouncer.logではない)に
> ERROR broken auth file
と文句を言われます。でもtrustにしてたらスルーです。 😛
・たぶんログを掃除しないとえらいことになる。
「/var/log/pgbouncer.log」はたいしたことにはならないのでずか、接続/切断を記録している
「/var/log/pgbouncer/pgbouncer.log」は、忙しさに比例してでかくなるので、
ログの掃除を忘れないように。
logrotatedを使っているなら、
cat > /etc/logrotate.d/pgbouncer
----------
/var/log/pgbouncer.log
/var/log/pgbouncer/pgbouncer.log
{
missingok
notifempty
sharedscripts
postrotate
/etc/init.d/pgbouncer restart
endscript
}
----------
と、こんな感じでいかがでしょう?
・PgPool-IIを止めてPgBouncerを起動しても繋がらない
> WARNING Cannot listen on ::/5439: bind(): Address already in use
こんな感じで怒られるので、動作確認のためにもマシンを再起動したほうがいい。
・mod_dbdとセットで使うときにはDBDPersistをOFFに。
まぁこれが一番書きたかったことなんですが…( ゚∀゚)アハハ
HTTP-BASICの認証情報をPostgreSQLに入れてあるので、mod_dbdとセットで使おうとしたら、
「/var/log/pgbouncer/pgbouncer.log」を見る限り接続はしているようなのだけど、
ブラウザでApacheにアクセスしてもぜんぜん表示できない。
いろいろ調べていたら、mod_dbd自体にもコネクションプール機能があるので、もしかしてと思って
> DBDPersist OFF
と明示してmod_dbdのコネクションプール機能をOFFにしたら、すっきりした。
これで無駄なセッションを増やすことなく、PgBouncerでまとめて扱うことができた。
これにより、いままでピークで2000近いセッションでPostgreSQLがぱっつんぱっつんだったのが
200以下になったのですから、そりゃ負荷も20~30前後だったのが0.0xに下がりますってもんです。
めでたしめでたし。 🙂