我使用 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 有一些新的状态完全重启代码,但我还没有研究过。