CAP定理定义
CAP定理,指出对于一个分布式系统来说,不可能同时满足三点:Consistency,Availability,Partition tolerance
- 一致性Consistency:这里的一致性指的是强一致性,所有节点访问同一份最新的数据副本。还有另一种一致性是用户一致性,不同的存储设备里面的副本的数据可能是不一样的,但是当终端的用户访问的时候,通过一些纠正错误的方法,保证能返回一个一致的正确数据给用户。
- 可用性Availability:服务一直可以使用,每一次请求都能在正常的时间内得到响应。通常会把一份数据做多个数据备份,存到不同的存储设备上,如果一个存储设备坏了,就快速切换到另一个存储设备上,这个切换时间要足够短,保证用户几乎感受不到。
- 分区容错性Partition tolerance:即使分布式系统某个节点或者某个网络分区出现故障,系统仍然可以对外提供服务,而且这个服务是满足一致性和可用性的。
CAP的取舍
一致性、可用性根据可以从0%到100%分为多种程度,并不是只有0%和100%两种状态。比如数据的一致性可以分为:强一致性,弱一致性,读写一致性,最终一致性。
由于大规模分布式的时候,网络分区是一个现实,必须保证分区容错性,在强一致性和极端的可用性二者之间做平衡。
有些系统对数据的强一致性有很大的需求,通常会有限实现CP,牺牲一点可用性Availability,当出现网络有些故障或者有些消息丢失的时候,就会暂时让服务不可用,等到数据全部一致了,在让系统可用,允许用户访问。比如Redis、HBASE这样的分布式数据库就会再用这种方案,因为数据一致性是存储系统的最基本的要求。zookeeper也采用的是有限保证CP。
更多的系统难以满足数据的强一致性,这样成本太高,可能也没余必要。很多大型的网站会选择较高的可用性和分区容错性CP,放弃强一致性,会采用用户一致性方案,保证最终用户访问的数据是正确的就可以了。
Paxos协议
paxos协议是在保证强一致性的前提下,对可用性进行优化的算法。
ZAB协议
Zookeeper的核心算法是ZAB协议,他对Paxos进行了简化,提供全局的时间顺序上的保证,使他能满足工业应用的要求。
Paxos用在分布式系统中有一些问题,例如
- 在多个Proposer的场景下,Paxos协议不能保证先提交的提案首先被接受,提案之间的顺序可能是乱的
ZAB协议通过添加约束来解决问题:所有的提案转发到同一个leader提交,由leader来保证提案之间的先后顺序,也避免了多个多分Proposer引发活锁问题。
参考文献
Hollis网站的文章:分布式系统的CAP理论
掘金网站的文章:分布式系统的经典基础理论