如何让 HAProxy 等待健康检查成功后再将服务器退出维护模式

如何让 HAProxy 等待健康检查成功后再将服务器退出维护模式

我使用 HAProxy 套接字通信将我的后端置于维护模式,然后通过以下命令关闭 Web 服务器进行维护:

echo "disable server cluster-01/app-01-4" | sudo socat stdio /tmp/haproxy.sock

问题是,当我通过套接字启用命令将后端标记为再次可用时,HAProxy 不会等待任何成功的健康检查就向后端发送请求。因此,在 HAProxy 意识到服务器仍处于关闭状态并将其重新下线之前,我们最终丢失了一些请求。

有没有办法告诉 HAProxy 等到后端恢复正常后再启用它?还是我必须让我的启动脚本足够智能,以便在告诉 HaProxy 再次启用后端之前监视服务器本身?这显然不太理想。

我目前正在这样做:
echo "enable server cluster-01/app-01-4" | sudo socat stdio /tmp/haproxy.sock

有没有类似的东西可以代替这个? echo "enable server cluster-01/app-01-4 WAIT_FOR_SUCCESSFUL_HEALTH_CHECK" | sudo socat stdio /tmp/haproxy.sock

编辑:我正在使用 HAProxy 版本 1.5x

答案1

set server proxy-name/server-name health down在将服务器重新投入服务之前使用enable server ...似乎可以满足您的需要。

服务器最终会通过后续的健康检查停止服务,但是如果服务器在停止服务时是健康的,但在重新启用时却不健康,那么这也没有帮助,因为 HAProxy 似乎假定服务器在启用时将处于与禁用时相同的健康状态。

答案2

您可以迁移到 haproxy 1.6.3 并使用新的代理检查功能。这还允许您在将主机从轮换中移除时将其排空。

答案3

在 Loadbalancer.org 我们采用一种稍微复杂的方式来实现这一点 :-)。

在重新启动 HAProxy 之前,我们会检查所有当前状态并检查是否有任何服务器处于 DOWN 或 MAINT 状态。

然后我们阻止 SYN 数据包(处理重新加载时丢弃的流量问题)然后我们重新启动 HAProxy

然后我们手动将所有状态设置为 DOWN 或 MAINT(基于 0.01 秒前的状态..)

然后我们重新启用 SYN 数据包...

为我们提供了无缝重启所需的结果,没有停机或丢失数据包。

如果您不想理会以上所有操作,那么只需在重新加载后将所有内容设置为 DOWN 状态即可。快速完成并祈祷好运 :-)。

v1.6 有一些新的状态完全重启代码,但我还没有研究过。

相关内容