pgpoolを使ったPostgreSQLのレプリケーション

こんばんは、牧野です。
前回、その前の前とPostgreSQLのチューニングについてでしたが今日もPostgreSQL関連で、PostgreSQLでのレプリケーションについてです。
MySQLの場合、別のソフトウェアを使わなくてもMySQLだけでレプリケーションを実現できますが、PostgreSQLの場合は別途専用のソフトが必要になります。
今回はそんなソフトの1つ、pgpool-II(以下pgpoolと書いています)を使ったレプリケーションを紹介します。

pgpoolを使うと、PostgreSQLで手軽にマルチマスタ方式のレプリケーションを実現できます。
他にも、コネクションプーリング、アクティブスタンバイ、slony-I等のレプリケーションソフトと組み合わせたマスタ・スレーブ方式のレプリケーション、時間がかかる検索処理を複数サーバで並列処理させる(パラレルモード)というようなことができたりします。

詳しくはこちらのページをご覧下さい。
http://pgpool.projects.postgresql.org/pgpool-ja.html

まずインストールですが、インストールは簡単にできます。pgfoundryのページにソースがあるので、ダウンロードします。
http://pgfoundry.org/frs/?group_id=1000055&release_id=1187
ファイルを解凍、展開して、そのディレクトリに移動後、


./configure
make
make install

します。インストール場所を変更する場合はconfigure時に


./configure --prefix=/var/lib/pgpool

のようにprefixで指定します。今回は/var/lib/pgpoolにインストールしました。
PostgreSQLは、今回は2台のPC(colinuxのCentOS)にPostgreSQL8.3.3をソースコンパイルでインストールしました。そのうちの1台にpgpoolも同居しています。

次に設定です。pgpoolの設定ファイルは3種類で、pgpoolのディレクトリ内のetcにあります。

■pgpool.conf
pgpoolのメイン設定ファイル。

■pcp.conf
pgpool管理用コマンドを使うユーザ、パスワードを設定。

■pool_hba.conf
pgpoolにアクセスするホスト、ユーザの認証方式を設定。
PostgreSQLのpg_hba.confにあたります。

とりあえず、.sampleファイルをコピーして各ファイルを作成します。
以下、概要です。

pcp.confには
(ユーザ名):(md5で暗号化されたパスワード)
を書きます。pg_md5コマンドを使うと便利です。
pg_md5 パスワード
で、暗号化パスワードが出力されます。

pool_hba.confはpg_hba.confと同様の書き方ですが、認証方式にtrust、reject、pamしか使えないなどの制限があります。

pgpool.confについて、レプリケーションモードで使用する主な設定項目を挙げると、、、

■listen_address
■port
 pgpoolがアクセスを受け付けるアドレス、ポート番号

■pcp_port
 pgpool用管理コマンドで使用するポート番号

■enable_pool_hba
 trueの場合、pool_hba.confを使った認証を行います

■num_init_children
 pgpoolへのアクセスを受付けるプロセスの数
 問い合わせを途中でキャンセルする時にはもう1つ別プロセスを使うことになるので、想定数よりも大きめの値を設定します

■logdir
 デフォルトで/tmpになっていますが、ちゃんとログを取りたい場合は専用のディレクトリを設定します

■health_check_period
 数字を指定すると、アクセスがない場合でも指定した秒間隔でデータベースにつながるかチェック(ヘルスチェック)するようになります

■health_check_user
 ヘルスチェックを行うユーザ名
 パスワードなしでデータベースにアクセスできるユーザを指定します

■backend_hostname#
■backend_port#
■backend_weight#
 pgpoolで使用するPostgreSQLのホスト名、ポート、負荷分散時のアクセスウェイトを設定
 #の部分にはデータベースの数に応じて0,1,2...を入れて設定します。2台の場合は


backend_hostname0 = 'localhost'
backend_port0 = 5432
backend_weight0 5
backend_hostname1 = '192.168.1.123'
backend_port1 = 5432
backend_weight1 = 5

のように2つ分設定します

■replication_mode
マルチマスタ型レプリケーションを行う時はtrueを設定

■load_balance_mode
select文を負荷分散させる時はtrueを設定

こんな感じで設定します。
認証についてですが、データベースにアクセスするには、pool_hba.confで設定したpgpoolの認証を通った後、データベースのpg_hba.confで設定してある認証を通る必要があります。
レプリケーションモードではデータベースの方のpg_hba.conf設定にも制限があって、
trust, reject, password, pam
しか使えないので注意して下さい。

あと各PostgreSQLにはデータベースを作る権限のある同一ユーザを作成しておきます。

設定できたら、各PostgreSQL、pgpoolを起動します。
pgpoolの起動ですが、redhat系の場合は自動起動用のスクリプトがpgpoolのソールディレクトリのredhat/pgpool.initにあります。
スクリプトの最初の方の変数を適宜環境に合せて書き換えて、


PGPOOLENGINE=/var/lib/pgpool/bin
PGPOOLDAEMON=$PGPOOLENGINE/pgpool
PGPOOLCONF=/var/lib/pgpool/etc/pgpool.conf
PGPOOLLOG=/var/lib/pgpool/log/pgpool.log

/etc/init.d/pgpoolにコピーします。
これで


/etc/init.d/pgpool start

で起動できます。


psql -h (pgpoolのホスト) -p (pgpool.confのport) -U (ユーザ名) (データベース名)

で接続できればとりあえず成功です。

せっかくなので、pgbenchでベンチマークを取ってみます。
pgbenchは、PostgreSQLソースディレクトリ内のcontrib/pgbench
へ移動して


make
make install

でインストールできます。


pgbench -i -h (pgpoolのホスト) -p (pgpool.confのport) -U (ユーザ名) (ベンチマーク用に新規作成するデータベース名)
pgbench -h (pgpoolのホスト) -p (pgpool.confのport) -U (ユーザ名) (上のコマンドで指定したデータベース名)

を実行すると、

pgpoolと2つのPostgreSQLの場合


starting vacuum...end.
transaction type: TPC-B (sort of)
scaling factor: 1
number of clients: 1
number of transactions per client: 10
number of transactions actually processed: 10/10
tps = 14.349405 (including connections establishing)
tps = 15.667645 (excluding connections establishing)

単独PostgreSQLの場合


starting vacuum...end.
transaction type: TPC-B (sort of)
scaling factor: 1
number of clients: 1
number of transactions per client: 10
number of transactions actually processed: 10/10
tps = 52.104772 (including connections establishing)
tps = 62.106015 (excluding connections establishing)

クライアント数が1だと3倍以上速くなっていることがわかります。クライアント数が増えたら差は小さくなりそうですが、思ったより速くなりました。

…以上、文章は長くなってしまいましたが、pgpoolを使う環境は簡単に作れます。PostgreSQLが重い場合は試してみてはいかがでしょうか。

最後おまけで、、pgpoolにはpgpoolAdminというウェブ管理ツールがあります。初期設定は設置後/install/にアクセスして行え、各ノードの確認や設定ファイルの変更が簡単にできたりと便利です。ソースはpgpoolと同様pgfoundryからダウンロードできます。