0

我有一个分布式系统设计问题。问题简介是

我们有很多客户来服务。该服务需要具有容错性,因此它将具有许多副本。当客户端无法再访问该服务时,它将切换到副本并通知所有其他客户端将切换到同一个副本。(在副本之间进行负载平衡是不可接受的,因为副本的数据值不完全相同,但所有客户端必须始终返回相同的数据值。)

我目前的设计是让客户在未能联系到服务时要求新的服务领导。当建立一个新的服务领导者时,它将通知所有客户端使用它。

与许多分布式协调设计一样,我需要一个分布式组管理器。我正在考虑在解决方案中使用 JGroups 和/或 Apache Zookeeper。

是否有一个或多个我应该寻找的现有食谱来解决这个问题?

4

2 回答 2

1

如果您控制服务,则让服务在它们之间进行领导者选举。客户端将监视选出的领导者的变化,并向当前的服务领导者发送请求。

如果您不控制服务,则让客户端选举一个领导者,该客户端将负责维护 zookeeper 中指向当前领导者服务的节点。所有客户端都将监视该节点,以了解哪个节点是主节点的更改。领导者客户端必须能够以某种方式检查领导者服务的健康状况。

但所有客户端必须始终返回相同的数据值

Zookeeper 或大多数分布式系统都无法做到这一点。服务领导者的变化传播到所有节点需要一些时间(通常只有几毫秒)。

于 2012-07-27T02:48:50.383 回答
0

这对于动物园管理员来说似乎是现成的。您可以让您的客户都在一个公共 znode 上设置监视(其中将包含副本信息)。如果客户端更改了 znode,所有其他客户端将收到有关更改的一次性通知。

看看http://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#ch_zkWatches

于 2012-08-03T19:22:41.873 回答