postgresでレプリケーションI

仕事で作っているシステムで、データベースのレプリケーションが必要になったので色々と試してみる。データベース本体は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 とでている。なんだこれ?エラーの様子からするとそれぞれ通信しあっているように見えるんだけど…。とりあえずもうちょっと色々試す必要ありそうだな…。

twitter

ウェブページ

Powered by Movable Type 4.261
Creative Commons License
このブログはクリエイティブ・コモンズでライセンスされています。