我在 CentOS 6.5 上安装了 Red Hat 的集群软件,并使用它提供从一个网络到另一个网络的冗余路由。这工作得很好,我有一对提供该服务的盒子,这样如果其中一个发生故障(例如,如果我通过删除其网络连接进行测试),另一个就会接管路由。
但是,如果我必须对剩下的盒子做任何事情,我无法重新启动它,因为 rgmanager 存在问题:
service rgmanager stop
挂起,停止进程的唯一方法就是执行kill -9
此操作。这显然还会影响任何试图停止服务的操作,例如reboot
或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>
如果一台机器看不到另一台机器,为什么我不能在它上面启动服务?作为冗余对,不依赖另一台机器来启动集群服务肯定是必需的吧?
答案1
要运行集群服务,需要法定人数。通常在三节点集群中,每个成员各有一票:如果您取消其中一个成员的投票,该成员就会知道它没有法定人数,因为它拥有的可用投票数不到一半(该值实际上是可配置的)。没有法定人数的集群不适合运行集群服务。
此原则不仅适用于 Red Hat 集群,而是一个通用原则。但解决方案和实现可能有所不同。双节点集群的实现也是如此,因为如果您给两个节点各一票,则通常不会有一个节点获得多数票。
作为冗余对的一个必需部分,您不需要依赖另一台机器就能启动集群服务,对吧?
对于 Red Hat 来说,在双节点集群中,存在一个特殊情况:
<cman expected_votes="1" two_node="1"/>
当你拔掉插头时,两个节点将失去彼此的联系。
为了确定其中哪一个具有法定人数,他们都会尝试斯托尼特彼此。
STONITH 是 Shoot-The-Other-Node-In-The-Head 的缩写,它可以保护您的数据免受恶意节点或并发访问的破坏。仅仅因为一个节点没有响应,并不意味着它没有访问您的数据。100% 确保您的数据安全的唯一方法是使用 STONITH 隔离节点,这样我们就可以确定该节点确实处于离线状态,然后再允许从另一个节点访问数据。
因此,您做出的假设是正确的,您的集群配置错误,需要隔离代理才能运行,因为通过拔掉电源插头,您不仅会使服务不可用(这通常会导致rgmanager
故障转移到其他节点(或无论您如何配置它),还会删除集群节点之间的心跳链接。即使rgmanager
可能尝试执行您为其配置的操作,cman
仍然无法确定这些节点中的哪一个具有法定人数。相反,它将不断尝试隔离其他节点,但由于您没有配置隔离代理,它将无限期地陷入困境。
因此,这里有两条好的建议给你:
- 通过在隔离网络上向集群节点添加附加接口,将集群流量与网络流量分开,这样,当你断开面向应用程序的接口时,集群将进行干净的故障转移
- 配置隔离。