標籤:postgresql slony-i
第一部分 在一個主機上建立多個 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 檔案中加入以下內容:
hostallall192.168.1.0/24md5
為了讓備忘生效,運行如下命令:
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 命令如下:
[[email protected] 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
[[email protected] etc]$
命令 slonik_init_cluster 會讀取設定檔 slon_tools.conf 中的內容,自動初始化 slony叢集在資料庫中的同步配置。後面一些 slony指令碼也會讀取設定檔 slon_tools.conf。
在master節點上,啟動 slony 守護進程,命令後的序號對應設定檔中master節點的節點號。
[[email protected] 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
如果上面啟動錯誤,需要根據日誌提示,解決錯誤後,再次啟動:
[[email protected] 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 節點的節點號。
[[email protected] 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
再次啟動:
[[email protected] 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檔案,修改檔案路徑:
[[email protected] 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 ” 建立資料集,如下:
[[email protected] 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
[[email protected] etc]$
使用命令 “ slonik_subscribe_set 1 2 | slonik ” 增加資料訂閱者,其中命令的第一個數字 1 代表同步集號,第二個數字2代表資料訂閱者的節點號,如下:
[[email protected] 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 單一實例之間的主從同步就確認完畢了。
本文出自 “yumushui的專欄” 部落格,請務必保留此出處http://yumushui.blog.51cto.com/6300893/1874598
postgresql多執行個體建立與Slony-I複製配置