[pgsql-jp: 30256] PostgreSQL用コネクションプールサーバ pgpool
Tatsuo Ishii
t-ishii @ sra.co.jp
2003年 6月 27日 (金) 22:54:46 JST
石井です.
PHPをはじめ,Perlなど,言語を問わず使える「pgpool」というPostgreSQL用
のコネクションプールサーバを作ったので公開します.できたてなのでまだア
ルファ版程度のクォリティですが,よろしかったらお試し下さい.
ftp://ftp.sra.co.jp/pub/cmd/postgres/pgpool/pgpool-0.1.tar.gz
# もちろんpgpoolはオープンソースで,ライセンスはPostgreSQLのBSDライセ
# ンスと同様のものにしています.
pgpoolを作った動機は,PHPでコネクションプールが使えないことに不満を持っ
たからです.一応PHPには「パーシスタントコネクション」というものがあっ
てDBへの接続への接続をキャッシュできますが,少なくともapacheのプロセス
の数だけコネクションができるので,DBへ過大な負荷がかかりがちです.
pgpoolを使うとコネクションをキャッシュできるだけでなく,DBへの接続数を
適切な数に制限できるので,DBの性能を引き出すことができます.
実際,Apache, PHP, ab(Apache用のベンチマークプログラム)を使った実験を
行ったところ,私の非力なマシン環境ではApacheへの同時接続数150の場合,
PHP からPostgreSQLへの接続エラーが多発するのに対し,pgpoolを併用するこ
とによってエラーなく安定して動作することが確認できています.
また,pgpoolにはフェイルオーバー機能があるので,2台のPostgreSQLサーバ
を用意して可用性を高めることもできます(ただし,レプリケーション機能は
ありません).
以下,参考までにREADMEを付けておきます.
--
Tatsuo Ishii
---------------------------------------------------------------------
pgpool version 0.1 (akohekohe) README
1. pgpoolとは
pgpoolは,PostgreSQL専用のいわゆる「コネクションプール」サーバで,
PostgreSQLクライアントとPostgreSQLサーバの間で両者の仲立ちをします.
pgpoolを利用することによって,PostgreSQLサーバへの接続オーバヘッド
を低減でき,システム全体のスループットを向上させることができます.
PostgreSQLのクライアントがpgpoolに接続すると,初回はPostgreSQLへの
接続がpgpoolから確立されます.クライアントが終了してもPostreSQLへの
接続は切断されることなく残り,次回の同じユーザ,データベースで
pgpoolへの接続があったときにはこのPostgreSQLへの接続が再利用されま
す.
また,pgpoolには「フェイルオーバー」の機能があるので,システムのダ
ウンタイムを最小限に押さえることができます.
2. pgpoolのメリット
世の中にはpgpool以外にもデータベース用のコネクションプールサーバが
存在しますが,それらと比較した場合のpgpoolのメリットを説明します.
(1) アプリケーションの変更の必要がありません
コネクションプール用のソフトには専用の特別なAPI(アプリケーショ
ンプログラムインターフェイス)を経由しないと利用できないものもあ
りますが,pgpoolはクライアントから見ると普通のPostgreSQLサーバ
に見えるため,そのようなAPIを使用する必要がありません.今まで
PostgreSQLを使っていたアプリケーションは,接続先のポート番号や
ホストを変更するだけですぐにpgpoolが利用できるようになります.
(2) どの言語でも使えます
pgpoolはPostgreSQLのクライアントやアプリケーションから見ると普
通のPostgreSQLサーバに見えます.したがってPHP, Perl, Javaなど
各言語用のPostgreSQL用APIがそのまま使えます.
(3) prefork型アーキテクチャ
Apacheなどと同様,あらかじめサーバプロセスをforkしておくアーキ
テクチャを採用.コネクション要求の度にサーバプロセスをforkする
方式に比べ,オーバヘッドが少なく,応答性が優れています.
(4) PostgreSQLへの接続数の制限が可能
PHPからPostgreSQLにアクセスする場合,同時接続数がApacheサーバの
プロセス数と等しくなるため,PostgreSQLが過負荷になりがちです.
pgpoolではPostgreSQLへの接続数はpreforkしたpgpoolのサーバ数に
よって制限されるため,PostgreSQLがもっとも効率良く動作する同時
接続数を維持することができます.
(5) フェイルオーバー機能を装備
pgpoolには「フェイルオーバー」の機能があります.すなわち,
PostgreSQLサーバを2台指定しておき,1台がダウンした際に自動的に2
台目のサーバに切り替えることができます.フェイルオーバー機能に
より,システムのダウンタイムを最小限に押さえることができます.
ただし,2台のPostgreSQLサーバのデータを同期させる機能はありませ
んので,必要ならばdbmirrorなどのレプリケーションパッケージを併
用してください.
また,フェイルオーバーの際にはクライアントとのコネクションが切
断されます.したがって,フェイルオーバー後はクライアントは再度
pgpoolに接続する必要があります.
3. pgpoolのデメリット
(1) オーバヘッドがあります
PostgreSQLに対するアクセスはすべていったんpgpoolを経由するため,
その分のオーバヘッドがあります.オーバヘッドの量は条件によって
異なるので一概には言えませんが,私がpgbenchで試した限りでは7-
15%程度の性能劣化が認められました.
(2) すべてのlibpqプロトコルがサポートされていません
現時点では,以下の機能がサポートされていません.
o trust以外の認証方式
o pgpoolに対して,pg_hba.confによるアクセス制御はサポートされて
いません(pgpoolが接続するPostgreSQLではもちろんpg_hba.confに
よるアクセス制御が有効になります)
(3) pgpool自体にpg_hba.confによるアクセス制限はかかりません
TCP/IPコネクションを許可している場合(後述の
allow_inet_domain_socketが1の場合),pgpool自体にはどのホストか
らでも接続できてしまいます.必要ならばiptablesなどを使ってアク
セス制限をかけて下さい(もちろん,pgpoolが接続するPostgreSQLサー
バではpg_hba.confによるアクセス制限が有効です).
4. pgpoolの稼働環境
pgpoolは,libpqプロトコルのversion 2(PostgreSQL 7.0-7.3.xで採用)に
対応しています.
対応するOSは特に制限がありません.以下,動作が確認された環境です.
Vine Linux 2.6CR (kernel 2.4.20-0vl29.1)/PostgreSQL 7.3.3
RedHat Linux 8.0 (kernel 2.4.18-14)/PostgreSQL 7.3.2
FreeBSD 4.7-RELEASE/PostgreSQL 7.2.4
5. pgpoolのインストール方法
(1) 準備
pgpoolをコンパイルするためには,PostgreSQLの以下のヘッダーファ
イルが必要です.
server/postgres_fe.h
server/libpq/pqcomm.h
これらがインストールされていない場合は,PostgreSQLのソースツリー
の中で,
$ make install-all-headers
を実行してください.
FreeBSDでは,ソースコードに変更が必要です.pool.hの33行目付近
#define NONE_BLOCK
を
#undef NONE_BLOCK
に変更してください.
(2) pgpoolのインストール
./configure
make
make install
でインストールが完了します(GNU makeが必要なので,FreeBSDなどでは
makeをgmakeに読み替えてください).デフォルトのインストール先は,
/usr/local以下で以下のようなファイルがインストールされます.
/usr/local/bin/pgpool プログラム本体
/usr/local/etc/pgpool.conf.sample 設定ファイルサンプル
インストール先を変更する場合は,configure --prefix=path... とし
てください.
また,PostgreSQLのヘッダーファイルが/usr/local/pgsql/include以外
にある場合は,
configure --with-pgsql=path...
で指定できます.
6. pgpoolの設定方法
pgpoolの設定パラメータはpgpool.confで設定します.pgpool.conf.sample
をpgpool.confにコピーし,設定を行ってください.
pgpool.confの書式は以下です.
(1) 設定項目 = 値 のペアで設定を行います.
(2) 値が数値の場合はそのまま数字を書きますが,文字列の場合は'(単一
引用符)で括ります.例:'foo'
(3) 空白行は無視されます.
(4) 行の先頭に"#"(シャープ)がある行は無視されます.コメント行として
お使い下さい.
pgpool.confには以下のような設定項目があります.
allow_inet_domain_socket
INETドメインソケットを通じてpgpoolに接続することを許可する場合は1と
してください.デフォルト値は0になっています.なお,UNIXドメインソケッ
ト経由の接続は常に受け付けます.
port
pgpoolがコネクションを受け付けるポート番号です.デフォルト値は9999
です.
backend_host_name
pgpoolが接続するPostgreSQLサーバ(postmaster)が動いているホストの名
前(文字列)です.デフォルト値は''で,この場合UNIXドメインソケットを
通じて接続を行います.''以外ならばホスト名と見なし,INETドメインソ
ケット経由で接続します.この場合,PostgreSQL側ではTCP/IPコネクショ
ンを受け付けるようになっていること,またpg_hba.confが適切に設定され
ていてpgpoolからの接続を許可するようになっている必要があります
(PostgreSQLから見ると,pgpoolはクライアントに見えることを思い出し
てください.).
backend_port
PostgreSQLサーバのポート番号です.デフォルト値は5432です.
secondary_backend_host_name
フェイルオーバー機能を利用する場合,2台目のPostgreSQLサーバのホスト
名を指定します.デフォルト値は''です.
secondary_backend_port
フェイルオーバー機能を利用する場合,2台目のPostgreSQLサーバのポート
番号を指定します.0を指定するとフェイルオーバしません.デフォルト値
は0です.
num_init_children
preforkするpgpoolのサーバプロセスの数です.デフォルト値は16になっ
ています.
max_pool
pgpoolの各サーバプロセスがキープするPostgreSQLへの最大コネクション
数です.pgpoolは,ユーザ名,データベースが同じならばコネクションを
再利用しますが,そうでなければ新たにPostgreSQLへのコネクションを確
立しようとします.したがって,ここでは想定される[ユーザ名:データベー
ス名]のペアの種類の数だけをmax_poolに指定しておく必要があります.
max_poolのデフォルト値は1です.
なお,pgpool全体としては,num_init_children*max_pool 分だけ
PostgreSQLへのコネクションが張られる点に注意してください.
logdir
pgpoolの各種ログファイルを格納するディレクトリです.現在のところ,
pgpool.pidというプロセスIDを格納するファイルだけが作られるようになっ
ています.logdirのデフォルト値は'/tmp'です.
7. pgpoolの起動
pgpoolを起動するもっとも簡単な方法は,
$ pgpool
とするだけです.これで/usr/local/etc/pgpool.confを読み込み,その設
定でサーバを起動します.
指定可能なオプションは次の通りです.
-f path
デフォルト以外のコンフィギュレーションファイルのパス名を指定します.
-n
デーモンモードで起動しません.このオプションはloggerやrotatelogsな
どを使ってエラーメッセージをファイルに出力するときなどに便利です.
-d
デバッグメッセージを大量に出力します.
-h
ヘルプメッセージを出力して終了します.
8. pgpoolの終了
「stop」オプションを使います.
$ pgpool stop
で停止できます.
pgsql-jp メーリングリストの案内