Slony-I 1.2で複数DBのレプリケーションをやってみた

前回の例では、単一DBを複数のノードにレプリケートしたが、複数のDBを別個のノードにレプリケートする際には、複数のセットを定義する必要がある。
例えば、

set1:  1:  repldb1: 1 ==> repldb2: 2
set11: 11: slmaster: 11 ==>slslave: 12
set21: 21: pgbenchmaster: 21 ==> pgbenchmaster: 22

のように、複数のDBからレプリケートするには、次のように repldb1(DB), slmaster(DB), pgbenchmaster(DB) の中に含まれるテーブルを書き下す必要がある。(テーブルは筆者の環境で任意に作成した)

    "set1" => {
	"set_id"       => 1,
	"origin"       => 1,
	"table_id"     => 1,
	"pkeyedtables" => ["table1","table2","table3"],
    },
    "set11" => {
	"set_id"       => 11,
	"origin"       => 11,
	"table_id"     => 11,
	"pkeyedtables" => ["table1"],
    },
    "set21" => {
	"set_id"       => 21,
	"origin"       => 21,
	"table_id"     => 21,
	"pkeyedtables" => ["public.accounts", "public.branches", "public.tellers"],
	"serialtables" => ["public.history"],
    },

また、 add_node のところでも念のため、対応するparent を設定することができるが、set がDBごとに重複しないなら、 set 内でoriginを設定することでもsetごとにmasterが設定されるようだ。(未確認)

なお、この方法では、既にレプリケートが行われている中で新たにレプリケートを追加したい場合、slonik_* では、新たに追加したいノードに _クラスタ名 のスキーマを加えることができない (通常は slonik_init_cluster を使うが、既に稼働中の場合は使用できない ) ため、手動でスキーマを作成するなどの手段が必要なようだ。


ただし、単純にレプリケートをDBごとに追加したいだけなら、同一のslon_tools.conf を使用する必要は無く、 repldb1_repldb2.conf, slmaster_slslave.conf などの設定ファイルをDBごとに設定する方法もある。設定ファイルは、slonik_*, slon_start で --config 設定ファイル名 のオプションを使って与えることが出来る。

この方法なら、他DBに影響を与えることなく、各DBのレプリケーションを始めることができる。頻繁に新規のDBを追加する環境では使いやすそうだ。