我在 CentOS 6.5 上安装了 Red Hat 的集群软件,并使用它来提供从一个网络到另一个网络的冗余路由。这很好用,我有一对提供服务的盒子,所以如果一个失败(例如,如果我通过删除它的网络连接进行测试),另一个会接管路由。
但是,如果我必须对剩余的盒子做任何事情,由于 rgmanager 的问题,我无法重新启动它:
service rgmanager stop
挂起,并且停止该过程的唯一方法就是kill -9
它。这显然也会影响任何试图停止服务的操作,例如 areboot
或poweroff
.
当我确实设法自行启动服务器时,尽管集群启动了,但 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,在一个双节点集群中,有一个特殊条件适用:
当你拔掉插头时会发生什么,两个节点将失去彼此的联系。
为了确定其中哪一个具有法定人数,他们都将尝试互相STONITH 。
因此,您所做的假设是正确的,您的集群配置错误并且需要隔离代理才能运行,因为通过拔掉插头,您不仅会使您的服务不可用,这通常会导致
rgmanager
故障转移到其他节点(或如何无论您是否已将其配置为执行此操作),您还可以删除集群节点之间的心跳链接。尽管rgmanager
可能会尝试执行您配置的操作,cman
但仍然无法确定这些节点中的哪一个具有仲裁。相反,它会始终尝试隔离另一个节点,但是由于您没有配置隔离代理,它将无限期地卡住。所以这里有两个很好的建议给你: