Apache tomcat 相当于 apachectl graceful

Apache tomcat 相当于 apachectl graceful

在基本的 LAMP 堆栈上,至少在我们的 RHEL5/6 服务器上,我们能够通过使用 和 跨负载平衡的 Web 服务器将滚动代码更新应用于我们的文档管理系统,而无需终止用户的连接(以及可能的文档下载)apachectl gracefulapachectl graceful-stop我们正在迁移到基于 Tomcat Web 服务器的应用程序,我们希望在新系统中拥有这种功能,但我找不到 tomcat6 具有任何等效功能。tomcat6 是否存在这样的功能?

答案1

Tomcat 没有此项功能。

请记住,Tomcat 是一个应用程序服务器而不是 Web 服务器,它需要在启动时加载内容,并可能在关闭时正常关闭内容。

答案2

简短答案

如果您具有负载平衡的 tomcat 实例,并且您的负载平衡器支持粘性会话和实时配置,那么您可以通过逐个轮换 tomcat 实例来实现您正在谈论的那种滚动和透明升级(在某种程度上)。

较长的答案

关于其他答案对 tomcat 作为应用程序服务器与 httpd 的正确描述以及相关问题,实际上有多种方法可以获得您想要的,即最终用户透明重启。

鉴于 tomcat 通常需要 30 秒或更长时间(具体取决于您的应用程序从冷部署的庞大和臃肿程度),因此能够透明地执行此操作通常很有用。

我将要解释的这种方法的另一个好处是,在将新应用程序发布给客户之前,能够放心地检查生产中的应用程序。

所以...阿帕奇的优雅重启建议其子进程在当前请求完成后退出,并用已重新读取新配置文件的新生成的进程/线程替换它们。因此,长时间运行的连接可以完成下载,而​​新请求则可以获取新内容。在 apache 管理的优雅重启过渡期间,实际上有两个版本的应用程序在运行,即旧版本和新版本。

很遗憾,使用 tomcat如果设置了 autodeploy=true,对配置文件或 war 内容的任何更改都会导致 Context 重新部署得相当不妥,我猜 Catalina Web 容器会等待一段指定的时间,然后再终止所有未完成的线程和请求。它不太透明,最终会提供可怕的 500 错误,直到应用程序恢复正常 :-(

因此,为了实现透明的最终用户体验,您将需要在短时间内同时运行 2 个版本的应用,一个用于旧连接,一个用于新连接。(这些方法有许多注意事项,我将在下面介绍...)

最简单的方法,就是要有一个前端负载均衡器,比如 apache、haproxy 或 Cisco CSM,带有 2 个或更多 tomcat 实例 - 其中负载均衡器支持粘性会话和热负载均衡器配置部署。

例如 tomcat1、tomcat2 和 balancer

  1. 将负载均衡器中的服务器场中的 tomcat2 首选项级别更改为零。(haproxy 绝对可以,而且我认为 mod_proxy 允许您实时更改实例首选项。)
  2. 等到所有连接都到达 tomcat1(使用 jmx 或 netstat 监控网络连接)
  3. 在 tomcat2 上重新部署 Web 应用程序
  4. 等待 tomcat2 启动,自己对应用程序进行健全性测试!
  5. 将 tomcat2 的优先级改为零,将 tomcat1 的优先级改为高
  6. 等到所有连接都在 tomcat1 上,
  7. 反之亦然。部署其他节点,然后重复等。

请注意,这是改变节点偏好级别,而不是降低节点将允许负载均衡器优雅地管理到新 Web 应用程序的连接的转换。

显然,如果您只有 1 个服务器,因此只有 1 个 tomcat,您可以想出类似的东西,但这需要为您的 webapp 进行一些巧妙的命名。我从来没有在 1 个 tomcat 上部署到生产中,但我会使用安装在同一个 tomcat6 上的具有不同 war 名称和文档路径的 2 个版本的 web app 来做到这一点,就像这样;

/var/lib/tomcat6/webapps/mywebapp_0_1.war => http://localhost:8080/mywebapp_0_1
/var/lib/tomcat6/webapps/mywebapp_0_2.war => http://localhost:8080/mywebapp_0_2

并通过使用 apache mod_proxy 或 haproxy 来优雅地迁移两个应用程序之间的连接,使更改变得透明。

即我会在同一个盒子上一起安装 apache httpd 和 tomcat6,并且 httpd mod_proxy 指向如下;

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

<Location /balancer-manager>
SetHandler balancer-manager
</Location>

<Proxy balancer://cluster>
BalancerMember http://localhost:8080/webapp_0_1
BalancerMember http://localhost:8080/webapp_0_2
</Proxy>

<Location />
ProxyPass balancer://cluster/webapp stickysession=JSESSIONID
</Location>

警告,如果您必须升级数据库模式,那么除非您想开始对您的数据库进行一些疯狂的命名和链接,比如database_0_1,否则您将不得不忍受一些停机时间。

如果你的用户会话时间很长,那么 tomcat6 支持会话聚类使用各种后端

相关内容