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に無事導入出来ました。多分速くなっているはず。