我正在尝试使用主动/被动方法使我的应用程序具有高可用性。我目前在Tomcat服务器上部署应用程序,该服务器可以托管在Windows或Linux平台上。
所以,现在我将它部署在两个Tomcat服务器上。每台服务器都在一台单独的机器上运我通过Tomcat配置将Tomcats配置为同一个集群,这为我提供了会话复制(存储在DB中)。我使用一些Web服务器/负载均衡器来重定向请求(尚未决定)。
问题是应用程序不能同时在两个Tomcats 上运行,因为它目前是有状态的(并且使它成为无状态的成本太高)。我实际上只需要一个 Tomcat同时启动。或者,至少,只有一个应用程序将在Tomcat上启动。
总结一下,我需要一个能够:
的软件该产品可以是我们的JVM上使用的库,它可以是驻留在Tomcats机器上的独立监视进程,并且可以与Tomcats相互通信,也可以使用我们的数据库。它可能使用Web服务器机器......
我搜索了现成的产品(Pacemaker / CoroSync / keepalived),所有产品都不支持Windows(据我所知)。< / p>
答案 0 :(得分:0)
我最终做了以下事情:
两只雄猫总是开始。该应用程序也在两个Tomcats上启动。
特殊的synchronization service
是手写的。此服务是应用程序的一部分,并随应用程序启动一起启动。它负责确定当前处于活动状态的节点以及应哪个处于活动状态。
我的应用程序使用Spring上下文来管理我的服务生命周期。我将它分成两个不同的上下文:wrapper
Spring上下文和child
Spring上下文。
wrapper
上下文与应用程序启动一起启动,始终可用并在两个Tomcats上工作。同步服务在wrapper
上下文中配置为bean。
child
上下文实际上包含了我的应用程序为外部客户端提供的所有服务。 此是我指定仅在当前节点处于活动状态时启动并在被动时停止的上下文。
当主动/被动时,child
上下文是如何开启/关闭的?
此上下文未在应用程序启动时自动启动。当synchronization service
断定当前节点应该变为活动状态时,会引发一个导致child
上下文启动的事件,从而使该节点上的所有服务可用。反过来说:当synchronization service
断定当前节点shuold变为被动时,会引发正确的事件导致child
上下文关闭,使所有服务不可用在那个节点上。
添加的另一个重要功能是传入请求的interceptor
。进入其中一个Tomcats的传入请求实际上意味着负载均衡器/ Web服务器已确定目标节点是当前可用或首选节点。在这种情况下,即使发生目标节点是被动节点,它应该现在变为活动状态。因此,intercepror
会引发与synchronization service
相同的事件,再次启动child
上下文,并在该节点上提供服务(以及synchronization serivce
Tomcats确定了开关,以前的主动节点会钝化。