PostgreSQLでDBをレプリケーションなど負荷分散機能を使用したい場合の選択肢の一つとしてpgpoolがあげられます。
現在pgpool-IIとしてLinuxをはじめ、SolarisやFreeBSDなどのほとんどのUNIX環境で動作します。残念ながらWindowsでは動きません。対応するPostgreSQLのバージョンは、PostgreSQLの6.4以降です。ただしパラレルクエリモードを使用するときはPostgreSQL 7.4以降になります。
どこがいいの?何が出来る?
1. アプリケーション側での接続方法は通常のPostgreSQLへの接続方法と同じ
クライアント側からは通常のPostgreSQLサーバとして見えます。ポート番号やホストをpgpoolへ変更するだけで接続できます。
2. 言語を限定しない
PostgreSQLサーバとして接続する為、PostgreSQLに接続できる言語(PHP, Perl, Javaなど)ならどれでも使用できます。
3. フェイルオーバー機能
PostgreSQLサーバを2台指定しておくことにより,マスタがダウンした際に自動的にセカンダリのサーバに切り替えることができます。
4. レプリケーション機能
複数のPostgreSQLサーバを管理することができます。レプリケーションを使用することにより、物理的に2台以上のディスクに リアルタイムでハードディスクのバックアップを取ることができ、万が一どれかのディスクに障害が発生しても運用を継続することができます。
5. 負荷分散機能
レプリケーションモードで動作している場合「負荷分散」を行うことができます。
6. 接続数の制限が可能
PostgreSQLへの接続数をPostgreSQLがもっとも効率良く動作する同時接続数で維持することができます。
7. コネクションプーリング
PostgreSQLへの接続を保存しておき、再利用することによってPostgreSQLへの接続オーバヘッドを低減でき、システム全体のスループット を向上させることができます。
インストール
ここではソースからインストールする方法をご紹介します。
./configure
make
make install
デフォルトのインストール先は, /usr/local以下で以下のようなファイルがインストールされます。
/usr/local/bin/pgpool プログラム本体
/usr/local/etc/pgpool.conf.sample 設定ファイルサンプル
インストール先を変更する場合は,configure –prefix=path… としてください。
pgpool.confを設定
/usr/local/etc/pgpool.conf.sampleファイルを/usr/local/etc/pgpool.confにコピーします。
pgpool.confでは空白行や#で始まる行はコメントと見なされます。以下抜粋します。
1: # pgpool-IIへのアクセスを許可するネットワークやアドレスを指定する
2: listen_addresses = ‘*’ # ‘*’を設定すると、無条件で接続可能
3: port = 9999 # pgpool-IIのアクセスポート
4: pcp_port = 9898 # pgpool-IIの制御用アクセスポート
5:
6: # pgpool-IIをレプリケーションモードで起動
7: replication_mode = true
8:
9: # ノード0 => サーバpostgres0の情報を設定
10: backend_hostname0 = ‘192.168.1.100′ # サーバpostgres0のIPアドレス
11: backend_port0 = 5432 # PostgreSQLのポート番号
12: backend_weight0 = 1
13: backend_data_directory0 = ‘/usr/local/pgsql/data’ # ベースディレクトリ
14:
15: # ノード1 => サーバpostgres1の情報を設定
16: backend_hostname1 = ‘192.168.1.101 # サーバpostgres1のIPアドレス
17: backend_port1 = 5432 # PostgreSQLのポート番号
18: backend_weight1 = 1
19: backend_data_directory1 = ‘/usr/local/pgsql/data’ # ベースディレクトリ
PCP コマンドの設定
pgpool-II では PCP コマンドと呼ばれるインタフェースを通して pgpool-II の停止やデータベースノードに関する情報の表示を行います。 PCP コマンドを使用するにはユーザ認証が必要になるので、ユーザ名とパスワードを pcp.conf ファイルに設定します。 pcp.conf ファイルの書式は以下のように 1 行ごとにユーザ名と MD5 ハッシュに変換されたパスワードを : で区切ったものです。
postgres:e8a48653851e28c69d0506508fb27fc5
pgpool-II をインストールするとサンプルとして pcp.conf.sample ファイルが作成されるので、それを pcp.conf というファイル名にコピーしてから編集するといいでしょう。
cp /usr/local/etc/pcp.conf.sample /usr/local/etc/pcp.conf
また、PCP コマンドはネットワークを通して実行されるので、pgpool-II が PCP コマンドを受け付けるポート番号を pgpool.conf
ファイルの pcp_port パラメータに設定します。ここでは、pcp_port パラメータに最初から設定されているポート番号 9898 をそのまま使用します。
pcp_port = 9898
起動と停止
起動するには以下のように コマンドを実行します。
pgpool -n &
以下のようにすることでログメッセージをファイルに保存できます。(-d オプションはデバッグメッセージの出力を有効にします。)
pgpool -n -d > /tmp/pgpool.log 2>&1 &
停止するには以下のコマンドを実行します。
pgpool stop
通常は停止する際にクライアントが接続している場合、その接続が切断されるまで待ってから停止します。 強制的に停止するには以下のを実行します。
pgpool -m fast stop
使用してみる
後は普通のPostgreSQLと同様の使用方法になります。もちろんpsql使用できます。
ポートやホストを変更している場合は
psql -p xxx -h xxx db_name
として入ってください。状態を確認するには
show pool_status
で確認できます。特に障害などで萎縮運転をしているときに現在マスタとセカンダリどちらが動いているか確認できます。
後はほぼ普通の使用方法と変わりません。気をつけることはnow()を使用してのタイムスタンプカラムなどの更新はDB間で値がずれて不整合が起こる可能性が大きいので控えることでしょうか。(書き込むタイミングがサーバ間で厳密には同時ではない為)
その他
pgpool-IIからはオンラインリカバリを実施できます。(PostgreSQLにライブラリを追加します)←こちらは使用したこと無いので今回はパスします。
以上、簡単にPostgreSQLをレプリケーション運用できますので、一度試してみてはいかがでしょうか?
は