Last modified: Tue Nov 23 20:55:20 JST 2010

ストリーミングレプリケーションとpgpool-IIの組み合わせ、簡単設定法

概要

このチュートリアルでは、ストリーミングレプリケーションとpgpool-IIの組み合わせを誰でも簡単に試せる方法を説明します。 必要なのはLinuxが動くマシン1台のみです。このマシンに、PostgreSQLのインスタンスを2つ、pgpool-II、pgpoolAdminを全部インストールしてしまいます。

この設定は非常に単純なものですが、それでもPostgreSQL 9.1自体に不足している以下のような機能を実現できます。

こにチュートリアルに書いてあることを理解すれば、2台の物理サーバを使った現実的なシステムに容易に応用することができるはずです。

システムの全体図を示します。

ここでは、ポート5432番がプライマリサーバに、5433番がセカンダリサーバに割り当てられます。 これは初期設定に過ぎません。 あとでこの2つの役割は簡単に交換が可能です。

PostgreSQL 9.1のインストール

もっと簡単な方法は、PostgreSQLのオフィシャルサイトからLinux用のパッケージをダウンロードすることです。 しかし、Linuxパッケージでは、通常1つのPostgreSQLのインスタンスしか起動できません。 ですから、システム起動時のPostgreSQLの自動起動設定を止めて、pg_ctlでPostgreSQLを手動起動しなければなりません。

他に、PostgreSQLをソースコードから導入する方法もあります。 これは驚くほど簡単です。tar ballを展開し、configure;make;make installとするだけです。 詳細はPostgreSQLのマニュアルをご覧ください。

以後、データベースクラスタは/home/postgres/dataと/home/postgres/standbyにあり、postgresユーザに所有されているものとします。

$ initdb -D /home/postgres/data
$ initdb -D /home/postgres/standby

次に以下を /home/postgres/data/postgresql.conf と /home/postgres/standby/postgresql.conf に追加します。 "logging_collector"以下は ストリーミングレプリケーションには直接関係ありませんが、こうすることによって管理が簡単になります。 実際のシステムでは、log_statement = 'all'は削除した方が良いかもしれません。

hot_standby = on
wal_level = hot_standby
max_wal_senders = 1
logging_collector = on
log_filename = '%A.log'
log_line_prefix = '%p %t '
log_truncate_on_rotation = on
log_statement = 'all'

スタンバイは5433ポートで実行するので、以下を /home/postgres/standby/postgresql.conf に追加します。

port = 5433

pg_hba.confを/home/postgres/dataに設定します。 もちろん、"/some/where/" の部分はスクリプトをダウンロードした場所に置き換えてください。

$ cp /some/where/pg_hba.conf" /home/postgres/data"

プライマリサーバを起動します。

$ pg_ctl -D /home/postgres/data start

pgpool-IIのインストール

本稿で説明する設定では、pgpool-II 3.1.1 が必要です。 tar ballを用意してあるので、ご利用ください。

以下を適当なユーザで実行します。 "postgres"ユーザが選ばれることが多いでしょう。 "install-functions.sh"は ここからダウンロードできます。 もちろん、"/some/where/" の部分は実際にスクリプトをダウンロードした場所に読み替えてください。

$ tar xfz /some/where/pgpool-II-3.1.1.tar.gz
$ cd pgpool-II-3.1.1
$ ./configure
$ make
$ sudo make install
$ cp /some/where/install-functions.sh .
$ sh install-functions.sh

次に pgpool-II の設定ファイルをインストールします。 主要なファイルはpgpool.confです。 他にpcp.confがあります。 rootで以下を実行します。

# cp /some/where/pgpool.conf /usr/local/etc
# chown apache /usr/local/etc/pgpool.conf
# cp /some/where/pcp.conf /usr/local/etc
# chown apache /usr/local/etc/pcp.conf

ここでchownを実行している理由は、pgpoolAdminがこれらの設定ファイルを更新する必要があるからです。 pgpoolAdminはPHPスクリプトで、Apacheから実行されます。 もし pgpoolAdmin を使用しない場合(つまり、pcpコマンドラインツールだけを利用する)は、chownは必要ありません。

pcp.confの"postgres" アカウントの初期パスワードは "pgpoolAdmin"です。 インストール後、パスワードを速やかに変更することを強くおすすめします。 新しいパスワード文字列は pg_md5 コマンドを使って得ることができます。 詳細は pgpool-II doc をご覧ください。

オンラインリカバリを実行するために、basebackup.shpgpool_remote_start をインストールします。 pgpool_remote_start 中で、 pg_ctl コマンドへのパス名が指定されています。 実際のPostgreSQLのインストール状況に応じて、これを変更する必要があるかもしれません。

$ cp /some/where/basebackup.sh /home/postgres/data
$ chmod 755 basebackup.sh
$ cp /some/where/pgpool_remote_start /home/postgres/data
$ chmod 755 pgpool_remote_start

自動フェイルオーバ処理で使うスクリプトfailover.shをインストールします。

$ sudo cp /some/where/failover.sh /usr/local/etc
$ chmod 755 failover.sh

必要なディレクトリを作ります。 以下をrootで実行してください。 ここでchownを実行している理由は、pgpoolAdminがこれらの設定ファイルを更新する必要があるからです。 pgpoolAdminはPHPスクリプトで、Apacheから実行されます。 もし pgpoolAdmin を使用しない場合(つまり、pcpコマンドラインツールだけを利用する)は、chownは必要ありません。

# mkdir /var/run/pgpool
# chown apache /var/run/pgpool
# mkdir /var/log/pgpool
# chown apache /var/log/pgpool
# mkdir /var/log/pgpool/trigger
# chmod 777 /var/log/pgpool/trigger

プライマリサーバとスタンバイサーバそれぞれで、apache ユーザを作ります。

$ createuser apache
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n

pgpoolAdminのインストール

pgpoolAdmin は、PHPで実装された pgpool-II の管理ツールです。 pgpoolAdminは、pgpool-IIを実行するサーバと同じサーバ上で実行しなければなりません。 これはすなわち、実質的にはpgpoolAdminはWindowsでは動作しないことを意味します。 pgpoolAdminはPHPが4.2以上であれば動作しますが、PostgreSQLにアクセスするための拡張がインストールされていることが必要です。 PHPをソースからインストールするときは --with-pgsql を付けてビルドしてください。 PHPをrpmからインストールする場合、一部のディストリビューション(たとえばVine Linux)ではPostgreSQL拡張が最初からバンドルされていますが、多くのディストリビューションでは、追加で入れる必要があります。

pgpoolAdmin にはインストーラが付属しているので、インストールは容易です。 本稿で説明する設定では、現時点(2010/11/8)時点でまだリリースされていない pgpoolAdmin 3.1.1が必要です(もしくはCVS HEAD)。 tar ballを用意したのでご利用ください。 Apacheのドキュメントディレクトリ(たとえば/var/www/html/)で展開後、 インストール説明読んでください。 インストーラでpgpoolAdminをインストールする際のポイントを説明します。 まず以下を実行します。

# cd /var/www/html/pgpoolAdmin-3.1.1
# chmod 777 templates_c
# chown apache conf/pgmgt.conf.php
# chmod 644 conf/pgmgt.conf.php

準備ができたら、pgpoolAdminインストーラを適当なブラウザで開きます。 この例では、URLは http://localhost/pgpoolAdmin-3.1.1/install/index.php になります。 このページが表示されるはずです。 ここでLanguageメニューから日本語を選べば、実際には以後の画面は日本語表示になります。 "Next" を選ぶと この画面になります。 すべての項目が緑でチェックされていることを確認してください。 それならすべてOKということです。 "Next"を選択し、主設定画面に移動します。 デフォルト値から変更を推奨するのは以下の項目です。

説明通りに設定すると、このような画面になるはずです。 これでpgpoolAdminのインストールは終わりです。お疲れ様!

pgpool-IIの起動

pgpoolAdminにログインしてpgpool-II を "pgpool status" menuから起動します。 ポート番号5432のPostgreSQL が プライマリサーバとして実行中となっているはずです。 ポート番号9999で、psqlからpgpool-IIに接続できます。 テーブルを作ってみましょう。

$ createdb -p 9999 test
$ psql -p 9999 test
test=# create table t1(i int);
CREATE TABLE
test=# 

pgpoolのログには次のように表示されているはずです。

$ tail /var/log/pgpool/pgpool.log.Wednesday
2010-11-03 23:12:55 LOG:   pid 4148: DB node id: 0 backend pid: 4607 statement: create table t1(i int);

同じクエリのログがPostgreSQLのログにも表示されます。

$ tail /home/postgres/data/pg_log/Wednesday.log
4607 2010-11-03 23:12:55 JST LOG:  statement: create table t1(i int);

スタンバイサーバの起動

この時点では、スタンバイサーバは動いていません。 スタンバイサーバを起動するには、"Recovery" ボタンを選択します。 "basebackup.sh" が起動され、しばらくするとスタンバイサーバが 自動的に起動されます

スタンバイサーバが動き出したので、レプリケーションが始まっています。 データをt1テーブルに登録してみましょう。

-- insert into t1 via pgpool-II.
-- it will be executed on primary server
psql -p 9999 test
test=# insert into t1 values(1);
test=# \q
psql -p 5433 test
-- now connected to standby server
test=# select * from t1;
 i 
---
 1
(1 row)

スタンバイサーバがダウンしたら?

スタンバイサーバがダウンすると、pgpool-IIはそれを切り離します。 ユーザがpgpool-II経由で普通にSQLを発行できます。 ストリーミングレプリケーションはもちろん止まっています。 スタンバイサーバを復旧するには、"Recovery" ボタンを選択します。

プライマリサーバがダウンしたら?

慌てることはありません。 スタンバイサーバはこのために用意されているのです。

$ pg_ctl -D /home/postgres/data -m f stop

ごらんのように、ポート番号5432のPostgreSQLがダウンすると、5433 のPostgreSQL が旧プライマリサーバに取って代わります。 pgpool-IIは、プライマリサーバがダウンしているのを検知すると、フェイルオーバスクリプト(failover.sh)を実行します。 このスクリプトは/var/log/pgpool/trigger/trigger1をトリガファイルとして作成します。 スタンバイサーバはこのファイルを発見すると、プライマリに昇格します。 ここでポート番号5432のPostgreSQLの"Recovery"ボタンを選択すると、旧プライマリは スタンバイサーバとして復旧します

まとめ

PostgreSQL 9.1 は単純で使いやすい組み込みレプリケーションをサポートしています。 pgpool-IIをその上に組み込むことにより、高可用性システム(HA)を構築することができます。

質問やコメントがあれば、pgpoolメーリングリストまでお寄せください。

石井達夫
ishii at sraoss.co.jp