>一致性
>可获得性
>分区容差
sql Server是一个AC系统,MongoDB是一个CP系统。
这些定义来自于UC Berkley professor Eric Brewer,and his talk at PODC 2000(分布式计算原理):
Availability
Availability means just that – the service is available
(to operate fully or not as above). When you buy the book you want to
get a response,not some browser message about the web site being
uncommunicative. Gilbert & Lynch in their proof of CAP Theorem make
the good point that availability most often deserts you when you need
it most – sites tend to go down at busy periods precisely because they
are busy. A service that’s available but not being accessed is of no
benefit to anyone.
在MongoDB或BigTable的上下文中,系统是不是“可用”是什么意思?
你是否连接(例如通过TCP / IP),服务器不响应?您是否尝试执行查询,但是查询从不返回 – 或返回错误?
什么意思不可用?
假设在假设的分布式系统中有3个节点A,B和C。 A,B和C各自运行在自己的服务器机架中,它们之间有两个交换机:
[Node A] <- Switch #1 -> [Node B] <- Switch #2 -> [ Node C ]
现在假设所述系统被设置为使得保证在被认为被提交之前任何写入将到达至少2个节点。现在,假设开关#2被拔出,有些客户端连接到节点C:
[Node A] <- Switch #1 -> [Node B] [ Node C ] <-- Some client
由于分布式系统当前处于分区状态(即,节点C无法联系足够的其他节点以保证所需的2节点一致性),该客户端将无法发出一致写入。
我会补充说,一些Nosql数据库允许非常动态地选择CAP属性。例如,Cassandra允许客户端在每次写入之前指定写入必须到达的服务器数量。对单个服务器的写入是“AP”,写入法定(或全部)服务器的写入更多为“CA”。
编辑 – 从以下评论:
在MongoDB中,您只能在副本集中进行主/从配置。这意味着AP与CP的选择是由客户端在查询时进行的。客户端可以指定slaveOk,它将从任意选择的从站(可能有过时的数据)中读取:mongodb.org/display/DOCS/…。如果客户端不稳定的数据,请不要指定slaveOk,查询将转到主服务器。如果客户端无法访问主服务器,那么您将收到错误消息。我不知道这个错误是什么。