レプリケーションの準備
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_
これで準備完了。(長い・・・)