pgpool-IIでデータベースの同期を行う

pgpool-IIとは

pgpool-II(以下pgpool)はPostgreSQLサーバとクライアントの間で動作するPostgreSQL専用のミドルウェアです。
以下のような機能を持ちます。

  • コネクションプール
  • 接続数制限
  • レプリケーション(DBの同期)
  • 負荷分散

レプリケーション機能

レプリケーションとはデータベースの複製を作成し、データの更新があっても全てのデータベースに同一のデータが保持されるようにする機能です。pgpoolでは複数のPostgreSQLサーバをバックエンドノードとし、クエリを受け取ったときに全てのノードに対して同じクエリを送信することでレプリケーションを実現しています。全てのノードでSQLが終わってから処理を返すため、DBの同期をリアルタイムに行うことができます。
pgpoolはアプリケーション側からは普通のPostgreSQLサーバに見えるよう振る舞うため、基本的にはバックエンドに複数サーバが存在することを意識せずにクエリを投げることが可能です。ただしサーバごとに処理結果が異なってしまうようなクエリや、同時接続プロセスの実行順序によって結果が異なってしまうようなクエリを投げると同一のデータを維持することができなくなるため注意が必要です。 なお、負荷分散機能が有効な場合SELECT文についてはどれか一つのノードにのみ送信されます。

pgpoolインストール方法

公式でrpmが配布されています。以下から入手できます。
http://pgpool.net/mediawiki/index.php/Downloads
以下はver3.3.4、PostgreSQL9.2用のrpmを利用してインストールする場合の例です。

rpm -ivh http://www.pgpool.net/download.php?f=pgpool-II-pg92-3.3.4-2.pgdg.x86_64.rpm

pgpoolの設定

pgpoolにはpgpoolそのものを制御するためのインターフェース(pcp)が用意されており、これを利用するためにはユーザ認証が必要となるため以下のように設定を行います。

vim /etc/pgpool-II/pcp.conf
-------------------------------------------
#以下の一行を追記
ユーザ名:md5暗号化したパスワード
-------------------------------------------

md5暗号化したパスワードは以下のようにして作成できます。

pg_md5 -p
password: *******

次に動作モードの設定を行います。pgpoolには以下の様な動作モードがあり、動作モードごとに利用できる機能が異なります。

  • rawモード
  • レプリケーションモード
  • マスタスレーブモード

レプリケーション機能を利用する場合はレプリケーションモードを選択します。
/etc/pgpool-II/以下に各モードの設定サンプルが用意されているので、このうちpgpool.conf.sample-replicationを利用して設定を行います。

cp /etc/pgpool-II/pgpool.conf.sample-replication /etc/pgpool-II/pgpool.conf

後は利用する環境に合わせて設定ファイルを編集します。

vim /etc/pgpool-II/pgpool.conf

変更すべき点を列挙していきます。

接続IPの設定

listen_addresses = 'localhost'

接続を許可するIPアドレスを指定します。
‘*’を設定すると全てのIPからの接続を許可します。

pidの設定

pid_file_name = '/var/run/pgpool/pgpool.pid'

pidファイルのパスを指定します。設定されているディレクトリが書き込み可能でなければならないので、以下のようにディレクトリを作成して権限を付与してください。

mkdir /var/run/pgpool/
chmod 755 /var/run/pgpool/

バックエンドサーバの設定

バックエンドで動作させるデータベースサーバの設定を行います。

backend_hostname0 = 'host1'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'

上記で1台分の設定です。2台目以降を追加するには設定の末尾の番号を1,2,3,…と増やしたものを追記してください。
なお、末尾の番号が0のものがマスタとして扱われます。

以下、各設定の詳細です。

バックエンドのホスト名の設定

backend_hostname0 = 'host1'

‘host1’の部分にバックエンドサーバのホスト名やIPアドレスを記述してください。

バックエンドのポート番号の設定

backend_port0 = 5432

PostgreSQLのポート番号です。デフォルトで5432なので変更していなければこのままで問題ありません。

バックエンドの重み付けの設定

backend_weight0 = 1

負荷分散の重み付けです。ロードバランスモードを有効にしたときのみ必要です。

バックエンドのデータベースクラスタの設定

backend_data_directory0 = '/data'

データベースクラスタのパスを指定します。
データベースクラスタのパスはPostgreSQLの初期設定時に指定していなければPostgreSQLサーバ上で以下のようにすることで調べることができます。

su - postgres
echo $PGDATA

バックエンドのフラグ設定

backend_flag0 = 'ALLOW_TO_FAILOVER'

バックエンド単位での挙動を制御するフラグです。 ‘ALLOW_TO_FAILOVER’はフェイルオーバやデタッチが可能になる設定です。 これらを行いたくない場合は’DISALLOW_TO_FAILOVER’を指定してください。

pgpoolの起動

pgpoolを起動する前に各バックエンドサーバでPostgreSQLを起動し、外部(pgpoolサーバ)から接続できるように設定しておきます。 以下のコマンドでpgpoolを起動します。

pgpool -n > /var/log/pgpool.log 2>&1 &

停止は以下のコマンドで行えます。

pgpool stop

動作確認

pgpoolサーバで以下のようにしてデータベースを作成します。

su - postgres
createdb -h localhost -p 9999 -U postgres testdb1

バックエンドサーバでデータベースが作られているかを確認します。

psql -h {backend_host} -p 5432 postgres -l

データベースが作られていなかった場合は以下の点を確認してください。

  • バックエンドサーバのPostgreSQLで外部接続が行えるように設定したか
  • pgpool.confに誤りがないか
  • pgpool.confのbackend設定が間違っている状態でpgpoolを起動したことがないか

pgpool.confの設定を変更した場合はpgpoolを再起動する必要があります。
また、pgpool.confのbackend設定はpgpoolを起動するとpgpool_statusに記録されてしまい、設定ファイルを編集しても変更が適用されなくなってしまいます。そうなってしまった場合は起動時に-Dオプションをつけてpgpool_statusを削除してください。