java - 如何实现应用程序故障转移?

标签 java architecture failover

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

如有任何建议、 Material ,我们将不胜感激。

最佳答案

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

许多负载均衡器都提供这种故障转移行为 - 我过去曾使用 HAProxy 完成过此操作。但我确信这不是唯一可以完成这项工作的实现。


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

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

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

关于java - 如何实现应用程序故障转移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12070413/

相关文章:

oop - 这是一个好的 OO 设计吗?

java - 如何在 SQL Server 中的 failoverPartner 服务器的 JDBC 连接 URL 中指定端口

azure - Windows Azure 托管服务的默认行为是什么?

java - 在docx4j-Java中设置A5页面大小

java - Android Google Play 位置服务在离开应用程序后继续

java - 是否可以记录 jvm 的调用方式(包括所有 -D -Xmx 等)

android - 什么样的架构最适合通信设备?

php - Laravel - 你在哪里存储自己的界面?

Java:从字符串加载类

erlang - 关于如何处理 ejabberd 集群中的故障转移有什么建议吗?