仕事で作っているシステムで、データベースのレプリケーションが必要になったので色々と試してみる。データベース本体はPostgreSQL([[http://www.postgresql.jp/:http://www.postgresql.jp/]])なので、候補としては、
-pgpool([[http://www2b.biglobe.ne.jp/~caco/pgpool/:http://www2b.biglobe.ne.jp/~caco/pgpool/]])
-pgCluster([[http://www.csra.co.jp/~mitani/jpug/pgcluster/:http://www.csra.co.jp/~mitani/jpug/pgcluster/]])
-slony1([[http://gborg.postgresql.org/project/slony1/projdisplay.php:http://gborg.postgresql.org/project/slony1/projdisplay.php]])
といったあたりか。今回のシステムの構成は、3台のホストで動いているpostgresを同期させたい、というものなので、2台までのレプリケーションにのみ対応しているpgpoolは必然的に候補から外れてしまう。一番簡単に使えそうではあったんだけど…。残る二つのうち、まずpgClusterから試してみる。開発しているの日本人なんでドキュメントも日本語でちゃんとそろっている、というあたりがまず手をつけた理由か(^^;)。
まずはテストということで、レプリケーションサーバーと3台分のクラスターサーバーを1台のホストの上で動かして実験してみる。
[[http://www.csra.co.jp/~mitani/jpug/pgcluster/src/download_1_3.html:http://www.csra.co.jp/~mitani/jpug/pgcluster/src/download_1_3.html]]
より、8.0.1用のパッチをダウンロードし、
[[http://ftp.ne.jp/database/postgresql/source/v8.0.1/postgresql-8.0.1.tar.bz2:http://ftp.ne.jp/database/postgresql/source/v8.0.1/postgresql-8.0.1.tar.bz2]]
からpostgresqlの8.0.1をダウンロード。別にパッチがあたっているpgClusterのフルバージョンを持ってきてみてもいいんだけど、なんとなく。続いて、
[[http://www.csra.co.jp/~mitani/jpug/pgcluster/1_3/install.html:http://www.csra.co.jp/~mitani/jpug/pgcluster/1_3/install.html]]
を参考にインストール。パッチを当てたあとのconfigureのオプションは
./configure --prefix=/usr/local/pgcluster ----enable-thread-safety --with-openssl
とした。すでに/usr/local/pgsql に開発用に使っているpostgresが動いているので。インストールが完了したら、
[[http://pcweb.mycom.co.jp/column/yetanother/035/:http://pcweb.mycom.co.jp/column/yetanother/035/]]
と
[[http://www.csra.co.jp/~mitani/jpug/pgcluster/1_3/db_conf.html:http://www.csra.co.jp/~mitani/jpug/pgcluster/1_3/db_conf.html]]
を参考に設定。まずは、/usr/local/pgcluster/data を作成し、
/usr/local/pgcluster/bin/initdb -E EUC_JP --no-locale -D /usr/local/pgcluster/data
を実行してデータベースを初期化する。続いて、/usr/local/pgcluster/data/postgresql.conf を修正。
#listen_addresses = 'localhost' # what IP interface(s) to listen on;
↓
listen_addresses = '*' # what IP interface(s) to listen on;
#port = 5432
↓
port = 15432
さらに、/usr/local/pgcluster/data/pg_hba.conf に手元のネットワークを最後尾に追加。
host all all 192.168.0.0/24 trust
そして、/usr/local/pgcluster/data/cluster.conf の「set Replication Server information」というセクションを
localhost
8001
8101
8201
「set Cluster DB Server information」というセクションを
7101
7201
/usr/bin/rsync
ssh -1
read_only
/usr/local/pgcluster/data/cluster.sts
/usr/local/pgcluster/data/cluster.log
というように修正。
さて、ここまでできたら、
cp -pr /usr/local/pgcluster/data /usr/local/pgcluster/data2
cp -pr /usr/local/pgcluster/data /usr/local/pgcluster/data3
とやって初期状態を複製。そして、/usr/local/pgcluster/data2/postgresql.conf を以下のように修正
port = 15432
↓
port = 15433
/usr/local/pgcluster/data2/cluster.conf を以下のように修正。
/usr/local/pgcluster/data/cluster.sts
/usr/local/pgcluster/data/cluster.log
↓
/usr/local/pgcluster/data2/cluster.sts
/usr/local/pgcluster/data2/cluster.log
同様に、/usr/local/pgcluster/data3/postgresql.conf も
port = 15432
↓
port = 15434
さらに、/usr/local/pgcluster/data3/cluster.conf も
/usr/local/pgcluster/data/cluster.sts
/usr/local/pgcluster/data/cluster.log
↓
/usr/local/pgcluster/data3/cluster.sts
/usr/local/pgcluster/data3/cluster.log
と修正。
最後に、
cp /usr/local/pgcluster/etc/pgreplicate.conf.sample /usr/local/pgcluster/etc/pgreplicate.conf
とやってファイルをコピーし、「 A setup of Cluster DB(s)」セクションを
localhost
15432
7101
7201
localhost
15433
7101
7201
localhost
15434
7101
7201
と修正し、「A setup of a replication server」を
/usr/local/pgcluster/data/pgreplicate.sts
/usr/local/pgcluster/data/pgreplicate.log
8001
8101
8201
8301
normal
no
1
というように設定。ロードバランサは今回は使わないのでコメントアウトしたまま。
さて、まずは参考にした上記URLに書かれているようにレプリケーションサーバーを起動してみる。
/usr/local/pgcluster/bin/pgreplicate -l -D /usr/local/pgcluster/etc
続いて、まず最初のクラスターサーバーを起動してみる。
/usr/local/pgcluster/bin/pg_ctl -l /usr/local/pgcluster/cluster1.log -D /usr/local/pgcluster/data start
一応、ログをファイルに吐き出すように「-l /usr/local/pgcluster/cluster1.log」をオプションとして渡してある。試しにこのログを見てみると、
LOG: could not create IPv6 socket: Address family not supported by protocol
LOG: database system was shut down at 2005-02-28 05:20:33 JST
LOG: checkpoint record is at 0/A2C84C
LOG: redo record is at 0/A2C84C; undo record is at 0/0; shutdown TRUE
LOG: next transaction ID: 544; next OID: 17230
LOG: database system is ready
と問題なく起動されている。最後の「database system is ready」が重要。
続いて、二つ目のクラスターを起動してみる。
/usr/local/pgcluster/bin/pg_ctl -l /usr/local/pgcluster/cluster2.log -D /usr/local/pgcluster/data2 start
起動後、cluster2.logを確認してみると、なにやらずーっとログが出っ放しでとまらない。こんな感じ。
LOG: background writer process (PID 24883) exited with exit code 1
LOG: terminating any other active server processes
LOG: all server processes terminated; reinitializing
LOG: database system was interrupted at 2005-02-28 05:24:37 JST
LOG: checkpoint record is at 0/A2C888
LOG: redo record is at 0/A2C888; undo record is at 0/0; shutdown TRUE
LOG: next transaction ID: 544; next OID: 17230
LOG: database system was not properly shut down; automatic recovery in progress
LOG: record with zero length at 0/A2C8C4
LOG: redo is not required
LOG: database system is ready
LOG: background writer process (PID 24886) exited with exit code 1
LOG: terminating any other active server processes
「database system is ready」と出ているにもかかわらず、すぐ次にはなんかのプロセスが止まっている。しばらく動かしっぱなしにしてみたけどログが増えていくだけだったので、いったん全て停止する。
/usr/local/pgcluster/bin/pg_ctl -D /usr/local/pgcluster/data2 stop
/usr/local/pgcluster/bin/pg_ctl -D /usr/local/pgcluster/data stop
/usr/local/pgcluster/bin/pgreplicate -D /usr/local/pgcluster/etc stop
なにがおかしいのかよくわからず、色々と設定ファイルを眺めて、とりあえずポート周りを変えていってみる。/usr/local/pgcluster/data2/cluster.confを以下のように変更。
7101
7201
↓
7102
7202
同じように、/usr/local/pgcluster/data3/cluster.confを以下のように変更。
7101
7201
↓
7103
7203
さらに、/usr/local/pgcluster/etc/pgreplicate.conf の「A setup of Cluster DB(s)」を以下のように変更。
localhost
15432
7101
7201
localhost
15433
7102
7202
localhost
15434
7103
7203
さて、では早速起動してみる。まずは、レプリケーションサーバーとクラスターサーバー1。
/usr/local/pgcluster/bin/pgreplicate -l -D /usr/local/pgcluster/etc
/usr/local/pgcluster/bin/pg_ctl -l /usr/local/pgcluster/cluster1.log -D /usr/local/pgcluster/data start
ログを確認すると、特に問題ない。さて続いて先ほど問題のあった二つ目のクラスターサーバーを起動してみる。
/usr/local/pgcluster/bin/pg_ctl -l /usr/local/pgcluster/cluster2.log -D /usr/local/pgcluster/data2 start
cluster2.logを確認すると、今度はちゃんと
LOG: could not create IPv6 socket: Address family not supported by protocol
LOG: database system was shut down at 2005-02-28 05:24:46 JST
LOG: checkpoint record is at 0/A2C8C4
LOG: redo record is at 0/A2C8C4; undo record is at 0/0; shutdown TRUE
LOG: next transaction ID: 544; next OID: 17230
LOG: database system is ready
と出ている:)。気をよくしつつ引き続き3つ目のクラスターサーバーを起動。
/usr/local/pgcluster/bin/pg_ctl -l /usr/local/pgcluster/cluster3.log -D /usr/local/pgcluster/data3 start
すると、こちらも同様問題なし:)。
では早速、まずは空っぽのデータベースでも作ってみよう、と、
/usr/local/pgcluster/bin/createdb -p 15432 test1
とやってみる。「-p 15432」とポートを指定することでクラスター1に接続している。「-p 15433」にすれば当然クラスター2に接続することになる。が、なぜか全くプロンプトが返ってこない。ログを見ると、cluster1.logには
ERROR: source database "template1" is being accessed by other users
ERROR: source database "template1" is being accessed by other users
ERROR: source database "template1" is being accessed by other users
ERROR: source database "template1" is being accessed by other users
ERROR: source database "template1" is being accessed by other users
ERROR: source database "template1" is being accessed by other users
ERROR: source database "template1" is being accessed by other users
ERROR: source database "template1" is being accessed by other users
ERROR: source database "template1" is being accessed by other users
LOG: unexpected EOF on client connection
ERROR: source database "template1" is being accessed by other users
と出ていて、cluster2.logとcluster3.logには
ERROR: database "test1" already exists
ERROR: database "test1" already exists
ERROR: database "test1" already exists
ERROR: database "test1" already exists
ERROR: database "test1" already exists
ERROR: database "test1" already exists
ERROR: database "test1" already exists
ERROR: database "test1" already exists
とでている。なんだこれ?エラーの様子からするとそれぞれ通信しあっているように見えるんだけど…。とりあえずもうちょっと色々試す必要ありそうだな…。