在阅读内森·赫斯特的Visual Guide to NoSQL Systems篇文章时,他包括了CAP个三角形:

  • C一致性
  • A有效性
  • P分割公差

在此处输入图像描述

SQL Server是AC系统,MongoDB是CP系统.

这些定义来自UC Berkley professor Eric Brewer, and his talk at PODC 2000(分布式计算原理):

Availability

可用性意味着服务可用

在MongoDB或BigTable环境下,系统不"可用"意味着什么?

您是否要连接(例如通过TCP/IP),而服务器没有响应?您是否try 执行一个查询,但该查询从未返回——或返回一个错误?

什么是不可用的?

推荐答案

在这种情况下,可用性意味着in the event of a network partition,客户机连接到的服务器可能无法保证客户机期望(或系统配置为提供)的一致性级别.

假设在一个假设的分布式系统中有3个 node ,A、B和C.A、 B、B和C分别运行在各自的服务器Rack 中,它们之间有两个交换机:

[Node A] <- Switch #1 -> [Node B] <- Switch #2 -> [ Node C ]

现在假设所述系统已设置,以确保任何写入操作在被视为提交之前至少会到达2个 node .现在,假设交换机#2被拔掉,一些客户机连接到 node C:

[Node A] <- Switch #1 -> [Node B]                 [ Node C ] <-- Some client

该客户端将无法发出一致写入,因为分布式系统当前处于分区状态(即, node C无法联系足够多的其他 node 以保证所需的2 node 一致性).

我想补充一点,一些NoSQL数据库允许非常动态地 Select CAP属性.例如,Cassandra允许客户机指定每次写操作提交之前必须进入的服务器数量.到单个服务器的写操作是"AP",到仲裁(或所有)服务器的写操作更像是"CA".

编辑-来自以下 comments :

在MongoDB中,只能在副本集中进行主/从配置.这意味着,AP与CP的 Select 由客户端在查询时进行.客户机可以指定slaveOk,它将从任意 Select 的从机(可能有过时的数据)读取:mongodb.org/display/DOCS/….如果客户端对陈旧数据不满意,请不要指定slaveOk,查询将转到master.如果客户机无法联系到主机,则会出现错误.我不确定那个错误到底是什么.

Mongodb相关问答推荐

使用查询参数过滤MongoDB Go驱动程序时出现问题

用其他集合中的文档替换嵌套文档数组中的值

无法从我的NextJS 14应用程序中的Redux工具包2.0中提取数据

如何获取键值对的对象,其中值仅具有 mongoDB 中的投影字段

Mongo 将一个数组链接到另一个数组

为什么使用 Golang Mongo 驱动程序进行简单查询需要超过 2 秒?

如何 db.getUser() 使用 go mongo-driver

我可以在 MongoDB 中将字段值设置为对象键吗?

Mongoose $push 不断添加两个条目

Springboot 使用 find*() 查询时出现 Mongodb 错误

Mongodb 约定包

适用于 Windows 10 64 位的 MongoDB 下载

带有 jQ​​uery Ajax/JSON 前端的 MongoDB 或 CouchDB 中间件

Spring Data MongoDB 中的独特之处

docker 在不同的端口上运行 mongo 映像

mongo dbname --eval 'db.collection.find()' 不起作用

Mongoose:Model.create 和 Collection.insert 有什么区别

使用命令行从 MongoDB 数据库中的所有集合中删除所有索引

Hadoop Map/Reduce 与内置 Map/Reduce

有没有办法防止 MongoDB 向集合名称添加复数形式?