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

时间:2012-08-22 09:44:57

标签: java architecture failover

我们在多台计算机上运行一个应用程序(服务器),每个服务器为不同的客户端提供服务。我们要求使应用程序能够进行故障转移。当其中一个应用程序由于某种原因而关闭时,另一个应用程序可以在不丢失任何数据的情况下恢复工作。

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

1 个答案:

答案 0 :(得分:2)

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

许多负载均衡器提供了这种故障转移行为 - 我在过去使用HAProxy完成了这一点,但我确信这不是唯一可以完成此任务的实现。


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

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

很多很多 很多更容易在没有本地状态的情况下进行故障转移,其中所有服务器实际上只是一堆CPU周期,并且您将状态存储在客户端cookie中或者在一些中央数据库上。这样,个别机器可以透明地切换,我鼓励你尽可能地追求这个模型。