为什么生产者应该在分布式消息队列的情况下写入奇数个服务器

时间:2014-02-25 07:47:03

标签: replication message-queue distributed distributed-computing distributed-system

在最近的一次采访中,我被要求设计一个分布式消息队列。我将其建模为一个多分区系统,其中每个分区都有一个副本集,其中包含一个主副本和一个或多个副本,以实现高可用性。来自生产者的写入由主要处理并同步复制,这意味着除非副本集的法定数量已应用,否则不会提交消息。然后,当副本集的主节点消失时,他确定了潜在的可用性问题(这意味着写入该分区的生产者将无法写入,直到为副本集选择新的主节点)并询问有关解决方案的位置生产者将相同的消息写入多个服务器(有利于可用性而不是一致性)。然后他问我,如果客户端写入2台服务器与3台服务器有什么不同,这个问题我没有回答。总的来说,我认为这更像是一个偶数与奇怪的问题,我猜测它与法定人数(即大多数)有关,但未能看出它会如何影响消费者阅读数据。毋庸置疑,这个问题让我失去了工作,直到今天仍然让我感到困惑。我将不胜感激任何解决方案和/或见解和/或建议。

1 个答案:

答案 0 :(得分:0)

好的,这是我从你关于新系统的问题中理解的:

您将不再拥有主副本,因此您不需要选择一个副本,而只需在基于法定数量的系统上工作以获得更高的可用性? - 如果这是正确的,也许这会给你一些关闭:) - 否则随意纠正我。

假设您从多个随机节点读取和写入,并且这些节点不会自行复制数据,解决方案就在于仲裁原则。在简单的情况下,这意味着您需要始终至少从n/2 + 1节点写入和读取。因此,如果您要写入3个节点,则最多可以有5个服务器,而如果您要写入2个节点,则最多只能有3个服务器。

稍微复杂的法定人数基于以下规则:

  • R + W > N
  • W > N / 2
  • (R - 读取法定人数,W - 写法定数,N - 节点数)

这会为您提供更多

的变体
  • 您需要阅读的服务器数量
  • 一般可以拥有多少台服务器

根据我对这个问题的理解,这就是我用来制定答案的内容,我不认为2和3之间的区别与偶数或奇数有关。你认为这是你的面试官正在寻找的答案还是我错过了什么?

<强>更新

要澄清评论中的想法,将接受哪个值。

在我所描述的法定人数中,您会接受最新的价值。可以用简单的逻辑时钟确定。仲裁保证您将检索至少一个包含最新信息的项目。如果您无法读取仲裁时网络分区或失败,您将知道无法保证检索最新值。

另一方面,您建议阅读所有项目并接受最常见的项目。我不确定,仅此一项将保证始终保持最新项目。