搜尋此網誌

2014年1月7日 星期二

[迷你好兔] 利用 CMAN+Pacemaker 建立不中斷的網路

3410-24-hours-services閘道器是一種很常見的網路裝置,包含路由器與代理伺服器都可算是閘道器的一種。以下圖而言,標示為 Gateway 的設備提供了包含內部 IP 上網用 NAT 機制 (SNAT)、HTTP Reverse Proxy 與 Virtual Server (DNAT) 等功能,可說是一台多功能的閘道器。這些功能對於一個網管人員來說,並不是什麼新奇的概念與技術。但是這個架構有一個致命的缺點,那就是閘道器 Gateway 掌管了所有資料的交換,所以一旦 Gateway 出了問題,那可就真是一場大災難了。而這正是所謂的單點失效 (Single Point of Failure, 簡稱SPF) 問題。
cluster - before
為了解決這個問題,許多中高階的網路設備都提供了高可用性的備援機制 (High Availablity, 簡稱 HA),其中比較簡單的一種架構稱之為 Active/Passive 模式。在此模式中,至少會佈署兩台提供相同功能的設備,其中一台為主 (Active),另外一台為輔 (Passive)。當主要的設備失效時,輔助的設備會自動接手繼續提供服務,以確保服務不會因為設備失效而中斷。而當主要的設備恢復運作後,可以選擇繼續由輔助的設備提供服務,或是自動切換回主要的設備。可惜的是,這樣的功能通常只見於中高階的設備,而這些設備本來就所費不貲,所以採用此架構往往不但成本相對高昂,而且平常備用的設備並沒有提供服務,再再降低了設備的使用效率
在今天在範例中,我將利用 CentOS 6 內建的 CMAN+Pacemaker 建立一個高可用性的閘道器,用低廉的成本解決單點失效的網路問題。與原本的架構相較,需要增加為兩台主機以提供 Active/Passive 模式,而且每個主機僅需配置一個內部用的 IP 位址。本範例假設兩台主機原本就已經分別設定好 Routing/DNAT/SNAT/Reverse Proxy 等網路功能,以下就讓我們一步步完成今天的範例吧。
cluster - after
  1. 設定主機的網路 (Gateway01 與 Gateway02)
    兩台主機的 IP 位址分別為 192.168.10.21 (Gateway01) 與 192.168.10.22 (Gateway02)。此兩台主機各配置兩張網卡,在範例中內部網路皆連結至網路介面 eth1。在此架構中,我們不需要設定外部網卡 (也就是 eth0) 的 IP 位址,所以請設定成手動指定但不輸入 IP 位址等資訊
  2. 設定 /etc/hosts 檔 (Gateway01 與 Gateway02)
    在兩台主機的 /etc/hosts 分別加上下列兩行設定
    192.168.10.21 gateway01
    192.168.10.22 gateway02
  3. 安裝所需套件 (Gateway01 與 Gateway02)
    在兩台主機分別安裝所需套件,指令為
    yum install ccs cman pacemaker pcs resource-agents
  4. 設定 CMAN 參數 (Gateway01 與 Gateway02)
    分別在兩台主機執行下列指令
    echo "CMAN_QUORUM_TIMEOUT=0" >> /etc/sysconfig/cman
  5. 設定防火牆 iptables (Gateway01 與 Gateway02)
    我們需要用到 UDP Port 5404, 5405 與 TCP Port 11111,請在兩台主機分別進行設定,以便兩台主機能夠順利進行溝通。
  6. 設定預設路由 (Gateway01 與 Gateway02)
    因為在此架構中,備援主機本身不具備對外的 IP 位址,因此與其他內部設備一樣必須透過配置於主要主機的 IP 位址 192.168.0.254 進行網際網路的連結。為了避免當備援主機身分轉換成為主要主機後兩個路由產生衝突,所以我們降低此路由的優先順序,使其轉換成主要主機後,可以順利使用對外 IP 位址作為預設路由。我們在兩台主機分別執行下列指令
    route add default gw 192.168.0.254 metric 99
  7. 設定開機自動新增預設路由 (Gateway01 與 Gateway02)
    分別在兩台主機的 /etc/rc.local 加上下列設定
    route add default gw 192.168.0.254 metric 99
  8. 設定 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
  9. 同步 Cluster 設定 (Gateway01)
    將 gateway01 下的 /etc/cluster/cluster.conf 同步至 gateway02,指令為
    rsync /etc/cluster/cluster.conf gateway02:/etc/cluster/
  10. 啟動 cman 服務 (Gateway01 與 Gateway02)
    在兩台主機分別執行下列指令
    service cman start
  11. 啟動 pacemaker 服務 (Gateway01 與 Gateway02)
    在兩台主機分別執行下列指令
    service pacemaker start
  12. 設定 cman 與 pacemaker 開機自動執行 (Gateway01 與 Gateway02)
    在兩台主機分別執行下列指令
    chkconfig cman on
    chkconfig pacemaker on
  13. 關閉 fencing 與 STONITH (Gateway01)
    執行下列指令
    pcs property set stonith-enabled=false
    pcs property set no-quorum-policy=ignore
  14. 確認 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 ]
  15. 設定網路資源 (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) 請依據實際的環境加以調整。
  16. 設定 Email 通知 (Gateway01)
    如果我們希望知道何時發生資源轉移 (如從 gateway01 轉移到 gateway02),可以執行下列指令
    pcs resource create EmailNotification ocf:heartbeat:MailTo email=cyril.hcwang@gmail.com op monitor timeout=10 interval=3s
  17. 設定資源群組 (Gateway01)
    利用資源群組的設定,我們可以確保所有的資源同時進行轉移,而不會出現內部 IP 位址 192.168.0.254 配置於 Gateway01 但外部 IP 168.95.10.10 位址卻配置於 Gateway02 的錯誤狀況。指令如下
    pcs resource group add Gateway ClusterIP CusterPublicIP ExternalDefaultRoute EmailNotification
  18. 設定資源啟用順序 (Gateway01)
    指令如下
    pcs constraint order ClusterIP then ClusterPublicIP
    pcs constraint order ClusterPublicIP then ExternalDefaultRoute
    pcs constraint order ExternalDefaultRoute then EmailNotification
    設定完畢後我們可以透過下列指令確認啟用順序
    pcs constraint order show --full
  19. 設定主要設備 (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]
    加以移除。
  20. 確認設定
    除了透過上述指令進行單一項目的顯示與確認,我們還可以透過指令
    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
  21. 確認 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
  22. 測試資源的轉移 (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
  23. 測試 Gateway01 重新上線 (Gateway01)
    透過指令
    pcs cluster unstandby gateway01
    可以重新讓 Gateway01 上線,因為我們已經設定 Gateway01 擁有較高的優先權,所以再次執行指令
    pcs status
    應可以看到類似步驟 21 的訊息,表示資源配置再次回到  Gateway01。
  24. 確認通知信
    因為我們剛剛做了兩次資源轉移的動作,所以你應該會收到相關的通知信。
透過 CMAN+Pacemaker,我們就可以輕鬆建立一個不中斷的網路連線服務。其實 CMAN+Pacemaker 所支援的服務不僅於此,有興趣的人可以透過指令
pcs resource list
列出所有支援的項目,進一步找出適合你的支援項目。

About