Java应用程序的零停机时间部署
我正在尝试构建非常轻量级的解决方案,以便为Java应用程序实现零停机部署。 为简单起见,我们认为我们有两台服务器。 我的解决方案是使用:
-
在“前端” – 一些负载均衡器(软件) – 我在这里考虑HAProxy。
-
在“后面” – 两台服务器,都运行Tomcat和已部署的应用程序。
当我们即将部署新版本时
-
我们使用HAProxy禁用其中一个服务器,因此只有一个服务器(让我们称之为服务器A,运行旧版本)将可用。
-
在其他服务器上部署新版本(让我们称之为服务器B),运行生产unit testing(如果我们有它们:-)并使用HAProxy启用服务器B,同时禁用服务器A.
-
现在我们只有一个服务器活动(服务器B,新版本)。 在服务器B上部署新版本,然后重新启用它。
有什么建议怎么改进? 怎么自动化?
任何现成的解决方案或我必须最终使用自己的自定义脚本?
谢谢!
如果您的负载均衡器支持此选项(服务器缺乏),滚动升级确实是一个很好的解决方案。 另一种解决方案是使用支持OSGi的应用程序服务器来热替换部件或整个应用程序。
我会推荐第一个。 SpringSource的AMS监督控制台可以取下一个tcServer集群(类固醇上的自定义tomcat),IIRC自动进行滚动升级(但检查文档)。
我在本文中找到了一些关于零停机时间的有趣解决方案。 我想在该文章中仅强调几个解决方案。
1. A / B开关:( 滚动升级+后退机制 )
我们应该有一组待机模式的节点。 我们将新版本部署到这些节点,并立即将流量切换到它们。 如果我们将旧节点保持在原始状态,我们也可以进行即时回滚。 负载均衡器面向应用程序,并根据请求负责此切换。
缺点:如果您需要X服务器来运行您的应用程序,那么使用这种方法需要2X服务器 。
2.零停机时间
通过这种方法,我们不会保留一套机器; 相反,我们延迟端口绑定。 共享资源获取被延迟,直到应用程序启动。 应用程序启动后切换端口,旧版本也会继续运行(没有访问点),以便在需要时立即回滚。
3.并行部署 – Apache Tomcat 🙁仅适用于Web应用程序)
Apache Tomcat已将并行部署function添加到其版本7发行版中。 他们让两个版本的应用程序同时运行,并将最新版本作为默认版本。
4.延迟端口绑定:
我们在这里建议能够启动服务器而不绑定端口,基本上没有启动连接器。 稍后,将启动单独的命令并绑定连接器。 在版本1运行且已绑定时,可以部署该软件的第2版。 当稍后启动版本2时,我们可以取消绑定版本1并绑定版本2.使用此方法,节点仅在几秒钟内有效脱机。
5.高级端口绑定:
通过打破神话:’ Address already in use
‘,*旧进程和新进程将绑定到同一端口。 ON模式下的SO_REUSEPORT选项允许两个(或更多)进程绑定到同一端口。 一旦新进程绑定到端口,就终止旧进程。
SO_REUSEPORT选项解决了两个问题:
-
应用程序版本切换之间的小故障:节点可以始终为流量提供服务,有效地为我们提供零停机时间。
-
改进调度:
综上所述:
通过结合后期绑定和端口重用 ,我们可以有效地实现零停机。 如果我们保持备用过程,我们也可以立即进行回滚。
如果您可以容纳OSGi容器,请查看OSGi技术,因为它为OSGi包提供了良好的隔离和热部署。 如果您使用的是Spring框架,则可以使用Spring OSGi
LiveRebel提供滚动重启的function,为自动化提供CLI API和Hudson / Jenkins插件。
easy-deploy与Docker容器完全相同。
部署版本1
easy-deploy -p 80:80 -v some/path:other/path my-image:1
要部署新版本,只需运行带有更新标记名称的命令
easy-deploy -p 80:80 -v some/path:other/path my-image:2
披露:我建立了这个工具。 我完全构建它是因为我找不到解决这个问题的简单方法。