CentOSでPgBouncerを使ってみる

InstagramがPgBouncer使っているというので、試してみようと思って忘れてたのですが、ふと思い出したので使ってみました。

とりあえずインストールします。現在の最新は1.5.4でした。pgbouncer.iniとuserlist.txtを忘れず/etc/pgbouncerにコピーしておきます。

$ sudo yum install libevent-devel
$ cd ~/src
$ wget http://pgfoundry.org/frs/download.php/3393/pgbouncer-1.5.4.tar.gz
$ tar zxvf pgbouncer-1.5.4.tar.gz
$ cd pgbouncer-1.5.4
$ ./configure
$ make
$ sudo make install
$ sudo mkdir /etc/pgbouncer
$ sudo cp etc/pgbouncer.ini /etc/pgbouncer/.
$ sudo cp etc/userlist.txt /etc/pgbouncer/.

次にpgbouncerユーザを作ってサービスが使用するディレクトリを作っておきます。

$ sudo useradd pgbouncer
$ sudo mkdir -p /var/log/pgbouncer
$ sudo mkdir -p /var/run/pgbouncer
$ sudo chown pgbouncer:pgbouncer /var/log/pgbouncer
$ sudo chown pgbouncer:pgbouncer /var/run/pgbouncer

続いて設定ファイルを配置します。tar玉にCentOS用の設定ファイルが収録されてないので、RPMファイルを解凍して使っています。/etc/sysconfig/pgbouncerに設定ファイルとログファイルの位置が指定されています。RPMでインストールしてない理由は、PostgreSQL本体をソースからインストールしたので何となく合わせてたというところです。

$ cd ~/src/rpm
$ wget http://yum.postgresql.org/9.2/redhat/rhel-5-x86_64/pgbouncer-1.5.4-1.rhel5.x86_64.rpm
$ rpm2cpio pgbouncer-1.5.4-1.rhel5.x86_64.rpm|cpio -id
$ sudo cp etc/sysconfig/pgbouncer /etc/sysconfig/.
$ cat /etc/sysconfig/pgbouncer
# pgbouncer defaults
#

# Path to the init file
BOUNCERCONF=/etc/pgbouncer/pgbouncer.ini

# Path to the log file
BOUNCERLOG=/var/log/pgbouncer/pgbouncer.log

$ sudo cp etc/rc.d/init.d/pgbouncer /etc/init.d/.
$ sudo chmod 755 /etc/init.d/pgbouncer
$ sudo chkconfig --add pgbouncer
$ sudo chkconfig pgbouncer on

設定ファイルを編集します。とりあえず接続したいPostgreSQLのデータベースへの接続情報を指定すれば良さそうです。

$ sudo vim /etc/pgbouncer/pgbouncer.ini
$ cat /etc/pgbouncer/pgbouncer.ini
[databases]

dbname = host=localhost dbname=dbname user=db_user password=db_user_pass
bench = host=localhost dbname=bench user=postgres

[pgbouncer]
...

$ sudo vim /etc/pgbouncer/userlist.txt
$ cat /etc/pgbouncer/userlist.txt  # PostgreSQLへ接続するユーザとパスワード
"username" "password"

サービスを起動して接続確認をします。psqlでポート6432につなげたら成功しています。
アプリケーション側の設定もポートを変更すれば良いだけなので対応が簡単で嬉しいですね。

$ sudo service pgbouncer start
pgbouncer サービスを開始中:                                [  OK  ]
$ psql -U username -p 6432 dbname
psql (9.2.2)
"help" でヘルプを表示します.

以上でPgBouncerの導入は完了です。どのくらい速くなったのか知りたいのでpgbenchを比べてみました。

$ createdb bench
$ pgbench -c 10 -C -T 60 bench
starting vacuum...end.
transaction type: TPC-B (sort of)
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
duration: 60 s
number of transactions actually processed: 5344
tps = 88.983322 (including connections establishing)
tps = 248.902319 (excluding connections establishing)
$ pgbench -c 10 -C -T 60 -p 6432 bench
starting vacuum...end.
transaction type: TPC-B (sort of)
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
duration: 60 s
number of transactions actually processed: 14628
tps = 243.671017 (including connections establishing)
tps = 311.174304 (excluding connections establishing)

tpsの値がconnection establishingの分を合わせると89と243という3倍近いパフォーマンスが出ています。コネクションをプールするだけで何故こんなに速くなるのか理屈が良く解りませんが、とりあえず凄いですね。

というわけでPgBouncerをBargain Netに無事導入出来ました。多分速くなっているはず。

Leave a Reply

Your email address will not be published. Required fields are marked *