我的目标是使用虚拟 IP (VIP) 实现 2 个节点的 HTTP 负载平衡器。对于这个任务,我选择了pacemaker
(虚拟 IP 交换)和Caddy作为 HTTP 负载均衡器。负载均衡器的选择不是这个问题的重点。:)
我的要求很简单——我希望将虚拟 IP 分配给运行健康且正常工作的 Caddy 实例的主机。
以下是我使用 Pacemaker 实现它的方法:
# Disable stonith feature
pcs property set stonith-enabled=false
# Ignore quorum policy
pcs property set no-quorum-policy=ignore
# Setup virtual IP
pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=123.123.123.123
# Setup caddy resource, using SystemD provider. By default it runs on one instance at a time, so clone it and cloned one by default runs on all nodes at the same time.
# https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/configuring_the_red_hat_high_availability_add-on_with_pacemaker/ch-advancedresource-haar
pcs resource create caddy systemd:caddy clone
# Enable constraint, so both VirtualIP assigned and application running _on the same_ node.
pcs constraint colocation add ClusterIP with caddy-clone INFINITY
但是,如果我通过 SSH 连接到分配了虚拟 IP 的节点,则 Caddy 配置文件格式错误并执行systemctl restart caddy
- 一段时间后 pacemaker 检测到 caddy 无法启动并简单地将其置于stopped
状态。
我如何强制起搏器继续重启我的 SystemD 资源而不是将其置于stopped
状态?
最重要的是 - 如果我修复配置文件并执行systemctl restart caddy
它,它就会启动,但 pacemaker 只是进一步保持它的stopped
状态。
最重要的是——如果我停止另一个节点,则虚拟 ip 不会分配到任何地方,原因如下:
# Enable constraint, so both VirtualIP assigned and application running _on the same_ node.
pcs constraint colocation add ClusterIP with caddy-clone INFINITY
有人可以指出我做错事的正确方向吗?
在 Pacemaker 中,某些故障被认为是致命的,一旦遇到它们,就需要手动清除它们(除非您配置了节点级防护,它将通过防护故障节点来为您清除它们)。
您需要告诉 Pacemaker
start
操作失败不是致命的。我通常还会设置一个失败超时,它会在几秒钟后自动清除没有隔离的集群中的操作失败。