5

In terms of CAP theorem, MongoDB is usually defined as CP by default. In a replica set scenario, is the following correct? The option w is the write concern:

  • { w: 1 }: wait for a confirm only from the primary. If we read from secondary members, the system is eventually consistent and then AP.
  • { w: 3 }: wait for a confirm from three members. If the replica is made of three members, the system is consistent (strong?) and thus CP.
4

2 回答 2

2

由于有证据(如 K 先生发布的:mongodb 在 CAP 定理中的位置?),我将把这个作为答案,以支持我在删除我对 Asya 的评论之前对该主题的最初关注。

MongoDB 的 CAP 合规性似乎基于什么写关注点放在什么读关注点上。

让我们举个例子。使用从主节点读取的默认配置{w:1}将是:

  • C 因为可以立即读取写入(可能不是因为它不会发送给所有成员,嗯这个是思想家)
  • A 因为它立即可用
  • 但不是 P,因为在单个服务器上,如果立即进行故障转移,则它不是分区容错的

无论写入如何(即使该写入由于分区而丢失),MongoDB 本身都可以很好地容忍分区(只要每侧没有偶数个服务器)。

但是,从具有此写入问题的辅助节点读取实际上会导致 A,因为 MongoDB 现在将最终保持一致,并且您将从成员返回陈旧数据。

对于您的 3 个成员的第二个示例,{w:3}它可能完全是 CAP:

  • C 因为它适用于所有成员
  • A 因为它适用于所有成员
  • P,因为副本集的任何一方都不应该有偶数个成员。与此矛盾的是,如果发生立即故障转移,并且两台服务器位于相反的一侧,在这种情况下 P 会丢失,因为 MongoDB 不确定从哪一侧读取/写入并且需要您的干预,但您可以添加 abitriers 到论坛。CAP 的这一部分在 Wikipedia 上的链接中得到了很好的描述:http: //www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed在标题“为什么”2 下3" 具有误导性"。例外是 MongoDB 选择不松开 C 或 A,而是需要您的干预。

编辑:实际上在这种情况下 CAP 完全丢失,因为 MongoDB 将停止。

再次编辑:Asya 指出 MongoDB 仍然接受读取它只是不会写入,这意味着它保持 C 但丢失 A,这很符合当时的标准。

带着所有阅读的担忧。

所以我回到我最初所说的关于阅读问题和写问题的内容(我真的认为他们都这样做了),这就是我的答案。

于 2013-07-11T14:22:42.970 回答
2

查看Mongodb 复制指南 ,默认情况下,所有查询都转到主服务器。如果您想要“A”,您还需要在辅助服务器上阅读,这是 AP 的必要条件。然后您松开 C,因为结果可能因一台服务器而异。

这个问题也看起来像这样,答案可能会有所帮助。

于 2013-07-11T12:34:54.440 回答