こんばんは、牧野です。
前回、その前の前と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からダウンロードできます。