滚动部署在Tomcat后面的HAProxy实例

我有三个Tomcat实例在HAProxy后面运行。 当我对我的Web应用程序进行更改时,我想要进行滚动部署(即一次反弹一个Tomcat),以便用户看不到任何停机时间。

我该怎么做呢? 我看到一个正在运行的haproxy实例可以进行热重新configuration(这对于添加或删除新的池服务器非常有用),但是当其中一个目标服务器暂时closures时,HAProxy如何反应?

如果有比HAProxy更好的解决scheme,我也愿意看看。

谢谢!

我给Willy Tarreau发了一封电子邮件,并回复了以下选项:

  1. 您可以使用热重新configuration或socat命令到统计信息服务器,以将目标服务器的权重设置为0.这将防止新会话与该服务器平衡,但不会影响现有的连接。

  2. 您可以将http-check disable-on-404选项与“选项httpcheck / myurl”结合使用,然后让目标服务器响应/ myurl,如果一切正常,则发送200状态,如果服务器应该发送404停止接收新的请求,如果服务器没有收到任何请求(例如,当你准备反弹服务器)时,500。 haproxy将按照服务器行中指定的时间间隔重新检查服务器。

正如HAProxy不支持根据@ Ernest Muller在他的回答中重新configuration一样去除,我将为您提供另一种替代scheme,因为您也请求了其他scheme。

我使用LVS ,这是我最喜欢的负载均衡解决scheme之一,因为它可以用于HTTP之外。

使用LVS,您可以使用ipvsadm手动添加和删除服务器。 删除的一个例子是以下命令:

 /sbin/ipvsadm -e -t VIP:443 -r SERVERIP:443 -g -w WEIGHT 

与通过与LVS交互手动添加和删除相反,我经常更喜欢使用ldirectordrequest选项。 ldirector是一个守护进程,可以轮询和pipe理你的ipvsconfiguration。 您可以使用该参数指定具有URIpath的文件。 在部署期间,您将删除文件并等待服务器停止访问。 此时,您可以部署代码而不影响生产客户端。

这很大程度上取决于你是否正在对Tomcats进行任何会话/状态pipe理。 如果用户的会话被重新启动所破坏,那么滚动不会阻止用户的影响(这可能会阻止他们看到500,而不是不必开始他们的会话)。 如果你不使用粘滞的会话,你可能不用担心这个问题。

HAproxy和其他负载平衡器有办法很快地确定它后面的服务器是启动还是closures,并根据该stream量重新路由stream量(HAProxy中的“运行状况检查”)。 然而,他们不可能做到这一点。 有了Tomcat,就不只是“上”和“下”。 有“在港口回应,但事情还没有准备好”。 所以你不应该依靠LB来完全防止用户面临的影响 – 即使有一个良好的健康检查,也会有一个时间间隔,你会得到一个坏节点的stream量。

我们对滚动部署所做的工作是积极地将服务器从负载平衡器中取出,然后再混乱/重新启动节点,等待它通过自动化testing/监视器,然后放回,然后移到下一个服务器。 如果负载平衡器有一个可以远程调用的API(比如从脚本)来禁用服务器 – 我们的旧的Netscaler做到了这一点,但是HAProxy没有这样做,这更容易。 使用HAProxy,您必须编辑configuration并重新启动(悲伤),或者您可以将运行状况检查更改为可以对其进行操作的位置 – 例如,可能会在您希望忽略该节点时检查重命名的魔法文件。 你必须等待健康检查开始,节点离开集群,但是你应该没问题。

我跑过这个post ,有一个iptables相关的解决scheme,以解决这个问题…