【问题标题】:Tomcat active passive failoverTomcat 主动被动故障转移
【发布时间】:2013-01-07 05:16:16
【问题描述】:

我正在尝试使用 主动/被动 方法使我的应用程序具有高可用性。我目前将应用程序部署在 Tomcat 服务器上,该服务器可以托管在 Windows 或 Linux 平台上。

所以,现在我将它部署在两台 Tomcat 服务器上。每台服务器都在单独的机器上运行。我通过 Tomcat 配置将 Tomcat 配置为同一个集群,这给了我会话复制(存储在数据库中)。我使用一些网络服务器/负载平衡器来重定向请求(尚未决定)。

问题在于应用程序不能同时在两个 Tomcat 上运行,因为它当前是有状态的(而且使它成为无状态的成本太高)。我实际上只需要 一个 Tomcat 将同时启动。或者,至少,Tomcat 上只会启动一个应用程序。

综上所述,我需要一款能够:

  1. 通过 HTTP 请求识别应用程序的无效状态(机器/Tomcat 已关闭或应用程序无响应);
  2. 当其他应用程序被识别为无效时,在 Tomcat 上启动 Tomcat 实例或应用程序;
  3. 当 Tomcat 实例或应用程序被识别为无效时,停止 Tomcat 实例或应用程序。
  4. 同时支持 Linux 和 Windows 平台...

这个产品可以是在我们的 JVM 上使用的库,它可以是单独的监控进程,驻留在 Tomcat 机器上并相互通信并与 Tomcat 通信,它可以使用我们的数据库。它可能使用网络服务器机器...

我搜索了现成的产品 (Pacemaker/CoroSync/keepalived),它们都不支持 Windows(据我了解)。

【问题讨论】:

  • stackoverflow.com/questions/11465714/tomcat-webapp-failover 上查看我的答案 - 可能会解决您的问题
  • 可能是查看可集群应用程序服务器的一个很好的理由,其中节点相互了解。 Glassfish 3.1.2 可能在开源版本中可供您使用。
  • @ThorbjørnRavnAndersen 希望您没有在这里阅读我自己的答案 :)(那里有很多字)。无论如何,有趣的是,Glassfish 支持集群,但更换我们的服务器是不可接受的。谢谢。
  • 我做到了。为了让 Tomcat 做一些它原本不打算做的事情,做了大量工作。
  • @ThorbjørnRavnAndersen 和我哭了。但是,如果我们的服务是无状态的,我们只需将其全部激活并快乐地睡觉。

标签: tomcat failovercluster


【解决方案1】:

我最终做了以下事情:

两个 Tomcat 总是启动。该应用程序也在两个 Tomcat 上启动。

一个特殊的synchronization service 是手写的。该服务是应用程序的一部分,并随着应用程序启动而启动。它负责确定当前处于活动状态的节点以及哪个应该处于活动状态。

我的应用程序使用 Spring 上下文来管理我的服务生命周期。我将它分为两​​个不同的上下文:wrapper Spring 上下文和 child Spring 上下文。

wrapper 上下文与应用程序一起启动,始终可用并在两个 Tomcat 上运行。同步服务被配置为 wrapper 上下文中的 bean。

child 上下文实际上包括我的应用程序为外部客户端提供的所有服务。 这个是我指定的上下文,它只在当前节点处于活动状态时启动,在变为被动时停止。

child 上下文在主动/被动时是如何打开/关闭的?

此上下文不是在应用程序启动时自动启动的。当synchronization service 断定当前节点应该变为活动状态时,引发了一个导致child 上下文启动的事件,从而使该节点上的所有服务可用。反之亦然:当synchronization service 断定当前节点应该变为被动时,引发了一个适当的事件,导致child 上下文关闭,使该节点上的所有服务不可用

添加的另一个重要功能是用于传入请求的interceptor。到达其中一个 Tomcat 的传入请求实际上意味着负载平衡器/Web 服务器已确定目标节点是当前可用或首选节点。在这种情况下,即使目标节点是被动节点,它现在应该变为主动节点。因此intercepror 将引发与synchronization service 相同的事件,再次使child 上下文启动并且该节点上可用的服务(以及两个Tomcat 上的synchronization serivces 识别开关和以前活动的节点会钝化)。

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 2018-09-14
    • 2012-05-08
    • 1970-01-01
    • 2012-07-13
    • 2016-03-19
    • 1970-01-01
    • 2015-11-10
    • 2016-10-24
    相关资源
    最近更新 更多