我有三个 Tomcat 实例在 HAProxy 后面运行。当我对我的 Web 应用程序进行更改时,我希望进行滚动部署(即一次重新启动一个 Tomcat),这样用户就不会看到任何停机时间。
我该怎么做?我看到正在运行的 haproxy 实例可以进行热重新配置(这有利于添加或删除新的池服务器),但是当其中一个目标服务器暂时关闭时,HAProxy 会如何反应?
如果有比 HAProxy 更好的解决方案,我也愿意考虑。
谢谢!
答案1
我给 Willy Tarreau 发了一封电子邮件,得到了以下回复:
您可以使用热重新配置或 socat 命令对统计服务器进行操作,将目标服务器的权重设置为 0。这将阻止新会话平衡到该服务器,但不会影响现有连接。
您可以将 http-check disable-on-404 选项与“option httpcheck /myurl”结合使用,然后让您的目标服务器响应 /myurl,以便如果一切正常,则发送 200 状态,如果服务器停止接收新请求,则发送 404,如果服务器没有收到任何内容(即当您准备反弹服务器时),则发送 500。haproxy 将按照服务器行中指定的间隔重新检查服务器。
答案2
因为根据@,HAProxy 不支持在不重新配置的情况下进行删除埃内斯特·穆勒在他的回答,由于您还要求其他场景,所以我将为您提供替代方案。
我用低压开关柜,这是我最喜欢的负载平衡解决方案之一,因为它可以用于更多 HTTP。
使用 LVS,您可以ipvsadm
手动添加和删除服务器。删除示例如下命令:
/sbin/ipvsadm -e -t VIP:443 -r SERVERIP:443 -g -w WEIGHT
与通过与 LVS 交互手动添加和删除相比,我通常更喜欢request
使用ldirectord
. ldirector 是一个守护进程,用于轮询和管理您的 ipvs 配置。您可以使用该参数指定一个带有 URI 路径的文件。在部署期间,您可以删除该文件并等待服务器停止访问。此时,您可以部署代码而不会影响生产客户端。
答案3
这在很大程度上取决于您是否在 Tomcat 上进行任何会话/状态管理。如果用户的会话因重启而被破坏,则滚动不会阻止对用户的影响(它可能会阻止他们看到 500,但不会阻止他们重新开始会话)。如果您不使用粘性会话,那么您可能不必担心这一点。
HAproxy 和其他负载均衡器有办法尝试快速确定其背后的服务器是处于启动状态还是关闭状态,并据此重新路由流量(HAProxy 中的“健康检查”)。但是,它们不可能完美地做到这一点。对于 Tomcat,不仅有“启动”和“关闭”;还有“启动,即在端口上响应,但尚未准备好”。因此,您不应该依赖 LB 来完全防止用户面临的影响 - 即使进行了良好的健康检查,也会有一段时间您将流量发送到坏节点。
滚动部署时,我们会主动将服务器从负载均衡器中取出,然后干扰/重新启动节点,等待它通过自动测试/监控,然后将其放回,然后移动到下一个服务器。如果负载均衡器具有可以远程调用(例如,从脚本)来禁用服务器的 API,那么这更容易 - 我们的旧 Netscaler 可以做到这一点,但 HAProxy 却不能。使用 HAProxy,您要么必须编辑配置并重新启动(很遗憾),要么可以将健康检查更改为可以对其进行操作的位置 - 比如,当您希望它忽略该节点时,它可能检查您重命名的魔术文件。您必须等待健康检查启动并且节点离开集群,但之后您应该没问题。
我遇到了这个帖子它有一个与 iptables 相关的解决方案来解决这个问题......