提供企業版 PostgreSQL 服務的公司 EnterpriseDB 提供一個能夠管理 PostgreSQL 資料庫 HA 的工具,EDB Failover Manager(EFM)。該工具能夠監控 PostgreSQL 資料庫間的狀況,並且在主要資料庫主機發生異常時作自動切換,並有通知管理者的功能。
EFM 的運作是在每個資料庫主機上都安裝一個常駐程式,EFM-agent,這個程式主要功能,是在一群主機間組成一個 EFM Cluster,Cluster 內各主機相互監督其他主機的資料庫服務是不是還健在。若是某個主機出事了(例如,該主機網路被拔掉了),其他成員測知這主機已經不在,就會啟動後續的切換和通知。
最重要的情況,就是主要服務主機出現異常,這時 EFM Cluster 內的監測確認之後,便會將備份機帶起來,接替主要服務。並發信通知管理者有狀況發生。
要使 EFM 能夠正常運作,至少需要三台主機互相監控,最基本設置的就是
1. 一台主要主機 primary
2. 一台備份主機 standby
3. 一台監控主機 witness
或是(ver. 1 未提供該功能)
1. 一台主要主機 primary
2. 一台備份主機 standby
3. 一台備份主機 standby2
兩種設置方式。由於第二種的 EFM agent 設定與第一種相一致,我在這裡要演練的是第一種。下圖是我這次演練 EDB Failover Manager 的 PostgreSQL 高可用性架構示意圖:
目前 EFM 支援 RHEL 系列的 64 位元 Linux,有 2.0.3 版與 1.1.2 版。兩者在設定上有一點變動。在這我用 ver. 2 進行。三台主機的作業系統用的都是 CentOS 6。
EFM 需要使用 Java 7 以上的版本;若要有寄信通知的功能,則必須啟動 RHEL 上信件發送服務。由於 CentOS 有防火牆,也需要去進行設定。詳情能參考這裡。
架設流程
架設過程有三件事情要做:
- 建立好主從資料庫之間的 Streaming replication
- 設定各台主機上的 EFM agent
- 組成互相監控的 EFM Cluster
- 先啟動其中一個 EFM agent
- 再逐一設定、啟動其他主機上的 EFM agent,以加入 EFM Cluster
1. 主要主機 primary:192.168.57.102
2. 備份主機 standby:192.168.57.103
3. 監控主機 witness :192.168.57.101
EFM Cluster 提供的 Virtual IP: 192.168.57.100
1. 建立 Streaming replication
關於第一部份,可以參考我自己的筆記 Streaming Replication 筆記。
2. EFM agent 安裝
a) 安裝 Java 7
在這裡我使用的是 yum repository 所提供的 openjdk-1.7 就能夠正常使用。若是使用 Oracle 所提供 Java 版本,則需要再額外安裝 JCE Unlimited Strength Jurisdiction Policy 套件才行。
b) 啟用防火牆
EFM agent 需要使用 7800~7810之間的 port 相互溝通,記得要開啟
[root]# iptables -I INPUT -p tcp --dport 7800:7810 -j ACCEPT [root]# /sbin/service iptables save
c) 設定各資料庫的 pg_hba.conf,允許預定好的 EFM Cluster 成員能夠連線進入各資料庫中
host all enterprisedb 192.168.57.1/24 md5
d) 安裝 EFM agent
進到下載頁面, 選擇 EDB Failover Manager 標籤,下載 Failover Manager 2.0.3 的版本,上面提供 RHEL 6 或 7 的選擇。
照一般安裝 rpm 的方式裝起來
[root]# rpm -ivh efm20-2.0.3-1.rhel6.x86_64.rpm
安裝完畢後,會在 /usr、/etc 以及 /var/log/ 等處都看到 efm-2.0/ 的目錄。 程式執行檔位在 /usr/efm-2.0/bin/ 下,而設定檔則位於 /etc/efm-2.0/ 中。
3. EFM agent 設定
EFM agent 的程式,有兩個設定檔:
/etc/efm-2.0/efm.properties
/etc/efm-2.0/efm.nodes
properties 檔案裡面,要設定的是所有 efm 的功能;而 nodes 檔案則是在啟動過程需要用到的 EFM Cluster 成員訊息。等到啟動時才要去設定 nodes 檔案
在 properties 檔案,已經有一些東西有預設值了,在這我只列舉基本的設定選項,其他沒有在這裡列出的我都保持預設值。
此處我列的是位在資料庫主機上的 efm.properties 檔案:
efm.license= # 該項沒有填寫的話,60 天後 EFM Cluster 就停止運作。不過資料庫本身仍然可以正常使用 db.user=enterprisedb # 資料庫連線的訊息 db.password.encrypted=<加密過的密碼> # 資料庫連線的訊息 db.port=5444 # 資料庫連線的訊息 db.database=edb # 資料庫連線的訊息 admin.port=7801 # 從 7800~ 7810 間自選 user.email=<你的信箱填在這裡> bind.address=192.168.57.102:7800 # 從 7800~ 7810 間再自選一個 port is.witness=false # 標記是不是 witness node 的標籤 db.service.owner=enterprisedb db.recovery.conf.dir=/opt/PostgresPlus/9.4AS/data/ db.bin=/opt/PostgresPlus/9.4AS/bin/ # 設定 EFM Cluster 的virtual IP virtualIp=192.168.57.100 virtualIp.interface=eth1:0 virtualIp.netmask=255.255.255.0
資料庫主機上的 efm.porperties 設定都如上面所列。
而 witness node 上的設定如下:
efm.license= # 該項沒有填寫的話,60 天後 EFM Cluster 就停止運作 db.user=enterprisedb # 資料庫連線的訊息 db.password.encrypted=<加密過的密碼> # 資料庫連線的訊息 db.port=5444 # 資料庫連線的訊息 db.database=edb # 資料庫連線的訊息 admin.port=7801 # 從 7800~ 7810 間自選 user.email=<你的信箱填在這裡> bind.address=192.168.57.101:7800 # 從 7800~ 7810 間再自選一個 port is.witness=true # 標記是不是 witness node 的標籤 # 設定 EFM Cluster 的virtual IP virtualIp=192.168.57.100 virtualIp.interface=eth1:0 virtualIp.netmask=255.255.255.04. 加密資料庫的密碼
將資料庫密碼使用 EFM 的工具作加密後,填進 properties 檔案中:
[root]# /usr/efm-2.0/bin/efm encrypt efm
該指令會互動式的要求輸入密碼,並產生出一組加密的字串,將此字串貼入 properties 檔案的 db.password.encrypted 欄位即可。
5. 啟用 EFM Cluster
Failover manager 對於建立 EFM Cluster 的設計是,由某一台主機先發起 Cluster(第一台啟動的 EFM agent);然後其餘要加入 Cluster 的主機,要先在 Cluster 之間發布該主機要加入的消息(add-node)之後,該主機才啟動 EFM agent,加入這個 Cluster。
要是(1)cluster 內沒有發布新主機加入的消息,或是(2) 準備加入的主機上的 efm.nodes 沒有填上準備參與的 Cluster 所有成員的資訊,都會造成新主機加入失敗,變成產生兩個 EFM Cluster 的情況發生。
在此我啟動的流程為:
(step1)啟動 pirmary EFM agent(也因此發起了一個 EFM Cluster)
(step2)通知所有 Cluster成員,standby 即將加入
(step3)在 standby 上設定好 cluster 成員訊息,接著啟動 standby EFM agent,standby 便成功加入 EFM cluster
(step4)通知所有 Cluster成員,witness 即將加入
(step5)在 witness 上設定好 cluster 成員訊息,接著啟動 witness EFM agent,witness 便成功加入 EFM cluster
下面便是啟動的操作流程:
a) 啟動 primary 上的 EFM agent
[primary]
[root]# service efm-2.0 start
這樣一來,就建立起一個 EFM Cluster,此時的成員有 primary 一員。
b) Standby 加入 EFM Cluster
目前,EFM Cluster 裡面只有 primary 一個成員,現在要將 standby 加入 EFM Cluster 的行列:
[primary]
1. 在 EFM Cluster 中發布新成員即將加入的訊息
[root]# /usr/efm-2.0/bin/efm add-node efm 192.168.57.103
[standby]
2. 在 nodes 檔案中,填入目前的 EFM Cluster 成員訊息:
目前成員只有 primary 一個。所以在 standby 的 nodes 檔案中,要填上 primary 的 bind address:
192.168.57.102:7800
3. 如此就可以啟動 standby 上的 EFM agent 了
[standby]
[root]#service efm-2.0 start
當 primary、standby 啟動完成後,便能夠先觀察 EFM Cluster 的狀態:
執行
[root]# /usr/efm-2.0/bin/efm cluster-status efm Cluster Status: efm Agent Type Address Agent DB Info -------------------------------------------------------------- Master 192.168.57.102 UP UP Standby 192.168.57.103 UP UP Allowed node host list: 192.168.57.102 192.168.57.103 Standby priority host list: 192.168.57.103 Promote Status: DB Type Address XLog Loc Info -------------------------------------------------------------- Master 192.168.57.102 0/F019C30 Standby 192.168.57.103 0/F019C30 Standby database(s) in sync with master. It is safe to promote.
從以上指令的結果,能看到目前 EFM Cluster 的成員有 primary 以及 standby 兩台主機了。不過此時的 Cluster 無法監測資料庫異常,得再多加一個 Witness 才行。
c) Witness node 加入 EFM Cluster
[witness]
1. 在 nodes 檔案中,填入目前的 EFM Cluster 成員訊息:
目前成員有 primary 及 standby。所以在 witness 的 nodes 檔案中,要填上 primary 及 standby 的 bind address:
192.168.57.102:7800 192.168.57.103:7800
2. 如此就可以啟動 witness 上的 EFM agent 了
[root]#service efm-2.0 start
此時,便可以看到 Cluster 狀態有三部主機了
[root]# /usr/efm-2.0/bin/efm cluster-status efm Cluster Status: efm Agent Type Address Agent DB Info -------------------------------------------------------------- Master 192.168.57.102 UP UP Witness 192.168.57.101 UP N/A Standby 192.168.57.103 UP UP Allowed node host list: 192.168.57.102 192.168.57.103 192.168.57.101 Standby priority host list: 192.168.57.103 Promote Status: DB Type Address XLog Loc Info -------------------------------------------------------------- Master 192.168.57.102 0/F01A4B8 Standby 192.168.57.103 0/F01A4B8 Standby database(s) in sync with master. It is safe to promote.
到此,整個 EFM 的 HA Cluster 便已經架設完成了。
停止 EFM Cluster
在 EFM Cluster 運作的狀況下,將主機關必就會觸發 EFM 的 Failover 切換機制,所以要正常關閉每台主機前,必須要先將 EFM agent 正常中止:
只有要關掉單一台主機上的 EFM agent,在這指定關掉 witness 的 EFM agent:
[root@ha1 ~]# /usr/efm-2.0/bin/efm remove-node efm 192.168.56.101
整個 Cluster 內的 EFM agents 全部關掉:
[root@ha1 ~]# /usr/efm-2.0/bin/efm stop-cluster efm
20160803 更新:
如果要建立多台 Standby 資料庫的 EFM Cluster,則在每個 Standby Instance 的 recovery.conf 裡面,要多加上以下設定:
recovery_target_timeline='latest'
才能確保在 Promoting 後,Standby DB 能繼續承接新的 Master Timeline 進行 Streaming Replication,要不然就會在你的 Standby Server Log 裡面一直出現類似下面的錯誤:
2016-08-01 08:58:57 UTC LOG: restarted WAL streaming at 0/6000000 on timeline 1 2016-08-01 08:58:57 UTC LOG: replication terminated by primary server 2016-08-01 08:58:57 UTC DETAIL: End of WAL reached on timeline 1 at 0/601AFD8.
然後資料也會因此而進不去 Standby Instance。
參考資料
EDB Failover Manager 官方說明書
沒有留言:
張貼留言