第一部分 在一個主機上創建多個 postgresql實例
步驟一:安裝postgresql軟件
安裝 postgresql實例,從postgresql官網上 https://www.postgresql.org/ 下載postgresql安裝軟件,解壓縮,創建postgres用戶和組,添加環境變量。
我這裏下載的版本是 pgsql9.5.1。
創建postgresql實例
安裝了postgresql軟件後,創建postgresql實例有三個步驟:創建實例目錄,創建數據庫簇初始化數據庫(命令爲 initdb),啓動實例服務(用 pg_ctl命令)並進行相關配置。
步驟一:創建目錄和文件:
su - postgres
mkdir -p /data/pgsql/{data,data02}
步驟二:初始化實例1:
export PGDATA=/data/pgsql/data
initdb
步驟三:啓動postgresql實例1
pg_ctl -D /data/pgsql/data -l /data/pgsql/data/postgres.log start
實例2也可用按照上面的三個步驟進行創建:
初始實例2:
export PGDATA=/data/pgsql/data02
env | grep PGDATA
initdb
啓動實例2:
pg_ctl -D /data/pgsql/data02 -l /data/pgsql/data/postgres02.log start
如果要關閉數據庫,可用用羨慕的命令停止數據庫:
pg_ctl stop -D /data/pgsql/data02 -m fast
步驟二:配置實例監聽和外部訪問
修改實例2的啓動文件和端口,如果一個服務器上有多個實例,每個實例的端口都要不同,爲了能夠讓客戶端訪問,需要在配置文件添加監聽,在pg_hba.conf中添加梵文權限:
修改postgresql實例,啓動配置參數文件:
vim postgresql.conf
listen_addresses = '*' # what IP address(es) to listen on;
port = 5433 # (change requires restart)
max_connections = 100 # (change requires restart)
這些參數修改後,重啓postgresql實例才能生效,postgresql實例重啓後會監聽本服務器上所有IP的5433端口。
重啓postgresql實例的命令爲:
pg_ctl stop -D /data/pgsql/data02 -m fast
pg_ctl -D /data/pgsql/data02 -l /data/pgsql/data/postgres02.log start
修改postgresql實例訪問權限文件:
vim pg_hba.conf
# IPv4 local connections:
host all all 192.168.1.0/24 trust
上面的參數添加後,postgresql實例,就可以允許 192.168.1.0/24 網段的主機通過各個用戶以有密碼認證的方式訪問實例中存在的庫。
如果要進行嚴格限定,可以對應修改相關部分。文件修改後,需要重新加載配置文件才能生效:
pg_ctl reload
實例啓動並修改了訪問權限後,連接postgresql 實例的格式爲:
psql -h <IP地址> -p <端口> [數據庫名稱] [用戶名稱]
示例:
psql -h 192.168.10.119 -p 5432 testdb postgres
psql -h 192.168.10.119 -p 5433 postgres postgres
這樣從安裝postgresql軟件,到創建、配置並使用postgresql多實例,就完成了。
############################
第二部分 在Linux系統下安裝 Slony-I 軟件
一般Linux的各種發行版本中會自帶 slony-I ,但自帶的版本比較舊,可以從slony的官網下載最新的版本安裝。
編譯安裝 slony-I 軟件
在 slony 官方網站 http://www.slony.info/ ,點擊 Dowload 進入下載頁面(注意:由於我的postgresql版本是比較新的 9.5,一開始使用 slony1-2.1.3版本有報錯,於是安裝了最新的 slony1-2.2.5 版本);
選擇合適的版本,這裏選擇 2.2 ;
彈出的界面選擇直接下載源碼,還是使用cvs界面,這裏選擇“直接下載源碼”;
選擇要下載的小版本,這裏選擇 2.2.5 ,文件名稱爲 slony1-2.2.5.tar.br2
下載完成後,把下載得來的源碼包放到一個目錄下,使用命令解壓縮:
cd /usr/local/src
rz slony1-2.2.5.tar.bz2
tar xvf slony1-2.2.5.tar.bz2
解壓生成目錄 slony1-2.2.5 ,進入此目錄,用Linux編譯三板斧進行編譯安裝:
cd slony-2.2.5
./configure --with-perltools -with-pgconfigdir=/usr/local/pgsql/bin
make
make install
注意編譯時,需要找到 pg_config可執行程序,如果在pgsql的目錄中,可以直接指定config;如果不在bin目錄下,需要指定 with-pgconfigdir參數的目錄;
另外 slony-I 中有一套Perl腳本工具,名稱爲 altperl scripts,可以簡化slony-I的配置,默認編譯不會帶上該腳本,需要編譯時,帶上 --with perltools進行編譯;
編譯三板斧完成後,就完成了 slony-I的安裝,一般slony-I是安裝到 postgresql 數據庫所在的目錄中。
which postgres
which slon
which slonik
安裝過程爲:
結果驗證爲:
############################
第三部分 配置和驗證Slony-I複製
步驟一:規劃和創建複製環境:
進行復制的兩個postgresql的實例端口和庫名分別如下:
192.168.10.119 : 5432 master
192.168.10.119 : 5433 slave
在兩臺數據庫中,都創建一個名爲 slony 的超級用戶,給 slony-I 使用,命令如下:
create user slony superuser password 'slonytest';
在主庫上創建一個名稱爲 master 的數據庫,作爲複製的源數據庫,命令爲:
psql -h 192.168.10.119 -p 5432 postgres postgres
create database master;
alter database master owner to slony;
在備庫上創建一個名稱爲 slave 的目標數據庫,作爲複製的目標數據庫,命令爲:
psql -h 192.168.10.119 -p 5433 postgres postgres
create database slave;
alter database slave owner to slony;
後面的複製,就是在 master 數據庫和slave 數據庫之間進行;爲了演示覆制,在master庫和slave庫中建一個測試表,命令如下:
create table synctab01(id int primary key, note text);
爲了能夠讓機器相互付昂文,在 pg_hba.conf 文件中加入以下內容:
host all all 192.168.1.0/24 md5
爲了讓備註生效,運行如下命令:
pg_ctl reload
確認數據庫監聽,已經監聽到本機的IP中,可以修改 postgresql.conf 文件中的監聽選項:
listen_addresses = '*'
測試在兩臺機器上,分別能夠用slony用戶進行數據庫訪問:
psql -h 192.168.10.119 -p 5432 -U slony -d master
psql -h 192.168.10.119 -p 5433 -U slony -d slave
如果驗證都能夠正常訪問,則到此,複製前的postgresql環境準備就結束了。
接下來使用 altperl scripts 腳本完成Slony數據同步的配置工作。
步驟二:編輯 slon_tools.conf 配置文件
首先要配置好一個名爲 slon_tools.conf 的配置文件,這個文件要放在 /usr/local/etc 目錄下。
安裝完 slony-I後,這個目錄下會有一個示例文件 slon_tools.conf-sample ,把這個文件拷貝成 slon_tools.conf ,然後修改。
cd /usr/local/etc
ls
cp slon_tools.conf-sample slon_tools.conf
修改文件,把文件中集羣的名稱改成配置的名稱,這裏修改爲 cluster01 , 命令爲:
if ($ENV{"SLONYNODES"}) {
require $ENV{"SLONYNODES"};
} else {
#$CLUSTER_NAME = 'replication';
$CLUSTER_NAME = 'cluster01';
#$PIDFILE_DIR = '/var/run/slony1';
$PIDFILE_DIR = '/usr/local/pgsql/log';
#$LOGDIR = '/var/log/slony1';
$LOGDIR = '/usr/local/pgsql/log';
#目前只有兩個主從複製,只需要配置兩個服務器即可
add_node(node => 1,
host => '192.168.10.119',
dbname => 'master',
port => 5432,
user => 'slony',
password => 'slonytest');
add_node(node => 2,
host => '192.168.10.119',
dbname => 'slave',
port => 5433,
user => 'slony',
password => 'slonytest');
}
# 設置複製集的配置項,主要配置要同步那些表和序列。
$SLONY_SETS = {
"set1_name" => {
"set_id" => 1,
"table_id" => 1,
"sequence_id" => 1,
"pkeyedtables" => ["synctab01"],
"keyedtables" => {},
"sequences" => [],
},
};
# 上面的集羣名稱、日誌路徑、複製集中的同步主鍵表、唯一鍵表、序列等配置完成後,將 slon_tools.conf 文件拷貝到其他機器上。初始化集羣。
在一個節點配置完成後,將配置好的 slon_tools.conf 文件拷貝到其他 slony機器。
scp slon_tools.conf 192.168.10.119:`pwd`/.
步驟三:啓動同步服務
slony配置文件配置完畢,並拷貝到集羣中各個節點後,需要初始化和啓動同步服務。
初始化集羣,執行 slonik_init_cluster | slonik 命令如下:
[postgres@MySQL193 etc]$ slonik_init_cluster | slonik
<stdin>:10: Set up replication nodes
<stdin>:13: Next: configure paths for each node/origin
<stdin>:16: Replication nodes prepared
<stdin>:17: Please start a slon replication daemon for each node
[postgres@MySQL193 etc]$
命令 slonik_init_cluster 會讀取配置文件 slon_tools.conf 中的內容,自動初始化 slony集羣在數據庫中的同步配置。後面一些 slony腳本也會讀取配置文件 slon_tools.conf。
在master節點上,啓動 slony 守護進程,命令後的序號對應配置文件中master節點的節點號。
[postgres@MySQL193 etc]$ slon_start 1
Invoke slon for node 1 - /usr/local/pgsql9.5.1/bin//slon -p /var/run/slony1/cluster01_node1.pid -s 1000 -d2 cluster01 'host=192.168.10.119 dbname=master user=slony port=5432 password=slonytest' > /usr/local/pgsql/log/node1/master-2016-11-19.log 2>&1 &
Slon failed to start for cluster cluster01, node node1
如果上面啓動錯誤,需要根據日誌提示,解決錯誤後,再次啓動:
[postgres@MySQL193 etc]$ slon_start 1
Invoke slon for node 1 - /usr/local/pgsql9.5.1/bin//slon -p /usr/local/pgsql/log/cluster01_node1.pid -s 1000 -d2 cluster01 'host=192.168.10.119 dbname=master user=slony port=5432 password=slonytest' > /usr/local/pgsql/log/node1/master-2016-11-19.log 2>&1 &
Slon successfully started for cluster cluster01, node node1
PID [11298]
Start the watchdog process as well...
在slave節點上,啓動 slony守護進程,命令後的序號對應配置文件中 slave 節點的節點號。
[postgres@MySQL193 etc]$ slon_start 2
Invoke slon for node 2 - /usr/local/pgsql9.5.1/bin//slon -p /var/run/slony1/cluster01_node2.pid -s 1000 -d2 cluster01 'host=192.168.10.119 dbname=slave user=slony port=5433 password=slonytest' > /usr/local/pgsql/log/node2/slave-2016-11-19.log 2>&1 &
Slon failed to start for cluster cluster01, node node2
再次啓動:
[postgres@MySQL193 etc]$ slon_start 2
Invoke slon for node 2 - /usr/local/pgsql9.5.1/bin//slon -p /usr/local/pgsql/log/cluster01_node2.pid -s 1000 -d2 cluster01 'host=192.168.10.119 dbname=slave user=slony port=5433 password=slonytest' > /usr/local/pgsql/log/node2/slave-2016-11-19.log 2>&1 &
Slon successfully started for cluster cluster01, node node2
PID [11323]
Start the watchdog process as well...
啓動slony守護進程時的錯誤處理:
第一次啓動時報錯,不能打開pid文件,修改文件路徑:
[postgres@MySQL193 etc]$ cat /usr/local/pgsql/log/node1/master-2016-11-19.log
2016-11-19 11:51:41 CST CONFIG main: slon version 2.2.5 starting up
2016-11-19 11:51:41 CST FATAL Cannot open pid_file "/var/run/slony1/cluster01_node1.pid"
再次啓動,就可以正常啓動了。
使用命令 “ slonik_create_set 1 | slonik ” 創建數據集,如下:
[postgres@MySQL193 etc]$ slonik_create_set 1 | slonik
<stdin>:11: Subscription set 1 (set1_name) created
<stdin>:12: Adding tables to the subscription set
<stdin>:16: Add primary keyed table public.synctab01
<stdin>:19: Adding sequences to the subscription set
<stdin>:20: All tables added
[postgres@MySQL193 etc]$
使用命令 “ slonik_subscribe_set 1 2 | slonik ” 增加數據訂閱者,其中命令的第一個數字 1 代表同步集號,第二個數字2代表數據訂閱者的節點號,如下:
[postgres@MySQL193 etc]$ slonik_subscribe_set 1 2 | slonik
<stdin>:6: Subscribed nodes to set 1
到此,同步就配置完了。
步驟四:驗證同步效果
下面測試同步效果。
在master主庫上添加一條記錄:
postgres=# \c master
You are now connected to database "master" as user "postgres".
master=# \d
List of relations
Schema | Name | Type | Owner
--------+-----------+-------+----------
public | synctab01 | table | postgres
(1 row)
master=#
master=# select * from synctab01;
id | note
----+------
(0 rows)
master=#
master=# insert into synctab01 values(1,'111');
INSERT 0 1
master=#
master=# select * from synctab01;
id | note
----+------
1 | 111
(1 row)
在slave從庫上確認數據狀態:
postgres=# \c slave
You are now connected to database "slave" as user "postgres".
slave=#
slave=# \d
List of relations
Schema | Name | Type | Owner
--------+-----------+-------+----------
public | synctab01 | table | postgres
(1 row)
slave=#
slave=# select * from synctab01;
id | note
----+------
(0 rows)
slave=# select * from synctab01;
id | note
----+------
1 | 111
(1 row)
至此兩個 postgresql 單實例之間的主從同步就確認完畢了。