在这种情况下,可用性意味着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.如果客户机无法联系到主机,则会出现错误.我不确定那个错误到底是什么.