我有一对服务器设置为高可用性负载平衡器/反向代理。每个都运行 Ubuntu 12.04 x64 服务器、Varnish、Heartbeat 和 Pacemaker,并使用 Varnish 负载平衡后端服务器的流量。
如果任一负载均衡器发生故障,Heartbeat/Pacemaker 会将一组虚拟 IP 传输到另一台服务器,然后流量恢复。这一点工作正常。
我没有考虑的是 Varnish 是否没有在任何一台服务器上运行。目前可以在不触发 Heartbeat/Pacemaker 的任何动作的情况下停止 Varnish。我希望当前服务器上缺少可操作的 Varnish 以触发向备份的移动(而不是尝试重新启动 Varnish),但我正在努力寻找任何类型的在线指导。谁能帮忙?
编辑达夫后的帮助:
我最终得到的结果与我最初的请求有点不同:Pacemaker 尝试重新启动 Varnish 一次,如果失败,它会将所有资源移动到被动节点。
我的设置是两台服务器,serverA(主动)和 serverB(被动)。我假设消息传递层(Heartbeat 或 Corosync)已经设置好并可以正常工作。为了让 Pacemaker 控制 Varnish,我们需要修复 Ubuntu 的 Varnish init 脚本:
sudo vim /etc/init.d/varnish
代替:
--start --quiet --pidfile ${PIDFILE} --exec ${DAEMON} -- \
在 start_varnish_d() 函数中:
--start --quiet --pidfile ${PIDFILE} --oknodo --exec ${DAEMON} -- \
所以它按照此处概述的规则工作。现在使用两个虚拟 IP 在 serverA 上设置一个基本的 Pacemaker 集群:
sudo crm configure property no-quorum-policy=ignore
sudo crm configure property stonith-enabled=false
sudo crm configure primitive virtual_ip_1 ocf:heartbeat:IPaddr params ip="192.168.1.134" nic="eth1" cidr_netmask="24" broadcast="192.168.1.255" op monitor interval="10s" timeout="20s"
sudo crm configure primitive virtual_ip_2 ocf:heartbeat:IPaddr params ip="192.168.1.135" nic="eth1" cidr_netmask="24" broadcast="192.168.1.255" op monitor interval="10s" timeout="20s"
为 Varnish 添加一个原语,提供监控频率,以及启动和停止 Varnish 的大量时间:
sudo crm configure primitive varnish lsb:varnish op monitor interval="10s" timeout="20s" op
start interval="0" timeout="15s" op stop interval="0" timeout="15s"
将 varnish 基元与虚拟 IP 分组,以便 Pacemaker 在发生故障时将所有资源迁移到被动节点:
sudo crm configure group cluster virtual_ip_1 virtual_ip_2 varnish
设置迁移阈值,以便 Pacemaker 在将所有资源移动到被动节点之前容忍两次故障。对于 Varnish,这意味着一次初始失败,再加上一次失败的重启尝试:
sudo crm_attribute --type rsc_defaults --attr-name migration-threshold --attr-value 2
设置失败超时。这似乎做了两件事:
在迁移到被动节点之前,为 Pacemaker 提供一次 Varnish 重启尝试的时间。
防止失败的节点在 30 秒后被标记为失败,允许将资源移回它,而无需在失败后手动运行 crm 资源清理清漆。这对我的设置来说是件好事,因为我没有在节点上设置任何权重,但在不同的环境中这可能是一个非常糟糕的主意。
sudo crm_attribute --type rsc_defaults --attr-name failure-timeout --attr-value 30s
就是这样,但请参阅下面达夫的回答以获取有关粘性的评论,我最终没有使用它。我能看到的唯一缺点是,如果您手动将节点置于待机状态,Pacemaker 将关闭该节点上的 Varnish,从而清除内存中的缓存。对我来说,这不是什么大不了的事。
您的集群架构让我感到困惑,因为您似乎正在同时在两个节点上独立运行集群管理的服务(如 Varnish),让集群资源管理器(CRM)只是处理 IP 地址。
您希望通过集群设置实现什么目标?容错?负载均衡?两个都?请注意,我说的是集群资源(Varnish、IP 地址等),而不是 Varnish 分配负载的后端服务器。
对我来说,这听起来像是您想要一个提供容错能力的主动-被动双节点集群。一个节点是活动的,运行 Varnish、虚拟 IP 地址和可能的其他资源,而另一个节点是被动的,在集群资源管理器将资源移到被动节点之前什么都不做,此时它变为活动节点。这是一个久经考验的架构,与时间本身一样古老。但要使其正常工作,您需要让 CRM 完全控制资源。我建议从头开始学习 Clusters,然后对您的集群进行建模。
在您更新的问题后进行编辑:您的 CIB 看起来不错,并且一旦您修补了 Varnish init 脚本以便重复调用“开始”返回 0 您应该能够添加以下原语(根据您的喜好调整超时和间隔):
不要忘记将它添加到平衡器组(列表中的最后一个元素):
编辑 2:要降低迁移阈值,请在 CIB 末尾添加一个资源默认值部分,并将该
migration-threshold
属性设置为较低的数字。将其设置为 1 表示资源将在单次失败后迁移。设置资源粘性也是一个好主意,这样由于节点故障(重启或关闭)而迁移的资源不会在节点再次可用时自动迁移回来。