Java应用程序的零停机部署

Java应用程序的零停机部署,java,deployment,load-balancing,high-availability,Java,Deployment,Load Balancing,High Availability,我正在尝试为Java应用程序构建一个非常轻量级的零停机部署解决方案。为了简单起见,让我们假设我们有两台服务器。我的解决方案是使用: 在“前端”——一些负载平衡器(软件)——我在考虑HAProxy 在“后台”——两台服务器上,都运行Tomcat和已部署的应用程序 当我们即将部署新版本时 我们使用HAProxy禁用其中一个服务器,因此只有一个服务器可用(我们称之为服务器A,它正在运行旧版本) 在另一台服务器上部署新版本(我们称之为服务器B),运行生产单元测试(如果有的话:-),并使用HAProxy启

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

  • 在“前端”——一些负载平衡器(软件)——我在考虑HAProxy

  • 在“后台”——两台服务器上,都运行Tomcat和已部署的应用程序

  • 当我们即将部署新版本时

  • 我们使用HAProxy禁用其中一个服务器,因此只有一个服务器可用(我们称之为服务器A,它正在运行旧版本)

  • 在另一台服务器上部署新版本(我们称之为服务器B),运行生产单元测试(如果有的话:-),并使用HAProxy启用服务器B,同时禁用服务器A

  • 现在,我们又只有一台服务器处于活动状态(服务器B,新版本)。在服务器B上部署新版本,并重新启用它

  • 有什么建议可以改进吗?如何实现自动化

    是否有现成的解决方案,或者我是否必须以自己的自定义脚本结束


    谢谢

    滚动升级确实是一个很好的解决方案,只要您的负载平衡器支持此选项(服务器饥饿)。 另一个解决方案是使用支持OSGi的应用程序服务器,热替换应用程序的部分或全部


    我推荐第一个。SpringSource的AMS监控控制台可以关闭一个tcServer集群(一个使用类固醇的定制tomcat),IIRC会自动进行滚动升级(但请查看文档)。

    如果您可以容纳OSGi容器,请查看OSGi技术,因为它为OSGi捆绑包提供了良好的隔离和热部署。如果您使用的是Spring框架,您可以使用

    提供滚动重启的功能,提供用于自动化的CLI API和Hudson/Jenkins插件。

    我从中找到了一些关于零停机的有趣解决方案。在这篇文章中,我只想强调几个解决方案

    1。A/B开关:(滚动升级+回退机制)

    我们应该有一组处于待机模式的节点。我们将在这些节点上部署新版本,并立即将流量切换到这些节点。如果我们将旧节点保持在其原始状态,我们还可以执行即时回滚。负载平衡器面向应用程序,并根据请求负责此切换

    缺点:如果你需要X台服务器来运行你的应用程序,你就需要2台服务器

    2。零停机时间

    通过这种方法,我们不需要保留一套机器;相反,我们延迟了端口绑定。共享资源获取延迟,直到应用程序启动。端口在应用程序启动后进行切换,旧版本也会保持运行(没有接入点),以便在需要时立即回滚

    3。并行部署—Apache Tomcat:(仅适用于web应用程序)

    ApacheTomcat在其版本7中添加了并行部署功能。它们允许应用程序的两个版本同时运行,并将最新版本作为默认版本

    4。延迟端口绑定:

    我们在这里提出的功能是在不绑定端口的情况下启动服务器,基本上不启动连接器。稍后,将启动一个单独的命令并绑定连接器。当版本1正在运行且已绑定时,可以部署软件的版本2。当版本2稍后启动时,我们可以解除绑定版本1并绑定版本2。使用此方法,节点仅在几秒钟内有效脱机

    5。高级端口绑定:

    通过打破神话:“
    地址已在使用中”
    ,*旧进程和新进程都将绑定到同一端口。因此,ON模式下的_REUSEPORT选项允许两个(或更多)进程绑定到同一端口。一旦新进程绑定到端口,就杀死旧进程

    SO_REUSEPORT选项解决了两个问题:

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

  • 改进的日程安排:

  • 总之:

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

    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
    

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

    因此,REUSEPORT将在积压工作中失去连接。该链接不再工作