最近的項目要求配置共用存儲的四節點集群,使集群能夠形成負載均衡。 但是大家知道,PostgreSQL不支持使用同一數據目錄生成多個實例,在執行pg_ctl start的時候,如果指定的數據目錄有實例在運行,則該實例會發生錯誤導致資料庫down掉。故而,我們選擇了基於pgpool-II + repmg ...
最近的項目要求配置共用存儲的四節點集群,使集群能夠形成負載均衡。
但是大家知道,PostgreSQL不支持使用同一數據目錄生成多個實例,在執行pg_ctl start的時候,如果指定的數據目錄有實例在運行,則該實例會發生錯誤導致資料庫down掉。故而,我們選擇了基於pgpool-II + repmgr的策略來實現基於NAS共用存儲的負載均衡策略。架構如下圖所示:
共用磁碟的實現方法多種多樣,本文主要講解repmgr的使用方法:
(零)準備工作
本例中,準備了四台虛擬機,IP地址分別為:
192.168.100.1 node1 192.168.100.2 node2 192.168.100.3 node3 192.168.100.4 node4
NAS存儲中,分別創建目錄data1、data2、data3、data4,並掛載到各數據節點上。*註意目錄許可權必須為700
在所有節點安裝repmgr。其中,只有node1節點上執行initdb,而node2、node3、node4均不初始化。
在node1節點的postgresql.conf添加以下配置:
hot_standby = on wal_level = 'replica' max_wal_senders = 50
創建repmgr用戶及資料庫
[Harvest@node1 ~] createuser -s repmgr
[Harvest@node1 ~] createdb repmgr -O repmgr
配置pg_hba.conf,添加以下規則:
local replication repmgr trust host replication repmgr 127.0.0.1/32 trust host replication repmgr 192.168.100.0/0 trust local repmgr repmgr trust host repmgr repmgr 127.0.0.1/32 trust host repmgr repmgr 192.168.100.0/0 trust
啟動資料庫,併在node2(或node3、node4)測試是否可以通過repmgr連接到資料庫
[Harvest@node1 ~] pg_ctl start
[Harvest@node2 ~] psql 'host=node1 user=repmgr dbname=repmgr connect_timeout=2'
(一)安裝repmgr
首先,解壓repmgr並安裝:
[Harvest@node1 opt]cd repmgr-x.x.x
[Harvest@node1 repmgr-x.x.x] ./configure && make && make install #執行configure的時候需要sed和pg_config兩個應用,基本上linux系統都會自帶sed,pg_config安裝了postgresql也都會有
(二)配置node1
在node1上創建配置文件repmgr1.conf:
node_id=1 node_name=node1 conninfo='host=node1 user=repmgr dbname=repmgr connect_timeout=2' data_directory='/opt/data/data1'
接下來將node1註冊為主伺服器:
[Harvest@node1 ~] repmgr -f repmgr1.conf primary register
如果屏幕中回顯如下,則註冊成功:
INFO: connecting to primary database... NOTICE: attempting to install extension "repmgr" NOTICE: "repmgr" extension successfully installed NOTICE: primary node record (id: 1) registered
驗證集群狀態
[Harvest@node1 ~]repmgr -f repmgr.conf cluster show
回顯如下:
ID | Name | Role | Status | Upstream | Connection string ----+-------+---------+-----------+----------+-------------------------------------------------------- 1 | node1 | primary | * running | | host=node1 dbname=repmgr user=repmgr connect_timeout=2
(二)添加node2
如上所述配置repmgr2.conf:
node_id=2
node_name=node2
conninfo='host=node2 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/opt/data/data2'
創建node2備份,該步驟會使用pg_basebackup命令將node1節點的數據目錄備份到data2目錄中
[Harvest@node2 ~] repmgr -h node1 -U repmgr -d repmgr -f repmgr.conf standby clone
回顯如下所示說明備份成功
NOTICE: using configuration file "/etc/repmgr.conf" NOTICE: destination directory "/opt/data/data2" provided INFO: connecting to source node NOTICE: checking for available walsenders on source node (2 required) INFO: sufficient walsenders available on source node (2 required) INFO: creating directory "/opt/data/data2"... NOTICE: starting backup (using pg_basebackup)... HINT: this may take some time; consider using the -c/--fast-checkpoint option INFO: executing: pg_basebackup -l "repmgr base backup" -D /opt/data/data2 -h node1 -U repmgr -X stream NOTICE: standby clone (using pg_basebackup) complete NOTICE: you can now start your PostgreSQL server HINT: for example: pg_ctl -D /opt/data/data2 start
註冊node2
[Harvest@node2 ~] repmgr -f repmgr.conf standby register
回顯如下:
NOTICE: standby node "node2" (ID: 2) successfully registered
驗證集群狀態
[Harvest@node1 ~]repmgr -f repmgr.conf cluster show
ID | Name | Role | Status | Upstream | Location | Connection string
----+-------+---------+-----------+----------+----------+--------------------------------------
1 | node1 | primary | * running | | default | host=node1 dbname=repmgr user=repmgr
2 | node2 | standby | running | node1 | default | host=node2 dbname=repmgr user=repmgr
(三)註冊node3、node4
node3、node4在配置上與node2相同,唯一的區別在於增加了'--upstream-node-id=2'這個參數,它指定了數據流的來源:
[Harvest@node3 ~] repmgr -h node2 -U repmgr -d repmgr -f /etc/repmgr.conf standby clone --upstream-node-id=2
[Harvest@node3 ~] repmgr -f /etc/repmgr.conf standby register --upstream-node-id=2
同理node4的數據流來源為node3:
[Harvest@node4 ~] repmgr -h node3 -U repmgr -d repmgr -f /etc/repmgr.conf standby clone --upstream-node-id=3
[Harvest@node4 ~] repmgr -f /etc/repmgr.conf standby register --upstream-node-id=3
以上,使用repmgr的級聯複製配置完成。
參考
1.repmgr手冊 :https://repmgr.org/docs/current/index.html
2.中文版手冊:http://citusdb.cn/?p=1068