Tomcat 主动被动故障转移

标签 tomcat failovercluster

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

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

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

总而言之,我需要一个软件能够:

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

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

我搜索了现成的产品(Pacemaker/CoroSync/keepalived),所有产品都不支持 Windows(据我所知)。

最佳答案

我最终做了以下事情:

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

一个特殊的同步服务是手写的。该服务是应用程序的一部分,随应用程序启动一起启动。它负责确定当前处于事件状态的节点以及哪个节点应该处于事件状态。

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

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

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

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

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

添加的另一个重要功能是传入请求的拦截器。传入请求命中其中一个 Tomcat,实际上意味着负载平衡器/网络服务器已决定目标节点是当前可用或首选节点。在这种情况下,即使目标节点碰巧是被动节点,它现在也应该变为主动节点。因此 intercepror 将引发与 synchronization service 相同的事件,再次使 child 上下文启动并在该节点上提供服务(两个 Tomcat 上的 同步服务 都识别了该开关,并且之前的事件节点将被钝化)。

关于Tomcat 主动被动故障转移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14484582/

相关文章:

java - 使用 Tomcat 和 Apache 进行 CSRF token 和 session 复制

java - Spring Boot + Tomcat 忽略 server.port 属性?

spring - 如何正确配置这个 Spring 项目?

PowerShell:如何返回 Hyper-V 群集中的所有 VM

powershell - 如何以对象格式获取测试集群输出?

tomcat - 错误 404/资源在带有 Tomcat 7 的 Eclipse EE Kepler 中不可用

java - 在 JSP 中将对象作为变量传递

jboss - 如何获取 JBoss 应用程序服务器的状态

c# - 如何升级在 Windows 故障转移群集上运行的通用应用程序

powershell - 无法从独立服务器运行 PowerShell 群集 cmdlet