Linux

如何在降級模式下執行 CentOS (Red Hat) 集群?

  • April 9, 2015

我在 CentOS 6.5 上安裝了 Red Hat 的集群軟體,並使用它來提供從一個網路到另一個網路的冗餘路由。這很好用,我有一對提供服務的盒子,所以如果一個失敗(例如,如果我通過刪除它的網路連接進行測試),另一個會接管路由。

但是,如果我必須對剩餘的盒子做任何事情,由於 rgmanager 的問題,我無法重新啟動它:

service rgmanager stop

掛起,並且停止該過程的唯一方法就是kill -9它。這顯然也會影響任何試圖停止服務的操作,例如 arebootpoweroff.

當我設法自行啟動伺服器時,雖然集群啟動了,但 rgmanager 沒有顯示為正在執行,clustat甚至沒有任何冗餘路由服務可見,更不用說啟動了。

例如,如果這些盒子被部署到遠端位置,並且需要在我們有機會更換故障盒子之前關閉電源,這可能會導致問題。

這是我的 cluster.conf:

<?xml version="1.0"?>
<cluster config_version="2" name="router-ha">
       <fence_daemon/>
       <clusternodes>
               <clusternode name="router-01" nodeid="1"/>
               <clusternode name="router-02" nodeid="2"/>
       </clusternodes>
       <cman expected_votes="1" two_node="1"/>
       <fencedevices/>
       <rm>
               <failoverdomains/>
               <resources>
                       <ip address="10.0.0.1" monitor_link="1" sleeptime="0"/>
                       <ip address="10.0.0.2" monitor_link="1" sleeptime="0"/>
                       <ip address="10.2.0.1" monitor_link="1" sleeptime="0"/>
                       <ip address="10.4.0.1" monitor_link="1" sleeptime="0"/>
               </resources>
               <service autostart="1" name="routing-a" recovery="restart">
                       <ip ref="10.0.0.1"/>
                       <ip ref="10.2.0.1"/>
               </service>
               <service autostart="1" name="routing-b" recovery="restart">
                       <ip ref="10.0.0.2"/>
                       <ip ref="10.4.0.1"/>
               </service>
       </rm>
</cluster>

如果看不到另一個,為什麼我不能在一個盒子上啟動服務?當然,作為冗餘對的必要部分,您不依賴另一台機器來啟動集群服務?

要執行集群服務,需要一個仲裁。通常在一個三節點集群中,每個成員每個都有一票:如果你拔掉一個插頭,它就會知道它是不合格的,因為它只有不到一半的可用投票(該值實際上是可配置的)。沒有仲裁的集群不適合在其上執行集群服務。

這個原則不僅適用於 Red Hat 集群,而且是一個通用原則。但是,解決方案和實現可能會有所不同。還有雙節點集群的實現,因為如果你給兩個節點各投一票,通常不會有一個節點是quorate的。

當然,作為冗餘對的必要部分,您不依賴另一台機器來啟動集群服務?

對於 Red Hat,在一個雙節點集群中,有一個特殊條件適用:

    <cman expected_votes="1" two_node="1"/>

當你拔掉插頭時會發生什麼,兩個節點將失去彼此的聯繫。

為了確定其中哪一個具有法定人數,他們都將嘗試互相STONITH 。

STONITH 是 Shoot-The-Other-Node-In-The-Head 的首字母縮寫詞,它可以保護您的數據不被惡意節點或併發訪問破壞。僅僅因為一個節點沒有響應,這並不意味著它沒有訪問您的數據。100% 確保您的數據安全的唯一方法是使用 STONITH 隔離節點,以便我們可以確定該節點確實處於離線狀態,然後才允許從另一個節點訪問數據。

因此,您所做的假設是正確的,您的集群配置錯誤並且需要隔離代理才能執行,因為通過拔掉插頭,您不僅會使您的服務不可用,這通常會導致rgmanager故障轉移到其他節點(或如何無論您是否已將其配置為執行此操作),您還可以刪除集群節點之間的心跳連結。儘管rgmanager可能會嘗試執行您配置的操作,cman但仍然無法確定這些節點中的哪一個具有仲裁。相反,它會始終嘗試隔離另一個節點,但是由於您沒有配置隔離代理,它將無限期地卡住。

所以這裡有兩個很好的建議給你:

  1. 通過在隔離的網路上向集群節點添加額外的介面,將集群流量與網路流量分開,這樣當您在面向應用程序的介面上拔下插頭時,集群將執行乾淨的故障轉移
  2. 配置圍欄。

引用自:https://serverfault.com/questions/592691