Slony-Iのデータレプリケーション設定(テーブル追加設定)

Slony-Iのレプリケーション設定を行った後、
レプリケーション機能を稼働させたままレプリケーション中のDBへテーブルを追加する手順です。


レプリケーション中のDB名は「master」。
「master」DBにはtable1,table2,table3があり、既にレプリケーション済。
で、そこへtable4を追加します。

サーバー構成

以下のように想定します。

OS IPアドレス DB名 PostgreSQL Slony-Iバージョン
DBマスターサーバー CentOS 5.4 64bit 10.0.0.1 master PostgreSQL 8.4.5 Slony-I 2.0.6
DBスレーブサーバー CentOS 5.4 64bit 10.0.0.2 slave PostgreSQL 9.0.3 Slony-I 2.0.6



現在(テーブル追加前)のレプリケーションの設定です。

master=# SELECT * FROM _slony_test.sl_table;
 tab_id | tab_reloid | tab_relname | tab_nspname | tab_set | tab_idxname | tab_altered | tab_comment
--------+------------+-------------+-------------+---------+-------------+-------------+-------------
      1 |      78127 | table1      | public      |       1 | table1_pkey | f           | table1
      2 |      78132 | table2      | public      |       1 | table2_pkey | f           | table2
      3 |      78137 | table3      | public      |       1 | table3_pkey | f           | table3
(3 rows)


master=# SELECT * FROM _slony_test.sl_subscribe;
 sub_set | sub_provider | sub_receiver | sub_forward | sub_active
---------+--------------+--------------+-------------+------------
       1 |            1 |            2 | f           | t
(1 row)


マスターサーバー

以下スクリプトを実行します。

#!/bin/sh
CLUSTERNAME=slony_test
DB1=master
DB2=slave
HOST1=10.0.0.1
HOST2=10.0.0.2
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';
create set (id=2, origin=1, comment='Add table4');
set add table (set id=2, origin=1, id=4, fully qualified name = 'public.table4', comment='table4');
_EOF_

id=2は既存の「tab_set」の1と重複しないよう「tab_set」値を設定しています。
id=4は既存の「tab_id」とは重複しない「tab_id」値をしています。


スレーブサーバー

以下スクリプトを実行します。

#!/bin/sh
CLUSTERNAME=slony_test
DB1=master
DB2=slave
HOST1=10.0.0.1
HOST2=10.0.0.2
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';
subscribe set ( id = 2, provider = 1, receiver = 2, forward = no);
_EOF_

id = 2はマスターサーバーで設定した「tab_set」値にしています。
ここでレプリケーションは開始されます。


この時点(マージ前)でのレプリケーションの状態です。

master=# SELECT * FROM _slony_test.sl_table;
 tab_id | tab_reloid | tab_relname | tab_nspname | tab_set | tab_idxname | tab_altered | tab_comment
--------+------------+-------------+-------------+---------+-------------+-------------+-------------
      1 |      78127 | table1      | public      |       1 | table1_pkey | f           | table1
      2 |      78132 | table2      | public      |       1 | table2_pkey | f           | table2
      3 |      78137 | table3      | public      |       1 | table3_pkey | f           | table3
      4 |      78157 | table4      | public      |       2 | table4_pkey | f           | table4
(4 rows)

master=# SELECT * FROM _slony_test.sl_subscribe;
 sub_set | sub_provider | sub_receiver | sub_forward | sub_active
---------+--------------+--------------+-------------+------------
       1 |            1 |            2 | f           | t
       2 |            1 |            2 | f           | t
(2 rows)


マスターサーバーでマージ

#!/bin/sh
CLUSTERNAME=slony_test
DB1=master
DB2=slave
HOST1=10.0.0.1
HOST2=10.0.0.2
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';
merge set (id = 1 , add id = 2 ,origin = 1) ;
_EOF_

add id = 2は追加したテーブルの「tab_set」です。


マージ後のレプリケーション状態です。

master=# SELECT * FROM _slony_test.sl_table;
 tab_id | tab_reloid | tab_relname | tab_nspname | tab_set | tab_idxname | tab_altered | tab_comment
--------+------------+-------------+-------------+---------+-------------+-------------+-------------
      1 |      78127 | table1      | public      |       1 | table1_pkey | f           | table1
      2 |      78132 | table2      | public      |       1 | table2_pkey | f           | table2
      3 |      78137 | table3      | public      |       1 | table3_pkey | f           | table3
      4 |      78157 | table4      | public      |       1 | table4_pkey | f           | table4
(4 rows)

master=# SELECT * FROM _slony_test.sl_subscribe;
 sub_set | sub_provider | sub_receiver | sub_forward | sub_active
---------+--------------+--------------+-------------+------------
       1 |            1 |            2 | f           | t
(1 rows)

うまくテーブル追加とマージが出来ました。