分布式系统领域CAP理论阐述,一个分布式系统无法同时满足一致性[Consistency],可用性[Availability],分区容错性[Partition tolerance]。最多只能满足三个中的两个。

C-Consistency: 一致性指all nodes see the same data at the same time,即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致。类似ACID中的一致性,CAP中的一致性也是强一致性。在分布式系统中,强一致性是指,一旦一个节点中的一个数据被修改了,那么分布式系统中所有含有这个数据的其他节点都要进行一致性操作,以保证这个数据在任何一个节点中的值都是一致的。

A-Availability: 可用性指Reads and writes always succeed,即服务一直可用,而且是正常响应时间。也就是说在任何情况下,整个分布式系统都是可用的。比如,即便系统中一个或几个节点宕机或无法访问,系统处理用户访问能力不能被破坏,即其可用节点可以进行读写工作工作。对于用户来讲,系统使用体验应该是一直很好的,即读写功能一直可用,后台节点情况对用户不可见。

P-Partition tolerance: 分区容错性指the system continues to operate despite arbitrary message loss or failure of part of the system,即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。这个特性算是对前两个特性的进行的补充,

此理论于2000年被提出,2002年被证明,随即被认为是分布式系统的经典理论,并随之发展出了很多研究工作。

证明过程

CAP-1

如上图,是证明CAP的基本场景,网络中有两个节点N1和N2,可以简单的理解N1和N2分别是两台计算机,他们之间网络可以连通,N1中有一个应用程序A,和一个数据库V,N2也有一个应用程序B2和一个数据库V。现在,A和B是分布式系统的两个部分,V是分布式系统的数据存储的两个子数据库。

在满足一致性的时候,N1和N2中的数据是一样的,V0=V0。在满足可用性的时候,用户不管是请求N1或者N2,都会得到立即响应。在满足分区容错性的情况下,N1和N2有任何一方宕机,或者网络不通的时候,都不会影响N1和N2彼此之间的正常运作。

CAP-2

如上图,是分布式系统正常运转的流程,用户向N1机器请求数据更新,程序A更新数据库Vo为V1,分布式系统将数据进行同步操作M,将V1同步的N2中V0,使得N2中的数据V0也更新为V1,N2中的数据再响应N2的请求。

这里,可以定义N1和N2的数据库V之间的数据是否一样为一致性;外部对N1和N2的请求响应为可用行;N1和N2之间的网络环境为分区容错性。这是正常运作的场景,也是理想的场景,然而现实是残酷的,当错误发生的时候,一致性和可用性还有分区容错性,是否能同时满足,还是说要进行取舍呢?

作为一个分布式系统,它和单机系统的最大区别,就在于网络,现在假设一种极端情况,N1和N2之间的网络断开了,我们要支持这种网络异常,相当于要满足分区容错性,能不能同时满足一致性和响应性呢?还是说要对他们进行取舍。

CAP-3

假设在N1和N2之间网络断开的时候,有用户向N1发送数据更新请求,那N1中的数据V0将被更新为V1,由于网络是断开的,所以分布式系统同步操作M,所以N2中的数据依旧是V0;这个时候,有用户向N2发送数据读取请求,由于数据还没有进行同步,应用程序没办法立即给用户返回最新的数据V1,怎么办呢?有二种选择,第一,牺牲数据一致性,响应旧的数据V0给用户;第二,牺牲可用性,阻塞等待,直到网络连接恢复,数据更新操作M完成之后,再给用户响应最新的数据V1。这个过程,证明了要满足分区容错性的分布式系统,只能在一致性和可用性两者中,选择其中一个。

所以既然无法同时满足三个条件,那么CAP理论自然就产生了三种形式,CA,CP,AP。

  • CA – 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
  • CP – 满足一致性,分区容忍必的系统,通常性能不是特别高。
  • AP – 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
CAP-4

本文参考http://www.hollischuang.com/archives/666