到处都能看到 MongoDB 是 CP 的。 但是,当我深入了解后发现它实际上是最终一致的。 如果我使用 safe=true,它还是 CP 吗?如果是这样的话,这是否意味着当我使用 safe=true 写入时,所有复制品在获取结果之前都会得到更新?
到处都能看到 MongoDB 是 CP 的。 但是,当我深入了解后发现它实际上是最终一致的。 如果我使用 safe=true,它还是 CP 吗?如果是这样的话,这是否意味着当我使用 safe=true 写入时,所有复制品在获取结果之前都会得到更新?
MongoDB默认具有很强的一致性 - 如果您进行写入,然后进行读取,假设写入成功,则始终可以读取刚刚读取的写入结果。这是因为MongoDB是单主系统,默认情况下所有读取都会转到主服务器。如果您选择启用从节点读取,则MongoDB变为最终一致性,其中可能会读取过时的结果。
通过副本集中的自动故障转移,MongoDB还获得了高可用性: http://www.mongodb.org/display/DOCS/Replica+Sets
当您使用单个连接或正确的写入/读取关注级别(这将导致执行速度降低)时,MongoDB是强一致的。一旦不满足这些条件(特别是在从次要副本读取时),MongoDB就会变成最终一致性。
在出现分区(Partition)时,MongoDB会选择一致性(Consistency)而非可用性(Availability)。这意味着在分区情况下,它会选择保证数据一致性的方式。
为了更好地理解这个问题,让我们先了解 MongoDB 的副本集是如何工作的。一个副本集有一个主节点,提交数据的唯一“安全”方式是写入该节点并等待该数据提交到集合中大多数节点(发送写入请求时可以看到w=majority标志)。
分区可能发生在以下两种情况:
总之,每当出现分区并需要做出决策时,MongoDB会选择一致性优先于可用性。它将停止接受对系统的写入操作,直到它相信它可以安全地完成这些写入操作。
Mongodb从不允许在副本集的secondary节点上进行写操作,但是可以选择性地从secondary节点读取数据,如果你的primary节点出现故障,你就无法进行写操作,直到一个secondary节点成为primary节点。这就是你在CAP定理中牺牲高可用性的方式。通过只从primary节点读取数据,您可以实现强一致性。