為了解決這個問題,許多中高階的網路設備都提供了高可用性的備援機制 (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)
執行下列指令
其中網路相關參數 (192.168.0.254/24, 168.95.10.10/28 與 168.95.0.1) 請依據實際的環境加以調整。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"
- 設定 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)
透過指令
可以重新讓 Gateway01 上線,因為我們已經設定 Gateway01 擁有較高的優先權,所以再次執行指令pcs cluster unstandby gateway01
應可以看到類似步驟 21 的訊息,表示資源配置再次回到 Gateway01。pcs status
- 確認通知信
因為我們剛剛做了兩次資源轉移的動作,所以你應該會收到相關的通知信。
pcs resource list
列出所有支援的項目,進一步找出適合你的支援項目。
沒有留言:
張貼留言