CAP定理是这样描述的:一个分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中两项。
本文主要从以下几个部分来展开说明:
1、什么是分布式系统以及为什么会受CAP定理限制?
2、什么是CAP?
3、分布式系统为什么最多同时满足CAP定理的其中两项?
一、什么是分布式系统以及为什么会受CAP定理限制?
George Coulouris(《Distributed Systems-Concepts and Design》作者)对分布式系统下了一个简单的定义:你会知道系统当中的某台电脑崩溃或停止运行了,但是你的软件永远不会。这句话非常简单,但也非常形象地说明了分布式系统的特点。
设计分布式系统的目的无非就是为了提升系统处理能力、增强系统稳定性等SLA(服务等级协议)指标,但每个系统的SLA指标可能都不太一样,并且每个指标对应的权重也不一样。比如微博可能更关注系统的可用性,数据只要最终一致即可,而银行系统相比可用性则更关注系统的数据一致性。但是分布式系统还是有以下几个通用的特点:
1、服务冗余。为系统的每种服务都提供若干冗余备份,当正常的服务出现问题时,系统启用冗余备份服务来接管,尽量保证每时每刻所有的请求都能够得到正常的处理。但这同时也带来了冗余服务之间的数据一致性问题。
2、高可扩展性。当系统的请求量或者计算量增加时,系统可以通过动态扩展的方式提高处理能力,以应付高峰期的流量。同样当系统的请求量或计算量减少时,系统可以通过动态减缩的方式减少服务器的运行,降低运行成本。但这也同时带来了当某台服务器down或者网络连接断了的问题。
3、透明性。用户无需关心所用的系统是分布式还是单体的,也不需关心分布式系统是有上千台还是只有几台服务器,更不需关心分布式系统的所有服务器是否都能正常工作。用户唯一关心的是自己的请求能否得到合理的处理。所以上面1、2点带来的问题,必须在分布式系统设计时进行解决,尽量减少对于用户的影响。
根据上面分布式系统的几个通用特点,在设计分布式系统时必须考虑以下三个问题:
1、数据的一致性问题。2、当某些服务不可用时的问题。3、当某些服务器不可通过网络通信时的问题。
上面这三个问题分别对应CAP中的一致性、可用性以及分区容错性,所以分布式系统的设计必须受限于CAP理论。
二、什么是CAP?
C(Consistency):一致性
一致性必然涉及到多个实体,如果只有一个实体就不存在是否一致的说法。比如一个人的队列就不存在整齐一致的说法,只有至少两个人的队列才会被认为是整齐一致或者不一致。
一致性是指系统在存在多个实体的情形下,对于系统内任意对象x,在任意时刻,不管是从实体a、实体b、...还是实体n获取到的数据应该是一致的。这里的一致性其实就是指强一致性。
拿某电商系统中的商品剩余库存举例:某个商品的当前库存是n,当被购买一件后,库存变为了n-1。那该 电商系统的所有用户查询该商品的库存时,如果返回的都是n-1,则说明该电商系统满足一致性。如果有些返回n-1,有些返回n,甚至其它的,则说明该电商系统不满足一致性。
A(Availability):可用性
可用性是指在系统的某些实体失效的前提下,系统还是能正常对外提供服务。当然如果整个系统下的所有实体都失效了,那整个系统也就失效了,系统就不存在可用性的说法了。
比如某电商系统部署了M1和M2服务来负载分担处理用户登陆请求。某个时刻M1服务突然挂了,那系统应该把所有的登陆请求都转发给M2服务来处理,保障所有的用户都能成功登陆。如果M2服务无法处理全部的请求,系统应该立即自动启动M3服务来负载分担,或者采取服务降级以及限流的方式,给用户一个合理的响应信息。
对于许多系统而言,四个9的(即99.99%)可用性都被认为是高可用性。
P(Partition tolerance):分区容错性
分区容错性是指系统的某些实体之间无法沟通时,整个系统会形成几个完全隔离的分区,系统能够容忍这种分区的异常,满足系统的一致性或者可用性,但是在满足分区容错性的前提下,一致性和可用性只能满足其中的一个。
比如某电商系统的下订单子系统和订单处理子系统之间无法通过网络通信了。那现在有两种情况:
第一种:这两个子系统还是正常对外提供服务,这样必然带来订单数据不一致的问题。
第二种:这两个子系统均不对外提供服务,这样必然带来可用性的问题。
三、分布式系统为什么最多满足CAP定理中的两项?
1、满足分区容错性的情况下,是否能同时满足一致性和可用性?
(1)如果要满足可用性,则无法满足一致性,则如下所示(x的值最初为2):
(2)如果要满足一致性,则无法满足可用性,则如下所示(x的值最初为2):
2、满足可用性的情况下,是否能同时满足一致性和分区容错性?
(1)如果要满足一致性,则无法满足分区容错性,则如下所示(x的值最初为2):
(2)如果要满足分区容错性,则无法满足一致性,则如下所示(x的值最初为2):
3、满足一致性的情况下,是否能同时满足可用性和分区容错性?
(1)如果要满足可用性,则无法满足分区容错性,则如下所示(x的值最初为2):
(2)如果要满足分区容错性,则无法满足可用性,则如下所示(x的值最初为2):