Glu*_*luz 107 database mongodb nosql cap-theorem
无论我到哪里,我都看到MongoDB是CP.但是当我深入挖掘时,我发现它最终是一致的.当你使用safe = true时它是CP吗?如果是这样,这是否意味着当我使用safe = true写入时,所有副本将在获得结果之前更新?
Tim*_*rez 121
这应该有助于回答这个问题,以及其他NoSQL和其他持久性存储系统.

stb*_*ody 92
默认情况下,MongoDB非常一致 - 如果您执行写操作然后执行读操作,假设写入成功,您将始终能够读取刚刚读取的写入结果.这是因为MongoDB是一个单主系统,默认情况下所有读取都转到主系统.如果您可以选择启用从辅助节点读取,那么MongoDB最终会在可以读取过期结果的地方保持一致.
MongoDB还通过副本集中的自动故障转移获得高可用性:http://www.mongodb.org/display/DOCS/Replica+Sets
JoC*_*oCa 27
我同意Luccas的帖子.你不能只说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
Run Code Online (Sandbox Code Playgroud)
当您使用单个连接或正确的写/读关注级别(这将花费您的执行速度)时,MongoDB非常一致.只要您不满足这些条件(特别是当您从辅助副本中读取时),MongoDB就会变得最终一致.
MongoDB通过副本集获得高可用性.一旦主服务器关闭或其他服务器不可用,那么辅助服务器将确定新的主服务器再次可用.这样做有一个缺点:旧的主服务器执行的每个写操作都会被回滚并保存到回滚文件中,只要它重新连接到该服务器(旧的主服务器是辅助服务器)现在).因此,在这种情况下,为了可用性,牺牲了一些一致性.
通过使用所述副本集,MongoDB也实现了分区容错:只要副本集的一半以上的服务器相互连接,就可以选择新的主服务器.为什么?要确保两个独立的网络不能同时选择新的主要网络.如果没有足够的辅助设备彼此连接,您仍然可以从它们读取(但不保证一致性),但不能写入.为了保持一致性,该组几乎不可用.
小智 6
只要存在分区,MongoDB 就会选择一致性而不是可用性。这意味着当存在分区(P)时,它会选择一致性(C)而不是可用性(A)。
为了理解这一点,让我们了解 MongoDB 的副本集是如何工作的。副本集有一个主节点。提交数据的唯一“安全”方法是写入该节点,然后等待该数据提交到集合中的大多数节点。(发送写入时您将看到 w=majority 的标志)
分区可能发生在以下两种情况:
基本上,每当发生分区并且 MongoDB 需要决定做什么时,它都会选择一致性而不是可用性。它将停止接受对系统的写入,直到它相信它可以安全地完成这些写入。