mongodb在CAP定理中处于什么位置?

mongodb在CAP定理中处于什么位置?,mongodb,cap-theorem,database,nosql,Mongodb,Cap Theorem,Database,Nosql,无论我在哪里看到MongoDB都是CP。 但当我深入研究时,我发现它最终是一致的。 使用safe=true时是否为CP?如果是,这是否意味着当我使用safe=true写入时,所有副本都将在得到结果之前更新?是的,使用safe=true时是CP。这仅仅意味着,数据被传送到主磁盘。 如果要确保数据也到达某个副本,请查看“w=N”参数,其中N是必须保存数据的副本数 有关更多信息,请参阅和。默认情况下,MongoDB是强一致的-如果先写后读,假设写操作成功,您将始终能够读取刚才读取的写操作的结果。这是因

无论我在哪里看到MongoDB都是CP。 但当我深入研究时,我发现它最终是一致的。
使用safe=true时是否为CP?如果是,这是否意味着当我使用safe=true写入时,所有副本都将在得到结果之前更新?

是的,使用
safe=true
时是CP。这仅仅意味着,数据被传送到主磁盘。 如果要确保数据也到达某个副本,请查看“w=N”参数,其中N是必须保存数据的副本数


有关更多信息,请参阅和。

默认情况下,MongoDB是强一致的-如果先写后读,假设写操作成功,您将始终能够读取刚才读取的写操作的结果。这是因为MongoDB是一个单主系统,默认情况下,所有读取都转到主系统。如果您可以选择启用从二级数据库读取,那么MongoDB最终将变得一致,可以读取过期的结果

MongoDB还可以通过副本集中的自动故障切换获得高可用性:

正如在该字段中显示的一样,在将MongoDB和其他数据库标记为C或a时,您应该小心


当然,CAP有助于无需太多语言就可以追踪数据库对它的普遍看法,但人们常常忘记,例如,CAP中的C表示原子一致性(线性化能力)。这让我在尝试分类时很难理解。因此,除了MongoDB具有很强的一致性之外,这并不意味着它是C。这样,如果你进行了这样的分类,我建议你也可以更深入地了解它的实际工作原理,以避免产生疑问。

我不确定Mongo的p。想象一下情况:

  • 您的复制副本被拆分为两个分区
  • 随着新主人的当选,双方都在继续写作
  • 分区已解决-所有服务器现在都已重新连接
  • 所发生的情况是,选择了新的主机—具有最高oplog的主机,但来自另一个主机的数据恢复到分区前的公共状态,并转储到一个文件中进行手动恢复
  • 所有的二年级学生都能赶上新老师
这里的问题是转储文件的大小是有限的,如果您有一个分区很长时间,您可能会永远丢失数据

你可以说,这不太可能发生——是的,除非在云中,它比你想象的更为普遍

这个例子就是为什么我在将任何字母分配到任何数据库之前都会非常小心。有太多的场景和实现并不完美


如果有人知道Mongo的后续版本中是否已经解决了此问题,请发表评论!(我已经有一段时间没有关注所有发生的事情了。)

我同意卢卡斯邮报的观点。您不能仅仅说MongoDB是CP/AP/CA,因为它实际上是C、a和P之间的一种折衷,这取决于数据库/驱动程序配置和灾难类型:下面是一个视觉回顾,下面是更详细的解释

Scenario                   | Main Focus | Description
---------------------------|------------|------------------------------------
No partition               |     CA     | The system is available 
                           |            | and provides strong consistency
---------------------------|------------|------------------------------------
partition,                 |     AP     | Not synchronized writes 
majority connected         |            | from the old primary are ignored                
---------------------------|------------|------------------------------------
partition,                 |     CP     | only read access is provided
majority not connected     |            | to avoid separated and inconsistent systems
一致性:
当您使用单个连接或正确的/()时,MongoDB具有很强的一致性。一旦您不满足这些条件(特别是当您从辅助副本读取数据时),MongoDB最终就会变得一致

可利用性: MongoDB通过网络获得高可用性。一旦主设备停机或不可用,则辅助设备将确定新的主设备重新可用。这样做有一个缺点:由旧主设备执行但未同步到辅助设备的每一次写入,都将在重新连接到集合(旧主设备现在是辅助设备)后立即被删除并保存到回滚文件中。因此,在这种情况下,为了可用性,牺牲了一些一致性

分区公差:
通过使用上述副本集,MongoDB还实现了分区容差:只要副本集的一半以上服务器相互连接。为什么?确保两个分离的网络不能同时选择一个新的主网络。当没有足够的辅助设备相互连接时,您仍然可以读取它们(但无法确保一致性),但不能写入。为了保持一致性,该集合实际上不可用。

Mongodb从不允许写入辅助。它允许从辅助设备进行可选读取,但不允许写入。所以,如果你的主服务器坏了,你就不能写,直到辅助服务器重新成为主服务器。这就是为什么要牺牲CAP定理中的高可用性。通过只从主服务器读取数据,您可以获得很强的一致性。

只要有分区,MongoDB就会选择一致性而不是可用性。这意味着,当存在分区(P)时,它选择一致性(C)而不是可用性(a)

为了理解这一点,让我们来了解MongoDB的副本集是如何工作的。副本集只有一个主节点。提交数据的唯一“安全”方法是写入该节点,然后等待该数据提交到集合中的大多数节点。(在发送写操作时,您将看到w=多数的标志)

分区可以在以下两种情况下发生:

  • 主节点关闭时:系统不可用,直到新节点关闭 选择“主”
  • 当主节点从太多节点断开连接时 辅助节点:系统变得不可用。其他二年级学生将尝试 选择新的主设备,当前主设备将退出

基本上,每当发生分区并且MongoDB需要决定做什么时,它都会选择一致性而不是可用性。它将停止接受对系统的写入,直到它认为它可以安全地完成这些写入。

根据,即使您从副本集中的主节点读取数据,也可能会得到过时或脏数据。MongoDB的强一致性也是如此??Kyle做的很棒的实验。它真的在追捕蒙戈。例如,我想知道是否有生产系统