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