mongodb在CAP定理中处于什么位置?
无论我在哪里看到MongoDB都是CP。 但当我深入研究时,我发现它最终是一致的。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是强一致的-如果先写后读,假设写操作成功,您将始终能够读取刚才读取的写操作的结果。这是因
使用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做的很棒的实验。它真的在追捕蒙戈。例如,我想知道是否有生产系统