Linux Install Memo

サーバー管理者によるLinux関連ソフトのインストールメモ

Home » □PgPool-IIでなくて、PgBouncerを使ってみる

□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に下がりますってもんです。

めでたしめでたし。 🙂

Name of author

Name: admin

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です