如何以降级模式运行 CentOS(Red Hat)集群?

如何以降级模式运行 CentOS(Red Hat)集群?

我在 CentOS 6.5 上安装了 Red Hat 的集群软件,并使用它提供从一个网络到另一个网络的冗余路由。这工作得很好,我有一对提供该服务的盒子,这样如果其中一个发生故障(例如,如果我通过删除其网络连接进行测试),另一个就会接管路由。

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

service rgmanager stop

挂起,停止进程的唯一方法就是执行kill -9此操作。这显然还会影响任何试图停止服务的操作,例如rebootpoweroff

当我设法自行启动服务器时,虽然集群启动了,但 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仍然无法确定这些节点中的哪一个具有法定人数。相反,它将不断尝试隔离其他节点,但由于您没有配置隔离代理,它将无限期地陷入困境。

因此,这里有两条好的建议给你:

  1. 通过在隔离网络上向集群节点添加附加接口,将集群流量与网络流量分开,这样,当你断开面向应用程序的接口时,集群将进行干净的故障转移
  2. 配置隔离。

相关内容