CentOS5.3: Slony-I 2.0を使ってみた (2)
(1)に引き続き、CentOS5.3 のVMx2 を使って、slony-I のレプリケーションを実施してみた。
手順としては、基本的にこちらに従った。(Slony-I の公式ドキュメントのgetting started)
http://www.slony.info/documentation/firstdb.html
当初、ドキュメントの前半のように、
slonik << EOF ... EOF
方式でレプリケーションを作っており、これでも一応レプリケーションの設定は出来たのだが、 何度もCLUSTERNAME を指定しなくてはいけなかったり、そもそもやれることが限られていたりと、あまり使い勝手がよくなかった。。
ただし、文書後半の altperl script を使ってからは、使い勝手が向上したので、ここではそちらを使ってまとめる。 まず、
1. 普通のレプリケーション設定 (2台)
について書いて、その後、
2. レプリケーションを一時的に止める方法
3. テーブル追加の方法
を書いていこうと思う。
1について、まずレプリケーションの準備段階として、両VMで、
$ createdb repldb1; $ createlang plpgsql repldb1 $ psql repldb1 -c "create table table1 (id int, char text, primary key (id)); ";
を実施し、DBの作成、PL pg/SQL、テーブルの作成 の設定を行う。DB名は repldb1としている。 DB名は複数指定するのが難しそうなので、慎重に選ぶ。テーブル名は、table1 としている。
次に、slonikで init cluster を実施するのだが、 altperl script を使う際には、まず事前に /etc/slon_tool.conf を編集し、クラスタ名、ノード名、DB名等を指定しておく。 このファイルはデフォルトの中身があったため、行うことはノード名等を多少編集しただけである。。
注意点として、primary key が無いテーブルについては特殊な設定が必要なようなのだが、筆者はあらかじめprimary key をつけておいたので、使っていない。なお、slon_tool.conf については、
$ slonik_build_env -node centos-virt14:repldb1:postgres -node centos-virt15:repldb1:centos-virt15
のようにして、DB, テーブル等の定義から、自動で生成することもできる。実際やってみると、出来た内容は次のようになった。
&add_node(host => 'centos-virt14', dbname => 'repldb1', port =>5432, user=>'postgres', password=>'', node=>1 ); &add_node(host => 'centos-virt15', dbname => 'repldb1', port =>5432, user=>'centos-virt15', password=>'', node=>2 , parent=>1); @KEYEDTABLES=( "public.table1", );
この状態で、
$ slonik_init_cluster | slonik
を実施すると、クラスタの設定が行われる。なお、元に戻したいときには、
$ slonik_uninstall_nodes | slonik
で一応元に戻るようだ。。
slonデーモンの起動は、
$ slon_start 1 $ slon_start 2
で実施する。 普通は各ノードに/etc/slon_tool.conf を展開し、1ノードで1度ずつslonを起動するのだと思うのだが、筆者が試した限り、masterノードで両方を起動していても、レプリケーションは動いた。 ww ただし、pg_hba.conf で
host all all 127.0.0.1/32 trust host all all 192.168.1.0/24 trust
という設定をしているため、普通の環境では上手くいかないかもしれない。 ww
なお、slonデーモンの停止は、 $ slon_kill で行う。 /etc/init.d/slony1 も確認してみたのだが、 これは、/etc/slon_tool.conf を読まないらしいので、 slon.conf の設定がわかるまでは、 slon_start で起動する予定だ。。
※ slony1-2.0.0-4.rhel5 で slon_start を打つと、 slon_watchdog が上がらないというエラーが表示されるが、 slon_watchdog のバグらしい。 ( セミコロンを一つつけたら正常にうごくようになった。 ww )
--- slon_watchdog 2009-06-24 00:05:01.000000000 +0900 +++ slon_watchdog.20090623 2009-02-20 16:05:29.000000000 +0900 @@ -43,7 +43,7 @@ $pid = get_pid($node); if (!($pid)) { my ($dsn, $dbname) = ($DSN[$nodenum], $DBNAME[$nodenum]); - my ($logfile) = "$LOGDIR/slon-$dbname-$node.err"; + my ($logfile) = "$LOGDIR/slon-$dbname-$node.err" open (SLONLOG, ">>$logfile"); print SLONLOG "WATCHDOG: No Slon is running for node $node!\n"; print SLONLOG "WATCHDOG: You ought to check the postmaster and slon for evidence of a crash!\n";
この後、
$ slonik_create_set 1 | slonik
でset をレプリケーションに追加した後、
$ slonik_subscribe_set 1 2 | slonik
で実際の転送を始められる。それぞれ、
$ slonik_drop_set 1 | slonik $ slonik_unsubscribe_set 1 2 | slonik
で、変更を戻すことが出来る。 slonik_create_set, slonik_drop_set はテーブル追加でもお世話になるのだが、長くなったので続きは次回以降。。