CAP定理是分布式领域当中非常著名的定理,也是大家津津乐道的一个分布式定理。有些人这么理解CAP定理:
在分布式系统中,
- C代表一致性
- A代表可用性,
- P代表网络分区。
因为,分布式环境中,P不不可避免的,分布式系统要么选择一致性放弃可用性,要么选择可用性放弃一致性。
另外,很多人也这样一个认识:
Paxos协议(包括与之类似的Zab协议-zookeeper,Raft协议-etcd)是强一致性的,并且能够容忍小于少数节点的宕机(也就是少数节点的出现网络分区)获得高可用。
那么按照以上2种说法,是不是我们可以得出一个结论:Paxos、Zookeeper、etcd违反了CAP定理?
答案是否定的。要说明这个问题,我们就要仔细的说说什么是CAP定理。CAP定理的描述如下:
在一个shared-data的系统中,我们不可能同时获得以下3个特性:
- C:一致性,其实这里的一致性,是指线性一致性。
- A:可用性,是指系统中每一个non-failing的节点都可以在一个合理的时间里成功的完成读写操作。
- P:容忍网络分区。
下面对CAP定理做几点说明。
- 1.因为CAP定理在描述的是一个shared-data的系统,网络分区是必然存在的,系统必须处理网络分区的情况。
- 2.定理中的一致性和可用性都是非常苛刻的条件。线性一致性是非常强的一致性模型,除了线性一致性模型,还有很多比线性一致性弱很多的一致性模型,如果你的系统采用了这样的相对较弱一致性模型,其实已经不是CAP定理的范畴了。你是可以实现出一个具有更弱的一致性模型并且同时满足A和P的系统出来。
(关于什么是线性一致性及其作用可以参考<线性一致性(Linearizability)是并发控制的基础>) - 3.同理,A也是非常苛刻的,他强调了每一个节点都可以完成读写操作。所以Paxos虽然是线性一致性的,但是没满足这么苛刻的A的条件。所以也不适用CAP定理。
其实,CAP只是描述了你不可能实现出一种同时具有完美一致性和完美可用性的shared-data系统出来。这个定理基本上没有太多实用性的。目前已经有很多系统,实现了很好的一致性并且具有很好可用性。我们不能说这些现实的系统违反了CAP定理,而是CAP定理不适用于这些现实的系统。Paxos、Zookeeper、etcd就是这样的一个例子。另外,作为对立面的一个例子,Cassandra具有很好的可用性,并且也具有比线性一致性弱一些的一致性。
(关于Cassandra的一致性可参看<Tunable Consistency不能让Cassandra成为CP系统>,此外<虽然Cassandra不是CP但Cassandra是安全的>这篇文章会告述你虽然Cassandra没有线性一致性,却拥有非常好用的系统)