分布式系统的三大指标——CAP

Scroll Down

来源:NanCheung`s Blog
链接:https://blog.nancheung.com /archives/900360
商业转载请联系作者获得授权,非商业转载请注明出处。



CAP 定理(CAP theorem)是分布式系统(distributed system)领域非常著名的一个定理。

分布式系统正变得越来越重要,大型网站几乎都是分布式的。

分布式系统的最大难点,就是各个节点的状态如何同步。CAP 定理是这方面的基本定理,也是理解分布式系统的起点。

一、CAP定理的起源

这个定理起源于加州大学柏克莱分校(University of California, Berkeley)的计算机科学家埃里克·布鲁尔在2000年的分布式计算原理研讨会(PODC)上提出的一个猜想。

在2002年,麻省理工学院(MIT)的赛斯·吉尔伯特和南希·林奇发表了布鲁尔猜想的证明,使之成为一个定理。吉尔伯特和林奇证明的CAP定理比布鲁尔设想的某种程度上更加狭义。定理讨论了在两个互相矛盾的请求到达彼此连接不通的两个不同的分布式节点的时候的处理方案。

二、CAP定理——分布式系统的三大指标

在理论计算机科学中,CAP定理,又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistency) (等同于所有节点访问同一份最新的数据副本)
  • 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
  • 分区容错性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。)

根据定理,分布式系统只能满足三项中的两项而不可能满足全部三项

1. 一致性(Consistency)

一致性意思是,写操作之后的读操作,必须返回该值。

当某个副本修改了一个值,那么所有副本的这个值都需要同步。

所有分布式副本的数据,应当保持一致

2. 可用性(Availability)

只要收到用户的请求,服务器就必须给出回应。

不管是哪台服务器,只要收到请求,就必须告诉用户,否则就不满足可用性。

3. 分区容错性(Partition tolerance)

网络通信可能失败。系统设计的时候,必须考虑到这种情况。

一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。CAP 定理告诉我们,剩下的 C 和 A 无法同时做到

4. 一致性 和 可用性 的矛盾

一致性和可用性,为什么不可能同时成立?答案很简单,因为可能通信失败(即出现分区容错)。

如果保证 G2 的一致性,那么 G1 必须在写操作时,锁定 G2 的读操作和写操作。只有数据同步后,才能重新开放读写。锁定期间,G2 不能读写,没有可用性。

如果保证 G2 的可用性,那么势必不能锁定 G2,所以一致性不成立。

综上所述,G2 无法同时做到一致性和可用性。系统设计时只能选择一个目标。如果追求一致性,那么无法保证所有节点的可用性;如果追求所有节点的可用性,那就没法做到一致性。

理解CAP理论的最简单方式是想象两个节点分处分区两侧。

允许至少一个节点更新状态会导致数据不一致,即丧失了C性质。

如果为了保证数据一致性,将分区一侧的节点设置为不可用,那么又丧失了A性质。

除非两个节点可以互相通信,才能既保证C又保证A,这又会导致丧失P性质。

我们需要思考不满足 P 的分布式系统是否有意义。

分布式系统显然是多台机器通过网络组成的一个系统,分区容错性描述的是在这个网络出现故障的时候,系统依然能够运作,如果不能运作就没法谈可用性了。

所以 P 应该当作分布式系统的一个属性, 在这个前提下讨论 C 和 A。

因此,我们必须考虑极端情况下,C和A的取舍问题。

延申

从cap角度谈eureka和zookeeper的区别