Java应用程序的零停机时间部署

我正在尝试构建非常轻量级的解决方案,以便为Java应用程序实现零停机部署。 为简单起见,我们认为我们有两台服务器。 我的解决方案是使用:

  1. 在“前端” – 一些负载均衡器(软件) – 我在这里考虑HAProxy。

  2. 在“后面” – 两台服务器,都运行Tomcat和已部署的应用程序。

当我们即将部署新版本时

  1. 我们使用HAProxy禁用其中一个服务器,因此只有一个服务器(让我们称之为服务器A,运行旧版本)将可用。

  2. 在其他服务器上部署新版本(让我们称之为服务器B),运行生产unit testing(如果我们有它们:-)并使用HAProxy启用服务器B,同时禁用服务器A.

  3. 现在我们只有一个服务器活动(服务器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选项解决了两个问题:

  1. 应用程序版本切换之间的小故障:节点可以始终为流量提供服务,有效地为我们提供零停机时间。

  2. 改进调度:

在此处输入图像描述

综上所述:

通过结合后期绑定端口重用 ,我们可以有效地实现零停机。 如果我们保持备用过程,我们也可以立即进行回滚。

如果您可以容纳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 

披露:我建立了这个工具。 我完全构建它是因为我找不到解决这个问题的简单方法。