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 文件中加入以下內容:

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 單實例之間的主從同步就確認完畢了。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章