[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 メーリングリストの案内