2

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

任何建议,材料表示赞赏。

4

1 回答 1

2

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

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


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

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

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

于 2012-08-22T10:14:25.677 回答