通常,HA群集中的计算机不应该真正知道哪个是活动的。有一个例外,介意,那就是cronjobs。在工作中,我们有一个HA集群,其中一些相当重要的服务运行。其中一些使用服务有cronjobs,我们只希望它们在活动盒子上运行。为此,我们使用此shell脚本:
#!/bin/sh HA_CLUSTER_IP=0.0.0.0 if ip addr | grep $HA_CLUSTER_IP >/dev/null; then eval "$@" fi
(请注意,这是在Debian上运行。)这样做是检查当前框是否是群集中的活动框(用HA群集的外部IP替换0.0.0.0),如果是,则执行命令作为脚本的参数传入。这确保了一个且只有一个盒子实际上正在执行cronjobs。
除此之外,我真的没有理由想到为什么你需要知道哪个盒子是活动盒子。
的 更新: 强> 我们的HA集群使用 心跳 将群集的外部IP地址作为辅助地址分配给群集中的活动计算机。以编程方式,您可以通过调用来检查您的机器是否是当前活动的盒子 gethostbyname() ,并迭代返回的数据,直到您到达结束或在列表中找到群集的IP。
gethostbyname()
这实际上取决于您正在使用的HA系统。
例如,如果您的系统使用共享IP并且流量由某个硬件盒管理,则可能很难确定某个盒子是主服务器还是从服务器。这将取决于特定的解决方案......只要您可以向主管添加自定义脚本,您应该没问题 - 例如控制器可以每秒在主服务器上ping一个守护程序。在警报脚本中,只需检查上次ping的时间是否为< 2秒......
如果您的系统没有超级用户/控制器节点,但每个节点都尝试确定状态本身,则可能会遇到更多问题。如果出现裂脑,您最终可能会同时使用两个从属或两个主服务器,因此在这两种情况下您的警报软件都会出错。只能确保一个活动节点(STONITH和其他)的小工具可以提供帮助。
另一方面,在第二种情况下,如果HA软件在两台主机上都能正常工作,您应该能够直接从中获取主/从信息。它必须随时了解自己的状态,因为它是它的主要功能之一。在大多数HA解决方案中,您应该能够获得当前状态,或者添加一些代码以在状态更改时运行。 Heartbeat提供两者。
我不会担心像裂脑那样的边缘情况。几乎任何在群集节点之间断开连接的情况都会比在单独节点上发生的事情更重要:)
如果你关心的事情只是真正的日志/警报,那么理想情况下你可以有一个单独的记录器盒,它可以获得有关当前网络/集群状态的所有信息。外部框可能会更好地了解如何处理这种情况。如果您的群集与网络断开连接/断开连接/断电,您将不会收到任何警报。一对冗余的独立监视器可以帮助您避免这种情况。
我不确定你为什么提到DNS - 由于它的刷新时间,它不应该是任何“实时”集群信息的来源。
一种方法是让盒子输出它是否在您的监控中有效的想法。从那里,您可以预测此状态的分页/电子邮件(具有围绕故障转移的竞争条件),并且在没有/太多系统认为它们处于活动状态时发出警报。
另一种选择是通过DNS别名(或一些其他方法来寻址活动系统)监视活动系统,并在其上进行分页。然后还监控所有系统,包括活动和非活动,并通过电子邮件发送。这将导致活动系统出现重复警报,但这可能没问题。
如果不了解更多有关您的设置的话,很难更具体。
没有硬编码......?我假设你的意思是一些本机心跳查询,不确定。但是,您可以使用ifconfig,HA在其配置为运行的任何接口上创建虚拟接口。例如,如果在eth0上配置了HA,那么它将创建eth0:0的虚拟接口,但仅在活动节点上创建。
因此,您可以对ifconfig输出执行简单查询,以确定服务器是否为活动节点,例如,如果eth0是已配置的接口:
ACTIVE_NODE=`ifconfig | grep -c 'eth0:0'`
这会将$ ACTIVE_NODE变量设置为1(表示活动)和0(如果处于待机状态)。希望可能有所帮助。
http://www.of-networks.co.uk