LCL Engineers' Blog

バス比較なび・格安移動・バスとりっぷを運営する LCLの開発者ブログ

pgpool-II 入門(インストールと簡易設定)

弊社のサービスには、PostgreSQL用のミドルウェアであるpgpool-IIを利用しています。

techblog.lclco.com

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接続と変わらないため、コードを変更せず導入可能
  • 独立したミドルウェアのため、言語に依存せず導入可能

f:id:lcl-engineer:20160929013003p:plain

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に対応する方法を紹介いたします。