如何在生产服务器上部署 Java WAR 文件而不造成任何停机。我目前使用 Apache2 -> Jetty6,当我需要更新 Web 应用程序时,我将 war 解压到目录中,然后重新启动 Jetty 服务
/etc/init.d/jetty6 restart
这可能需要 5 分钟才能重新启动,还有其他方法吗?“大型”网站是如何做到的?
根据我的经验,JBoss 等热部署会失败,因为垃圾收集器没有收集所有内容,并且服务/进程会耗尽内存,情况是否有所改善?
答案1
怎么样?创建一个执行以下操作的脚本:
- 在端口 8081 上启动 jetty 的第二个实例。
- 重新加载备用 apache 配置以将流量发送到 8081。我认为这一步应该很快。我使用 nginx,它是即时的。
- 杀死 8080 码头
- 将更新的 war 复制到 8080 jetty webapps 文件夹中
- 在端口 8080 上重新启动 jetty
- 将 apache 重新指向 8080
- 终止 8081 上的 jetty
答案2
您需注意以下事项:
- 会话(基于 Cookie 的会话)
- 数据库结构改变(破坏旧应用程序)
为了在应用程序重启后保持会话,您需要一个中心位置来保持会话,该位置位于应用程序之外。例如,具有复制功能的 2 个数据库或具有复制功能的 memcached。
对于数据库更改,您必须确保新应用程序仅指向具有新结构的数据库。不要删除字段或使新结构与旧应用程序不兼容。例如,不要删除属性或更改其类型。
配置 apache 以使用 2 个应用服务器(可在同一台服务器上运行)的负载平衡。使用会话粘性。当部署其中一个服务器时,另一个服务器可以响应请求。
大型网站正在使用带有服务器集群、循环 DNS、负载均衡器的分布式 AS……