イメージはこんな感じで
サーバーAからサーバーBにレプリケーションされている状態に、新たにサーバーCをレプリケーション先として追加します。
まず、サーバーCにubuntuを入れてPostgreSQL9.0をソースからビルドしておきます。
次に、サーバーBとサーバーCのPostgreSQLを停止します。
サーバーBで
$ sudo /etc/init.d/postgresql stop
サーバーCで$ sudo /etc/init.d/postgresql stop
サーバーBの/usr/local/pgsql/dataをサーバーCにコピーします。
サーバーBで
$ su - postgres
$ cd /usr/local/pgsql/
$ tar zcvf data.tar.gz data
$ scp data.tar.gz 192.168.168.238:/usr/local/pgsql/
$ exit
サーバーCで$ su - postgres
$ cd /usr/local/pgsql/
$ tar zxvf data.tar.gz
$ exit
最後に、サーバーBとサーバーCのPostgreSQLを起動します。
サーバーBで
$ sudo /etc/init.d/postgresql start
サーバーCで$ sudo /etc/init.d/postgresql start
これで、サーバーCがレプリケーション先として追加できました。
動作を確認してみます。
レプリケーション元のデータを更新します。
サーバーAで
$ su - postgres
$ psql testdb
testdb=# select * from table1;
id | create_date
----+----------------------------
1 | 2010-11-08 11:19:10.162554
(1 row)
testdb=# insert into table1(id) values (2);
INSERT 0 1
testdb=# select * from table1;
id | create_date
----+----------------------------
1 | 2010-11-08 11:19:10.162554
2 | 2010-11-10 14:54:15.611948
(2 rows)
サーバーBとサーバーCで$ su - postgres
$ psql testdb
testdb=# select * from table1;
id | create_date
----+----------------------------
1 | 2010-11-08 11:19:10.162554
2 | 2010-11-10 14:54:15.611948
(2 rows)
となり、更新内容が反映されていることが確認できました。あと、レプリケーション先のサーバーBとサーバーCのPostgreSQLが停止している間に、サーバーAのデータが更新された場合も確認してみました。
まず、レプリケーション先のPostgreSQLを停止します。
サーバーBで
$ sudo /etc/init.d/postgresql stop
サーバーCで$ sudo /etc/init.d/postgresql stop
次に、レプリケーション元のサーバーAのデータを更新します。
$ su - postgres
$ psql testdb
testdb=# select * from table1;
id | create_date
----+----------------------------
1 | 2010-11-08 11:19:10.162554
2 | 2010-11-10 14:54:15.611948
(2 rows)
testdb=# insert into table1(id) values (3);
INSERT 0 1
testdb=# select * from table1;
id | create_date
----+----------------------------
1 | 2010-11-08 11:19:10.162554
2 | 2010-11-10 14:54:15.611948
3 | 2010-11-10 14:59:57.012077
(3 rows)
レプリケーション先のPostgreSQLを起動します。
サーバーBで
$ sudo /etc/init.d/postgresql start
サーバーCで$ sudo /etc/init.d/postgresql start
レプリケーション元のサーバーAの更新内容が反映されているか確認します。
サーバーBとサーバーCで
$ su - postgres
$ psql testdb
testdb=# select * from table1;
id | create_date
----+----------------------------
1 | 2010-11-08 11:19:10.162554
2 | 2010-11-10 14:54:15.611948
3 | 2010-11-10 14:59:57.012077
(3 rows)
となり、更新内容が反映されていることが確認できました。