レプリケーションの準備

PC1のDB1(マスター)をPC2のDB2(スレーブ)にレプリケーションする。

PC1,PC2 ともに DB を作成し、createlang pgpsql をしておく。

pc1$ createdb -E utf8 db1
pc1$ createlang plpgsql db1

pc2$ createdb -E utf8 db2
pc2$ createlang plpgsql db2

ついでにデータを流し込んでおく。

pc1$ pgbench -i db1

pc2$ pg_dump -h 192.168.20.206 db1 | psql db2

これでDBの準備は完了。
いよいよ slony の出番だ。
マスターノードをセットアップする。

#!/bin/sh
CLUSTERNAME=slony_test
DB1=db1
DB2=db2
HOST1=192.168.20.206
HOST2=192.168.20.33
RUSER=postgres

slonik <<_EOF_
cluster name = $CLUSTERNAME;

node 1 admin conninfo = 'dbname=$DB1 host=$HOST1 user=$RUSER';
node 2 admin conninfo = 'dbname=$DB2 host=$HOST2 user=$RUSER';

init cluster (id=1, comment = 'Master Node');

table add key (node id = 1, fully qualified name = 'public.history');

create set (id=1, origin=1, comment='All tables');
set add table (set id=1, origin=1, id=1, fully qualified name = 'public.accounts', comment='account table');
set add table (set id=1, origin=1, id=2, fully qualified name = 'public.branches', comment='branches table');
set add table (set id=1, origin=1, id=3, fully qualified name = 'public.tellers', comment='tellers table');
set add table (set id=1, origin=1, id=4, fully qualified name = 'public.history', comment='history table', key = serial);

store node (id=2, comment = 'Slave Node');
store path (server = 1, client = 2, conninfo='dbname=$DB1 host=$HOST1 user=$RUSER');
store path (server = 2, client = 1, conninfo='dbname=$DB2 host=$HOST2 user=$RUSER');
store listen (origin = 1, provider = 1, receiver = 2);
store listen (origin = 2, provider = 2, receiver = 1);
_EOF_

※WEB-DB Press42 を参考にさせていただいています。

うまく行かなかった場合は

pc1=# drop schema slony_test cascade

pc2=# drop schema slony_test cascade

で削除して、プライマリキーのないテーブルの slony 用のキーっぽいもの(なんだそりゃ)を削除してから

pc1=# ALTER TABLE history DROP "_Slony-I_slony_test_rowID";

pc2=# ALTER TABLE history DROP "_Slony-I_slony_test_rowID";

#!/bin/sh

CLUSTERNAME=slony_test
DB1=trouble
DB2=trouble
HOST1=192.168.20.206
HOST2=192.168.20.33
RUSER=postgres

cluster name = $CLUSTERNAME;

node 1 admin conninfo = 'dbname=$DB1 host=$HOST1 user=$RUSER';
node 2 admin conninfo = 'dbname=$DB2 host=$HOST2 user=$RUSER';

uninstall node(id=1);
_EOF_

とやって、再度実行しないとだめだ。

同様にスレーブ側の設定も行う。

#!/bin/sh
# slon_slave_setup.sh

CLUSTERNAME=slony_test
DB1=db1
DB2=db2
HOST1=192.168.20.206
HOST2=192.168.20.33

slonik <<_EOF_
cluster name = $CLUSTERNAME;

node 1 admin conninfo = 'dbname=$DB1 host=$HOST1 user=$RUSER';
node 2 admin conninfo = 'dbname=$DB2 host=$HOST2 user=$RUSER';

subscribe set (id=1, provider=1, receiver=2, forward=no);

_EOF_

これで準備完了。(長い・・・)