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