弊社のサービスには、PostgreSQL用のミドルウェアであるpgpool-IIを利用しています。
pgpool-IIは非常に良いソフトウェアだと思いますが、多機能であり用途によって設定が異なるため、最初の導入が難解なのがネックです。 公式ドキュメントは充実しているものの、用途別の構成にはなっていないため、詳細を読みこんで目的のパラメータを取捨選択する必要があります。
今回は、多少なりともpgpool-IIを利用するハードルを下げるために、機能の説明と導入の手順を記載したいと思います。
説明に利用する環境
- Amazon Linux ( AMI release 2015.03 )
- PostgreSQL 9.5
- pgpool-II 3.5.2
pgpool-IIとは
pgpool-IIは、アプリケーションとPostgreSQLの間を中継する形で動作するミドルウェアで、以下のような特徴があります。
- コネクションプール・負荷分散など、ある程度の規模のアプリケーションに必要となる機能を提供
- 透過的に中継するため、アプリケーションから見ると通常のDB接続と変わらないため、コードを変更せず導入可能
- 独立したミドルウェアのため、言語に依存せず導入可能
pgpool-IIの機能
pgpool-IIには多くの機能がありますが、大きく捉えると次の機能で構成されています。この機能単位で利用する・しないを選択します。
コネクションプール
いわゆるコネクションプールです。多くのケースでこの機能は利用することになると思います。
インメモリクエリキャッシュ
SELECTの結果をキャッシュすることができる機能です。 最近では 、アプリケーションレベルでmemcached等にキャッシュするのが一般的なので、この機能は利用しないケースが多いと思います。
負荷分散
DBサーバが複数台存在する場合に、SELECT文を振り分ける機能です。 「更新系のSQLはマスタノードのみに振り分ける」などの制御も可能なので、マスタ・スレーブ構成でDBサーバを運用する場合には非常に有用な機能です。
レプリケーション
pgpool-IIを利用してレプリケーションを実現する機能です。pgpool-II以外でレプリケーションを実現する場合は、この機能は利用しません。 PostgreSQLでレプリケーションには、PostgreSQLの Streaming Replicationを利用するのが一般的になってきたので、この機能は利用しないケースが多いと思います。
pgpool-IIの動作モード
pgpool-IIの理解を難解にしている要因の一つが動作モードだと思っています。ドキュメントでは以下の3つの動作モードが定義されています。
- rawモード
- pgpool-IIを経由して接続するだけの動作モードです。
- レプリケーションモード
- pgpool-IIでレプリケーションを実現するための動作モードです。
- マスタスレーブモード
- Streaming Replicationのようにpgpool-II以外で、レプリケーションをさせる場合の動作モードです。
ただし、ドキュメント上には他にも「コネクションプールモード」や「Load balancing mode」なども登場し、動作モードの定義が曖昧で多少混乱します。
結局のところ動作モードのことは忘れて、上述した「機能」のみを意識しておくと理解しやすいと考えてます。
よくある構成パターン
DBサーバ1台のアプリケーションの場合 ( 小規模 )
コネクションプール + ( インメモリクエリキャッシュ )
DBサーバ1台の場合は、コネクションプール目的での利用が主になります。 アプリケーションレベルでキャッシュしていない場合は、インメモリクエリキャッシュを利用しても良いと思います。
Streaming Replicationと併用するアプリケーションの場合 ( 中規模以上 )
コネクションプール + 負荷分散
Streaming Replicationを併用する場合は、レプリケーション機能は不要です。 このレベルの規模になると、アプリケーションレベルでキャッシュすることが一般的なので、インメモリクエリキャッシュも不要なケースが多いです。( もちろん必要に応じて利用することは可能です)
pgpool-IIの導入
pgpool-IIのインストール
yumでインストールするのが容易です。libmemcachedに依存しているため、インストールされていない場合は先にインストールします。
# yum install -y http://rpmfind.net/linux/centos/6.7/os/x86_64/Packages/libmemcached-0.31-1.1.el6.x86_64.rpm # yum install -y http://www.pgpool.net/yum/rpms/3.5/redhat/rhel-6-x86_64/pgpool-II-pg95-3.5.2-1pgdg.rhel6.x86_64.rpm
正しくインストールされたことを確認します。
# pgpool -v pgpool-II version 3.5.2 (ekieboshi)
pgpool.confの設定
最低限の設定を例に説明いたします。
DBの接続情報を設定
backend_hostname0 = 'DBサーバのIP' backend_port0 = 5432 backend_weight0 = 1
コネクションの設定
connection_cache = on # コネクションプールを有効にする num_init_children = 32 # データベースへ接続するpgoollのプロセス数 max_pool = 1 # pgpollのプール数。DBユーザ名・データベース名毎に一つ
pool_passwdファイルの作成
ファイルが存在しないと起動時にエラーとなるので、空ファイルを作成します。
# touch /etc/pgpool-II/pool_passwd
ディレクトリの作成
必要なディレクトリを作成します。
# mkdir /var/log/pgpool # chown postgres:postgres /var/log/pgpool/
アプリケーション側のDB接続設定
アプリケーションからDBに接続する際に、pgpool-IIを経由するように変更します。Railsの場合は以下のように設定します。
production: <<: *default database: db username: user password: password host: localhost port: 9999
- pgpoolはデフォルトでは、port 9999で稼働します。
- アプリケーションとpgpoolが別サーバの場合は、hostにはpgpoolのIPアドレスを指定します。
pgpool-IIの起動
# service pgpool start
起動が成功するとログに以下のように出力されます。
# tail -f /var/log/pgpool.log 2016-05-03 11:35:48: pid 1819: LOG: Setting up socket for ::1:9999 2016-05-03 11:35:48: pid 1819: LOG: Setting up socket for 127.0.0.1:9999 2016-05-03 11:35:48: pid 1819: LOG: pgpool-II successfully started. version 3.5.2 (ekieboshi)
以上で導入完了です。プロダクション環境で本格的に利用するには、他にも考慮すべきパラメータがありますが、最低限の設定でもそれなりに動きます。
まとめ
簡単ですが、pgpool-IIの機能と導入方法を説明致しました。次回は、pgpool-IIでStreaming Replicationに対応する方法を紹介いたします。