分布式系统的基本问题:可用性与一致性(CAP)

分布式系统的基本问题:可用性与一致性


背景

可用性(Availability)和一致性(Consistency)是分布式系统的基本问题,先有著名的CAP理论定义过分布式环境下二者不可兼得的 关系,又有神秘的Paxos协议号称是史上最简单的分布式系统一致性算法并获得图灵奖,再有开源产品ZooKeeper实现的ZAB协议号称超越 Paxos,它们之间究竟有什么联系?在网络上没有文章将其清楚地阐述过,于是想到把自己对CAP理论、Paxos协议以及ZAB协议的理解整理成短文, 但我唯一不保证的是正确性,各位看官看着办。



分布式系统的挑战

一致性可理解为所有节点都能访问到最新版本的数据,这在单机场景下非常容易实现,使用共享内存和锁即可解决,但数据存储在单机会有两个限制:1)单机不可用系统整体将不可用(这就是可用性)2)系统吞吐量受限于单机的计算能力。消除这两个限制的方法是用多机来存储数据的多个副本,负责更新的客户端会同时更新数据的多个副 本,于是问题就来了,多机之间的网络可能无法连接,当负责更新的客户端无法同时到连接多个机器时,如何能保证所有客户端都能读到最新版本的数据?

如下图1中所示,Client A负责更新数据,为了保证Server 1和Server 2上的数据是一致的,Client A会将X=1的写操作同时发给Server 1和Server 2,但是当Client A和Server 2之间发生网络分区(网络无法连接)时,此时如果让write X=1的写操作在Server 1上成功,那Client B和Client C将从Server 1和Server 2上读取到不一致的X值;此时如果要保持X值的一致性,那么write X=1的写操作在Server 1和Server 2上都必须失败,这就是著名的CAP理论:在容忍网络分区的前提下,要么牺牲数据的一致性,要么牺牲写操作的可用性。


图1:CAP理论示意图


解决这个问题你可能会想到让Client C同时读取Server 1和Server 2上的X值和版本信息,然后取Server 1和Server 2最新版本的X值, 如下图2所示。但Client C和Server 1之间也可能发生网络分区,这本质上是牺牲读可用性换取写可用性,并没有突破CAP理论。



 图2:对图1中可用性的优化

CAP理论

CAP理论由加州大学伯克利分校的计算机教授Eric Brewer在2000年提出,其核心思想是任何基于网络的数据共享系统最多只能满足数据一致性(Consistency)、可用性 (Availability)和网络分区容忍(Partition Tolerance)三个特性中的两个,三个特性的定义如下:

   数据一致性:等同于所有节点拥有数据的最新版本

   可用性:数据具备高可用性

   分区容忍:容忍网络出现分区,分区之间网络不可达,下面是知乎一个答主关于P的解释

一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。

当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。

提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里。容忍性就提高了。

然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。要保证一致,每次写操作就都要等待全部节点写成功,而这等待又会带来可用性的问题。

总的来说就是,数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。

作者:邬江
链接:https://www.zhihu.com/question/54105974/answer/139037688
来源:知乎


在大规模的分布式环境下,网络分区是必须容忍的现实,于是只能在可用性和一致性两者间做出选择,CAP理论似乎给分布式系统定义了一个悲观的结局,一时间 大家都按照CAP理论在对热门的分布式系统进行判定,譬如认为HBase是一个CP系统,Cassandra是AP系统,我个人认为这是不严谨的,理由是 CAP理论是对分布式系统中一个数据无法同时达到可用性和一致性的断言,而一个系统中往往存在很多类型的数据,部分数据(譬如银行账户中的余额)是需要强 一致性的,而另外一部分数据(譬如银行的总客户数)并不要求强一致性,所以拿CAP理论来划分整个系统是不严谨的, CAP理论带来的价值是指引我们在设计分布式系统时需要区分各种数据的特点,并仔细考虑在小概率的网络分区发生时究竟为该数据选择可用性还是一致性。

对CAP理论的另外一种误读是系统设计时选择其一而完全不去优化另外一项,可用性和一致性的取值范围并不是只有0和1,可用性的值域可以定义成0到 100%的连续区间,而一致性也可分为强一致性、弱一致性、读写一致性、最终一致性等多个不同的强弱等级,细想下去CAP理论定义的其实是在容忍网络分区 的条件下,“强一致性”和“极致可用性”无法同时达到。(注:这里用“极致可用性”而不用“100%可用性”是因为即使不考虑一致性,多台server组 成的分布式系统也达不到100%的可用性,如果单个server的可用性是P,那n台server的极致可用性是,公式的意思是只要任何一台或多台server可用就认为系统都是可用的)

虽然无法达到同时达到强一致性和极致可用性,但我们可以根据数据类型在二者中选择其一后去优化另外一个,Paxos协议就是一种在保证强一致性前提下把可用性优化到极限的算法。

猜你喜欢

转载自blog.csdn.net/AAA821/article/details/80081531
今日推荐