2012-08-22 43 views
2

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

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

回答

2

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

许多负载均衡器都提供这种故障转移行为 - 我过去一直在做HAProxy,但我确信这不是唯一能够完成这项工作的实现。


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

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

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

+0

嗨Doyle,谢谢你的回复。由于我们在应用程序中有一些状态,所以当我们将新请求重定向到新服务器时,我们无法获得此请求的先前状态(此新请求可能是对前一请求的后续请求)。你知道解决这个问题的好方法吗?实际上,我认为我需要的是比普通的流氓更简单。我需要的是:当我告诉第一台服务器关闭时,我希望它顺利地将其当前的工作移动到另一台服务器,并且发送到第一台服务器的请求将被转发到这台新服务器。 – Mike

+2

这并不简单,而是更复杂。如果状态驻留在某个中央数据库上,那么您可以在新服务器上选择它(假设您拥有全局密钥,如用户名,而不仅仅是特定于服务器的会话ID)。如果状态只存在于旧服务器的内存中,那么你几乎已经被洗净了。通常情况下,第一台服务器会崩溃*,而不是关闭?如果您希望进行故障转移,则您**具有全局(即非本地)一致状态存储。在通常情况下,当第一台服务器崩溃时,可以使用 –

+0

。我们不会为一些客户提供服务。目前我们不关心这一点。你知道Hazelcast吗,看起来它是用来处理分布式系统的。不知道它是否符合我的需求。 – Mike