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 はテーブル追加でもお世話になるのだが、長くなったので続きは次回以降。。