如何在降级模式下运行CentOS(红帽)群集?

我在CentOS 6.5上安装了Red Hat的集群软件,并使用它来提供从一个networking到另一个networking的冗余路由。 这工作正常,我有一对盒子提供服务,所以如果一个失败(例如,如果我通过删除其networking连接testing),另一个接pipe路由。

但是,如果我必须对剩下的盒子做任何事情,由于rgmanager的问题,我无法重新启动它:

service rgmanager stop 

挂起,停止这个过程的唯一方法是kill -9它。 这显然也会影响任何试图停止服务的操作,如rebootreboot

当我设法自己启动服务器时,虽然集群启动,但是rgmanager并没有显示为在clustat运行,并且冗余路由服务都不可见,更不用说启动了。

例如,如果将这些盒子部署到远程位置,并且在我们有机会更换出现故障的盒子之前需要closures电源,这可能会导致问题。

这是我的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> 

为什么我不能在一个盒子里看到其他的服务? 当然,作为一个冗余对的必要组成部分,您不依赖另一台机器来启动集群服务?

要运行群集服务,需要一个法定人数。 通常在三节点群集中,每个成员都有一个投票:如果你把一个插头拔下,它就会知道它被查询,因为它只有不到一半的可用投票(这个值实际上是可configuration的)。 没有仲裁的群集不适合在其上运行群集服务。

这个原则不仅适用于红帽集群,而是一个普遍的原则。 解决scheme和实现可能会有所不同。 也是双节点集群的实现,因为如果你给每个节点一个表决一票,没有一个单独的一个通常是quorate。

当然,作为一个冗余对的必要组成部分,您不依赖另一台机器来启动集群服务?

在红帽的情况下,在双节点集群中,适用特殊条件:

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

当你拔插头时会发生什么事情,两个节点将失去联系。

为了确定哪一个人有法定人数,他们都会试图互相替代STONITH 。

STONITH是射击其他节点在头上的首字母缩写,它可以保护您的数据免受恶意节点或并发访问的破坏。 仅仅因为一个节点没有响应,这并不意味着它没有访问你的数据。 确保数据安全的唯一方法是使用STONITH来隔离节点,这样我们就可以确定节点是真正离线的,然后才允许从另一个节点访问数据。

所以假设你是正确的,你的集群configuration错误,需要一个防护代理才能运行,因为通过拔插头,不仅使你的服务不可用,这通常会导致rgmanager故障转移到其他节点(或你如何configuration它),还可以删除集群节点之间的心跳链接。 即使rgmanager可能会尝试做你configuration它做的事情, cman仍然无法弄清楚哪个节点有法定人数。 相反,它会一直尝试围绕另一个节点,但由于您没有configurationfence-agent,因此将无限期地卡住。

所以这里给你两个很好的build议:

  1. 将群集通信与networking通信分离,方法是在隔离的networking上向集群节点添加额外的接口,以便在面向应用程序的接口上拔出插件时,群集将执行干净的故障切换
  2. configuration屏蔽。