在硬件LB之后的零停机部署(Tomcat),Nginx或HAProxy – 如何“饿死”旧的服务器?

目前我们有以下设置。

  • 硬件负载平衡器(LB)
  • Box 8080(TA)上运行的Tomcat
  • 运行Tomcat的Box 8080(TB)

TA和TB在LB后面运行。

现在,使用Box A或Box B从LB中进行零宕机部署是相当复杂和手动的工作。

我正在想做这样的事情:

  • 硬件负载平衡器(LB)
  • Box A在8080(NA)上运行Nginx
  • Box 8081上运行的Tomcat(TA1)
  • Box 8082上运行的Tomcat(TA2)
  • 在B80上运行Nginx的Box B(NB)
  • 在8081上运行Tomcat的Box B(TB1)
  • 在8082上运行Tomcat的Box B(TB2)

基本上LB现在将指挥NA和NB之间的stream量。 在每一个Nginx的我们将有TA1,TA2和TB1,TB2configuration为上游服务器。 一旦上游的健康检查页面中的一个没有响应(closures),stream量将转到另一个(Nginx上的HttpHealthcheckModule模块)。

所以部署过程很简单。

说,TA1是活跃的0.1版本的应用程序。 TA1上的健康检查是可以的。 我们开始TA2与Healthcheck作为错误。 所以Nginx不是在跟它说话。 我们将应用程序版本0.2部署到TA2。 确保它的工作。 现在,我们将TA2上的Healthcheck切换到OK,将Healthcheck切换到TA1以ERROR。 Nginx将开始为TA2服务,并且将移除TA1。 完成! 现在和另一个盒子一样。

虽然听起来很酷,但是我们怎么“饿死”Nginx呢? 假设我们有待处理的连接,TA1上的一些用户。 如果我们closures它,会话将会中断(我们有基于cookie的会话)。 不好。 任何使用Nginx来阻塞上游服务器的stream量?

谢谢!

我的意见是,如果你愿意为了获得零停机时间而投入如此复杂的设置,那么你应该花时间在获得更好的负载平衡器上。 按照你所build议的方法,你只是为了节约边际成本而进行简单的交易,这总会使你付出的代价超过你的预期。

您将需要停机时间来实现您提出的零停机解决scheme。 采取这种停机时间,而不是找出如何使用您现有的负载平衡器,或交换出更好的东西。

我基本上通过使用HAProxy作为我的负载平衡器,并且经常对“健康检查”html页面进行检查,从而完成您所寻找的内容。 在后端web服务器的nginxconfiguration中,这个页面并不存在。 在部署期间,我在后端服务器上创build一个名为“offline.html”的文件。 在nginx中,如果这个文件在请求“check.html”的时候存在,它就会提供服务,否则它会提供真正的健康检查页面。

在我的部署过程中,我触摸offline.html文件,等待几分钟让负载平衡器将服务器踢出,部署,然后删除文件。

站点启动备份,负载平衡器将服务器添加回池中,并且一切正常。

附注,我会尽量消除依赖会话亲和力,如果你可以…

难道你不能在节点A和B上实现由复制的redis集群支持的Spring Session吗?

如果您将nginx实例configuration为在所有4个tomcat实例之间进行负载平衡,那么您可以随时closures或崩溃任何tomcat服务器,nginx将只使用下一个服务器来满足您的请求? 假设节点A和B可以连接到所有4个Tomcat实例。