在PostgreSQL官網上對於複寫功能,有推薦三個third party軟體可以達成,原本我是想試著用PgCluster去做的,不過研究了一陣子才發現PgCluster可以說是修改版的PostgreSQL,所以等於要動到原本的PostgreSQL,與需求不符,所以最後改成Slony-I來做複寫。
這次也是使用兩台電腦,分別稱為Ubuntu A、Ubuntu B,安裝的是Ubuntu 10.04,IP分別是192.168.220.130與192.168.220.132,下面開始介紹我安裝與設定的步驟。
在兩台電腦上先安裝與設定PostgreSQL
$ sudo aptitude update
更新
$ sudo aptitude install postgresql
安裝psql
$ sudo aptitude install pgadmin3
安裝psql管理介面
$ sudo aptitude install postgresql-server-dev-8.4
安裝一些slony會用到的psql元件
$ sudo vi /etc/postgresql/8.4/main/postgresql.conf
修改設定檔內容,將#listen_addresses = 'localhost' 改成listen_addresses = '*'
$ sudo vi /etc/postgresql/8.4/main/pg_hba.conf
修改信任IP來源,為了方便測試,先加入下面這行,測試完成後再依安全性修改
host all all 0.0.0.0/0 trust
$ sudo -i -u postgres
切換至postgres帳號
$ psql
進入postgresql
=# ALTER USER postgres WITH PASSWORD '密碼';
設定postgres的密碼
=# \q
跳出postgresql
$ sudo /etc/init.d/postgresql-8.4 restart
重新啟動PGSQL
在兩台電腦上安裝Slony-I
$ wget http://main.slony.info/downloads/2.0/source/slony1-2.0.4.tar.bz2
下載Slony-I
$ tar -vxjf slony1-2.0.4.tar.bz2
解壓縮
$ cd slony1-2.0.4/
進入目錄
$ sudo ./configure
產生設定檔
$ sudo make all
產生安裝檔,成功的話會有下面這個訊息
All of Slony-I is successfully made. Ready to install
$ sudo make install
安裝Slony-I,成功的話會有下面這個訊息
All of Slony-I is successfully installed
在Ubuntu A上設定DB
$ sudo -i -u postgres
切換至postgres帳號
$ createdb --owner postgres test
建立一個由postgres帳號擁有,叫做test的DB
$ createlang -d test plpgsql
將PL/pgSQL語言安裝到test這個DB
$ psql --username postgres --dbname test
以postgres帳號進入 test DB
test=# createdb table tb_master(
id int primary key,
name char(16));
建立一個測試用table
在Ubuntu B上設定DB
$ sudo -i -u postgres
切換至postgres帳號
$ createdb --owner postgres testslave1
建立一個由postgres帳號擁有,叫做testslave1的DB
$ createlang -d testslave1 plpgsql
將PL/pgSQL語言安裝到testslave1這個DB
$ psql --username postgres --dbname testslave1
以postgres帳號進入 test DB
testslave1=# createdb table tb_master(
id int primary key,
name char(16));
建立一個測試用table
在Ubuntu A上撰寫Slony-I設定檔
$ vi configmaster.sh
建立一個用來設定的shell script檔,內容如下
#!/bin/sh
# psql程式安裝處
basebin=/usr/lib/postgresql/8.4/bin
# 叢集名稱,隨意
CLUSTER=slony_test1
# 設定Master與Slave的DB name
DBSERVER=test
DBSLAVE1=testslave1
# 設定Master與Slave的IP
HOSTSERVER=192.168.220.130
HOSTSLAVE1=192.168.220.132
# 設定Master與Slave的
DBSERVER_USER=postgres
DBSLAVE1_USER=postgres
# 下command給 slonik
$basebin/slonik<<_EOF_
# 設叢集名稱
cluster name=$CLUSTER;
# 設定節點
node 1 admin conninfo='dbname=$DBSERVER host=$HOSTSERVER user=$DBSERVER_USER port=5432';
node 2 admin conninfo='dbname=$DBSLAVE1 host=$HOSTSLAVE1 user=$DBSLAVE1_USER port=5432';
# 初始化叢集 init cluster ( id=1, comment='Node 1' );
# 設定要複寫的table,若有多個table要複寫需一一加入
create set ( id=1, origin=1, comment='All test tables' );
set add table ( set id=1, origin=1,id=1, fully qualified name='public.tb_master',comment='Table Master' );
# 設定儲存節點
store node ( id=2, comment='Slave Node',event node=1 );
# 設定儲存路徑
store path ( server=1, client=2,conninfo='dbname=$DBSERVER host=$HOSTSERVER user=$DBSERVER_USER port=5432');
# 設定資料提供與複寫方向
store listen ( origin=1, provider=1, receiver=2 );
_EOF_
$ vi commitdata.sh
建立一個啟動複寫的sh檔
#!/bin/sh
basebin=/usr/lib/postgresql/8.4/bin
CLUSTER=slony_test1
DBSERVER=test
DBSLAVE1=testslave1
HOSTSERVER=192.168.220.130
HOSTSLAVE1=192.168.220.132
DBSERVER_USER=postgres
DBSLAVE1_USER=postgres
$basebin/slonik<<_EOF_
cluster name=$CLUSTER;
# 設定節點
node 1 admin conninfo='dbname=$DBSERVER host=$HOSTSERVER user=$DBSERVER_USER port=5432';
node 2 admin conninfo='dbname=$DBSLAVE1 host=$HOSTSLAVE1 user=$DBSLAVE1_USER port=5432';
# 設定複寫
subscribe set ( id=1, provider=1, receiver=2, forward=no);
_EOF_
設定與啟動Slony-I
$ sh configmaster.sh
執行設定檔
$ /usr/lib/postgresql/8.4/bin/slon slony_test1 "dbname=testslave1 host=192.168.220.132 user=postgres port=5432"
$ /usr/lib/postgresql/8.4/bin/slon slony_test1 "dbname=test host=192.168.220.130 user=postgres port=5432"
啟動Slony與連線
$ commitdata.sh
啟動複寫
檢視結果
在Ubuntu A上
$ psql --username postgres --dbname test
以postgres帳號進入 test DB
test=# iinsert into tb_master (id,name) values(1,'aab');
test=# iinsert into tb_master (id,name) values(2,'abb');
test=# iinsert into tb_master (id,name) values(3,'abc');
隨意插入三筆資料
到Ubuntu B上
$ psql --username postgres --dbname testslave1
以postgres帳號進入 testslave1 DB
testslave1=# select * from tb_master;
查詢結果
id | name
----+------------------
1 | aab
2 | abb
3 | abc
(3 rows)
確認資料有同步,完工
No comments:
Post a Comment