Java 如何实现应用程序故障切换?

Java 如何实现应用程序故障切换?,java,architecture,failover,Java,Architecture,Failover,我们有一个应用程序(服务器)在多台机器上运行,每台服务器为不同的客户机服务。我们需要使应用程序能够进行故障切换。当其中一个应用程序由于某种原因停机时,另一个可以在不丢失任何数据的情况下继续工作 任何建议、材料都将不胜感激。听起来最适合这样做的地方应该是网络层面。让客户端连接到位于实际应用服务器前面的某种负载平衡代理,并相应地引导流量。此负载平衡器通常会根据您的问题将客户端发送到不同的服务器,但当它检测到服务器没有响应时,它会将故障服务器列入黑名单,并将客户端重定向到其他活动服务器 许多负载平衡器

我们有一个应用程序(服务器)在多台机器上运行,每台服务器为不同的客户机服务。我们需要使应用程序能够进行故障切换。当其中一个应用程序由于某种原因停机时,另一个可以在不丢失任何数据的情况下继续工作


任何建议、材料都将不胜感激。

听起来最适合这样做的地方应该是网络层面。让客户端连接到位于实际应用服务器前面的某种负载平衡代理,并相应地引导流量。此负载平衡器通常会根据您的问题将客户端发送到不同的服务器,但当它检测到服务器没有响应时,它会将故障服务器列入黑名单,并将客户端重定向到其他活动服务器

许多负载平衡器都提供这种故障切换行为——我在过去使用过,但我确信这不是唯一一种可以完成这项工作的实现


就服务器之间的交换状态而言,这是非常困难的。当且仅当所有服务器都相同/可替换时,可以在网络级别(如上所述)以简单的方式处理故障切换。一旦开始具有特定于服务器的状态,就不可能再将服务器B放入以替换服务器A,因为A和B是不同的

如果需要处理这个问题,您需要编写某种逻辑,让服务器B注意到服务器A已关闭,然后以某种方式修复A的状态并将其合并到自己的状态。希望这可以在没有冲突的情况下完成,但这不能保证-服务器在以前的B客户机上看起来/行为像B,在以前的A客户机上看起来/行为像A,这实际上可能是不可能的。如果A没有完全关闭,状态数据可能已损坏/过期。(与此同时,B必须停止服务器C或D执行相同的恢复,并且必须确保负载平衡器知道它是新的A。)


在没有本地状态的情况下进行故障切换要容易得多,因为所有服务器实际上只是一堆CPU周期,而您将状态存储在客户端cookie或某个中央数据库中。通过这种方式,可以透明地切换各个机器的输入和输出,如果可能的话,我鼓励您采用这种模式。

嗨,多伊尔,谢谢您的回复。因为我们在应用程序中有一些状态,所以当我们将新请求重定向到新服务器时,我们无法获取此请求的前一个状态(此新请求可能是前一个请求的后续请求)。你知道解决这个问题的好方法吗?事实上,我觉得我需要的比普通的东西简单。我需要的是:当我告诉第一台服务器关闭时,我希望它能够顺利地将当前的工作转移到另一台服务器,发送到第一台服务器的请求将被转发到这个新服务器。这并不简单,要复杂得多。如果状态驻留在某个中央数据库上,那么您可以在新服务器上获取它(假设您拥有全局密钥,例如用户名,而不仅仅是特定于服务器的会话ID)。如果该状态只存在于旧服务器的内存中,那么您就几乎被套住了。在第一台服务器崩溃而不是关闭的通常情况下会发生什么?如果要进行故障切换,则必须具有全局(即非本地)一致状态存储。通常情况下,当第一台服务器崩溃时。我们不会为一些客户提供服务。目前我们不关心这个。你知道Hazelcast吗?它似乎是用来处理分布式系统的。不确定它是否满足我的需要。我不熟悉Hazelcast-听起来它可能会满足您的需要,因为它“随着新服务器的添加而动态扩展”,但您必须检查它的工作情况(即,随着服务器的消失而动态缩小)。