閘道器是一種很常見的網路裝置,包含路由器與代理伺服器都可算是閘道器的一種。以下圖而言,標示為 Gateway 的設備提供了包含內部 IP 上網用 NAT 機制 (SNAT)、HTTP Reverse Proxy 與 Virtual Server (DNAT) 等功能,可說是一台多功能的閘道器。這些功能對於一個網管人員來說,並不是什麼新奇的概念與技術。但是這個架構有一個致命的缺點,那就是
閘道器 Gateway 掌管了所有資料的交換,所以一旦 Gateway 出了問題,那可就真是一場大災難了。而這正是所謂的單點失效 (Single Point of Failure, 簡稱SPF) 問題。
為了解決這個問題,許多中高階的網路設備都提供了高可用性的備援機制 (High Availablity, 簡稱 HA),其中比較簡單的一種架構稱之為 Active/Passive 模式。在此模式中,至少會佈署兩台提供相同功能的設備,其中一台為主 (Active),另外一台為輔 (Passive)。
當主要的設備失效時,輔助的設備會自動接手繼續提供服務,以確保服務不會因為設備失效而中斷。而當主要的設備恢復運作後,可以選擇繼續由輔助的設備提供服務,或是自動切換回主要的設備。可惜的是,這樣的功能通常只見於中高階的設備,而這些設備本來就所費不貲,所以
採用此架構往往不但成本相對高昂,而且平常備用的設備並沒有提供服務,再再降低了設備的使用效率。
在今天在範例中,我將利用 CentOS 6 內建的 CMAN+Pacemaker 建立一個高可用性的閘道器,用低廉的成本解決單點失效的網路問題。與原本的架構相較,
需要增加為兩台主機以提供 Active/Passive 模式,而且每個主機僅需配置一個內部用的 IP 位址。本範例假設兩台主機原本就已經分別設定好 Routing/DNAT/SNAT/Reverse Proxy 等網路功能,以下就讓我們一步步完成今天的範例吧。
- 設定主機的網路 (Gateway01 與 Gateway02)
兩台主機的 IP 位址分別為 192.168.10.21 (Gateway01) 與 192.168.10.22 (Gateway02)。此兩台主機各配置兩張網卡,在範例中內部網路皆連結至網路介面 eth1。在此架構中,我們不需要設定外部網卡 (也就是 eth0) 的 IP 位址,所以請設定成手動指定但不輸入 IP 位址等資訊。
- 設定 /etc/hosts 檔 (Gateway01 與 Gateway02)
在兩台主機的 /etc/hosts 分別加上下列兩行設定
192.168.10.21 gateway01
192.168.10.22 gateway02
- 安裝所需套件 (Gateway01 與 Gateway02)
在兩台主機分別安裝所需套件,指令為
yum install ccs cman pacemaker pcs resource-agents
- 設定 CMAN 參數 (Gateway01 與 Gateway02)
分別在兩台主機執行下列指令
echo "CMAN_QUORUM_TIMEOUT=0" >> /etc/sysconfig/cman
- 設定防火牆 iptables (Gateway01 與 Gateway02)
我們需要用到 UDP Port 5404, 5405 與 TCP Port 11111,請在兩台主機分別進行設定,以便兩台主機能夠順利進行溝通。
- 設定預設路由 (Gateway01 與 Gateway02)
因為在此架構中,備援主機本身不具備對外的 IP 位址,因此與其他內部設備一樣必須透過配置於主要主機的 IP 位址 192.168.0.254 進行網際網路的連結。為了避免當備援主機身分轉換成為主要主機後兩個路由產生衝突,所以我們降低此路由的優先順序,使其轉換成主要主機後,可以順利使用對外 IP 位址作為預設路由。我們在兩台主機分別執行下列指令
route add default gw 192.168.0.254 metric 99
- 設定開機自動新增預設路由 (Gateway01 與 Gateway02)
分別在兩台主機的 /etc/rc.local 加上下列設定
route add default gw 192.168.0.254 metric 99
- 設定 Cluster (Gateway01)
在 gateway01 執行下列指令
ccs -f /etc/cluster/cluster.conf --createcluster pacemaker1
ccs -f /etc/cluster/cluster.conf --addnode gateway01
ccs -f /etc/cluster/cluster.conf --addnode gateway02
ccs -f /etc/cluster/cluster.conf --addfencedev pcmk agent=fence_pcmk
ccs -f /etc/cluster/cluster.conf --addmethod pcmk-redirect gateway01
ccs -f /etc/cluster/cluster.conf --addmethod pcmk-redirect gateway02
ccs -f /etc/cluster/cluster.conf --addfenceinst pcmk gateway01 pcmk-redirect port=gateway01
ccs -f /etc/cluster/cluster.conf --addfenceinst pcmk gateway02 pcmk-redirect port=gateway02
- 同步 Cluster 設定 (Gateway01)
將 gateway01 下的 /etc/cluster/cluster.conf 同步至 gateway02,指令為
rsync /etc/cluster/cluster.conf gateway02:/etc/cluster/
- 啟動 cman 服務 (Gateway01 與 Gateway02)
在兩台主機分別執行下列指令
service cman start
- 啟動 pacemaker 服務 (Gateway01 與 Gateway02)
在兩台主機分別執行下列指令
service pacemaker start
- 設定 cman 與 pacemaker 開機自動執行 (Gateway01 與 Gateway02)
在兩台主機分別執行下列指令
chkconfig cman on
chkconfig pacemaker on
- 關閉 fencing 與 STONITH (Gateway01)
執行下列指令
pcs property set stonith-enabled=false
pcs property set no-quorum-policy=ignore
- 確認 Cluster 狀態 (Gateway01)
執行指令
pcs status
應可以看到類似下列資訊
Cluster name: pacemaker1
Last updated: Tue Jan 7 17:27:30 2014
Last change: Tue Jan 7 12:55:21 2014 via crm_attribute on gateway01
Stack: cman
Current DC: gateway01 - partition with quorum
Version: 1.1.10-14.el6_5.1-368c726
2 Nodes configured
0 Resources configured
Online: [ gateway01 gateway02 ]
- 設定網路資源 (Gateway01)
執行下列指令
pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=192.168.0.254 cidr_netmask=24 nic=eth1 op monitor interval=3s
pcs resource create ClusterPublicIP ocf:heartbeat:IPaddr2 ip=168.95.10.10 cidr_netmask=28 nic=eth0 op monitor interval=3s
pcs resource create ExternalDefaultRoute ocf:heartbeat:Route destination="0.0.0.0/0" gateway="168.95.10.1"
其中網路相關參數 (192.168.0.254/24, 168.95.10.10/28 與 168.95.0.1) 請依據實際的環境加以調整。
- 設定 Email 通知 (Gateway01)
如果我們希望知道何時發生資源轉移 (如從 gateway01 轉移到 gateway02),可以執行下列指令
pcs resource create EmailNotification ocf:heartbeat:MailTo email=cyril.hcwang@gmail.com op monitor timeout=10 interval=3s
- 設定資源群組 (Gateway01)
利用資源群組的設定,我們可以確保所有的資源同時進行轉移,而不會出現內部 IP 位址 192.168.0.254 配置於 Gateway01 但外部 IP 168.95.10.10 位址卻配置於 Gateway02 的錯誤狀況。指令如下
pcs resource group add Gateway ClusterIP CusterPublicIP ExternalDefaultRoute EmailNotification
- 設定資源啟用順序 (Gateway01)
指令如下
pcs constraint order ClusterIP then ClusterPublicIP
pcs constraint order ClusterPublicIP then ExternalDefaultRoute
pcs constraint order ExternalDefaultRoute then EmailNotification
設定完畢後我們可以透過下列指令確認啟用順序
pcs constraint order show --full
- 設定主要設備 (Gateway01)
在此範例中,我希望主要由 Gateway01 提供服務,因此需設定其擁有較高的優先權。指令如下
pcs constraint location Gateway prefers gateway01=10
pcs constraint location Gateway prefers gateway02=5
設定完畢後我們可以透過指令
pcs constraint location show --full
確認是否有其他的優先權設定會影響到此一判斷,並在必要時透過指令
pcs constraint location Gateway remove [resource-id]
加以移除。
- 確認設定
除了透過上述指令進行單一項目的顯示與確認,我們還可以透過指令
pcs config
顯示全部的設定,執行後應可以看到類似下列訊息
Cluster Name: pacemaker1
Corosync Nodes:
Pacemaker Nodes:
gateway01 gateway02
Resources:
Group: Gateway
Resource: ClusterIP (class=ocf provider=heartbeat type=IPaddr2)
Attributes: ip=192.168.0.254 cidr_netmask=24 nic=eth1
Operations: monitor interval=3s (ClusterIP-monitor-interval-3s)
Resource: ClusterPublicIP (class=ocf provider=heartbeat type=IPaddr2)
Attributes: ip=168.95.10.10 cidr_netmask=28 nic=eth0
Operations: monitor interval=3s (ClusterPublicIP-monitor-interval-3s)
Resource: ExternalDefaultRoute (class=ocf provider=heartbeat type=Route)
Attributes: destination=0.0.0.0/0 gateway=168.95.10.1
Operations: monitor interval=60s (ExternalDefaultRoute-monitor-interval-60s)
Resource: EmailNotification (class=ocf provider=heartbeat type=MailTo)
Attributes: email=cyril.hcwang@gmail.com
Operations: monitor interval=3s timeout=10 (EmailNotification-monitor-interval-3s)
Stonith Devices:
Fencing Levels:
Location Constraints:
Resource: Gateway
Enabled on: gateway01 (score:10) (id:location-Gateway-gateway01-10)
Enabled on: gateway02 (score:5) (id:location-Gateway-gateway02-5)
Ordering Constraints:
start ClusterIP then start ClusterPublicIP (Mandatory) (id:order-ClusterIP-ClusterPublicIP-mandatory)
start ClusterPublicIP then start ExternalDefaultRoute (Mandatory) (id:order-ClusterPublicIP-ExternalDefaultRoute-mandatory)
start ExternalDefaultRoute then start EmailNotification (Mandatory) (id:order-ExternalDefaultRoute-EmailNotification-mandatory)
Colocation Constraints:
Cluster Properties:
cluster-infrastructure: cman
dc-version: 1.1.10-14.el6_5.1-368c726
no-quorum-policy: ignore
stonith-enabled: false
- 確認 Cluster 執行狀態
再次執行指令
pcs status
應可看到類似下列資訊Cluster name: pacemaker1
Last updated: Tue Jan 7 17:52:42 2014
Last change: Tue Jan 7 12:55:21 2014 via crm_attribute on gateway01
Stack: cman
Current DC: gateway01 - partition with quorum
Version: 1.1.10-14.el6_5.1-368c726
2 Nodes configured
4 Resources configured
Online: [ gateway01 gateway02 ]
Full list of resources:
Resource Group: Gateway
ClusterIP (ocf::heartbeat:IPaddr2): Started gateway01
ClusterPublicIP (ocf::heartbeat:IPaddr2): Started gateway01
ExternalDefaultRoute (ocf::heartbeat:Route): Started gateway01
EmailNotification (ocf::heartbeat:MailTo): Started gateway01
- 測試資源的轉移 (Gateway01)
因為目前資源配置於 Gateway01,因此測試時我們需要將資源轉移至 Gateway02。方法有二,一個是直接將 Gateway01 進行關機的動作,另外一個更為方便的方式則是將 Gateway01 設為備用,指令如下
pcs cluster standby gateway01
我們再次執行指令
pcs status
可以看到類似下列資訊
Cluster name: pacemaker1
Last updated: Tue Jan 7 18:10:31 2014
Last change: Tue Jan 7 18:10:22 2014 via crm_attribute on gateway01
Stack: cman
Current DC: gateway01 - partition with quorum
Version: 1.1.10-14.el6_5.1-368c726
2 Nodes configured
4 Resources configured
Node gateway01: standby
Online: [ gateway02 ]
Full list of resources:
Resource Group: Gateway
ClusterIP (ocf::heartbeat:IPaddr2): Started gateway02
ClusterPublicIP (ocf::heartbeat:IPaddr2): Started gateway02
ExternalDefaultRoute (ocf::heartbeat:Route): Started gateway02
EmailNotification (ocf::heartbeat:MailTo): Started gateway02
- 測試 Gateway01 重新上線 (Gateway01)
透過指令
pcs cluster unstandby gateway01
可以重新讓 Gateway01 上線,因為我們已經設定 Gateway01 擁有較高的優先權,所以再次執行指令
pcs status
應可以看到類似步驟 21 的訊息,表示資源配置再次回到 Gateway01。
- 確認通知信
因為我們剛剛做了兩次資源轉移的動作,所以你應該會收到相關的通知信。
透過 CMAN+Pacemaker,我們就可以輕鬆建立一個不中斷的網路連線服務。其實 CMAN+Pacemaker 所支援的服務不僅於此,有興趣的人可以透過指令
pcs resource list
列出所有支援的項目,進一步找出適合你的支援項目。