目前我们有以下设置。
TA和TB在LB后面运行。
现在,使用Box A或Box B从LB中进行零宕机部署是相当复杂和手动的工作。
我正在想做这样的事情:
基本上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实例。