1

我正在尝试使用主动/被动方法使我的应用程序高度可用。我目前将应用程序部署在 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(据我所知)。

4

1 回答 1

0

我最终做了以下事情:

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

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

我的应用程序使用 Spring 上下文来管理我的服务生命周期。我将它分成两个不同的上下文:一个wrapperSpring 上下文和一个childSpring 上下文。

wrapper上下文随着应用程序启动而启动,始终可用并在两个 Tomcat 上工作。同步服务被配置为wrapper上下文中的 bean。

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

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

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

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

于 2013-07-29T00:20:33.530 回答