CAP定理又称布鲁尔定理,由加州大学伯克利分校的计算机科学家埃里克布鲁尔于二零零零年在分布式计算原理研讨会上首次提出。当时布鲁尔并没有给出严格的数学证明,而是以猜想的形式抛出了这个后来深刻改变分布式系统设计范式的论断。二零零二年,麻省理工学院的塞思吉尔伯特和南希林奇在异步分布式系统模型中给出了形式化证明,将这一猜想确立为定理,从此CAP定理成为每一位分布式系统从业者和架构科目考生必须掌握的基础理论。
CAP三个字母分别代表了分布式系统中三个核心属性。一致性指的是在一个分布式系统的所有节点上,同一时刻看到的数据完全一致,任何读操作必须返回最近一次写操作的结果,或者说所有节点在执行写操作时的顺序必须全局统一。如果某个客户端向节点A写入了一个新值,另一个客户端立即从节点B读取,在满足一致性的系统中节点B必须返回刚刚写入的新值而非旧值。可用性的定义较为直接:每一个发往分布式系统中非故障节点的请求,必须在有限时间内收到一个非错误的响应,系统必须始终处于可响应状态。分区容错性是指当分布式系统的节点之间的网络通信出现故障即发生网络分区时,系统仍然能够继续提供正常的服务。网络分区在现实中极为常见,交换机故障、网线断开、网络拥塞导致的超时、数据中心之间的光缆中断,都属于分区的具体表现。
CAP定理的核心结论可以概括为一个简洁而有力的陈述:在一个分布式系统中当网络分区发生时,一致性、可用性和分区容错性三者最多只能同时满足其中两个。这句话需要精确理解,它说的是在网络分区已经发生的条件下系统必须在一致性和可用性之间做出选择,而分区容错性本身不是一个可选项,因为网络分区是客观存在的事实无法被消除只能被处理。许多初学者会把定理理解为分布式系统只能从三者中任选其二,这种理解忽略了分区容错性的特殊地位,导致CA系统被当成一种实际可行的架构选择来讨论,这是CAP定理学习中第一个需要纠正的常见误解。
CAP定理中提到的一致性并非一个笼统的概念,分布式系统领域对一致性有极为精细的分层定义。最强的一种一致性称为线性一致性或原子一致性,它要求所有操作看起来都是在一个单一的时间点上原子化执行的,而且每个操作的实际执行时间必须落在它的调用时刻和返回时刻之间的某个时间点。线性一致性给程序员提供了最接近单机编程的心智模型,但实现的代价极为高昂,通常需要借助分布式共识协议来保证操作的全序关系。
顺序一致性比线性一致性稍弱,不要求操作的实际时间顺序与全局真实时间对齐,只要求所有节点看到的操作执行顺序一致且每个节点自身的操作顺序得到保持。因果一致性进一步放松了要求,只规定存在因果关系的操作在所有节点上以相同的顺序被观察到,而并发操作之间没有因果关系的则允许各节点以不同顺序看到。最终一致性是分布式系统中应用最广泛的一致性模型,它只保证如果系统不再接收新的写入,那么经过足够长的时间之后所有节点上的数据最终会收敛到同一个值。DNS域名系统是最终一致性的经典实例,域名记录的变更可能需要几十分钟甚至几十小时才能传播到全球所有DNS缓存服务器,但只要没有新的变更写入最终所有DNS服务器都会返回相同的解析结果。
在CAP定理的语境中,C特指强一致性也就是线性一致性或至少是顺序一致性,绝不是最终一致性。这个区分在考试中经常成为命题的切入点,很多选项把最终一致性当成CAP定理中的C来讨论,如果考生没有区分清楚不同一致性模型的层次差异就很容易掉入命题人预先挖好的陷阱。理解了一致性模型的层次结构之后还需要注意,事务的隔离级别和分布式一致性是两个不同层面的概念,前者属于ACID事务模型的范畴后者属于分布式数据复制模型,二者虽然在语义上有交叉但不能混为一谈。
可用性这一概念表面上看似乎最为简单,但深入分析之后会发现它包含着若干微妙的边界条件。首先可用性要求响应必须在有限时间内返回,这意味着系统不能无限期地等待某个阻塞的操作完成,所有操作都必须有一个明确的时间上限也就是通常所说的超时机制。其次可用性不要求返回的数据一定是最新的,只要返回了一个非错误的值即可,哪怕这个值是过期的旧数据也算满足了可用性的定义。这一点至关重要,因为它暗示了在极端情况下为了保证可用性可以牺牲一致性,这正是AP系统设计的理论根基。
分区容错性在CAP定理中处于一个相当特殊的位置。很多人初学时会追问:能不能设计一个完全没有网络分区的分布式系统从而同时获得一致性和可用性呢?答案是否定的,因为网络分区不是一个设计层面的决定而是物理世界的客观规律。只要网络中存在交换机和路由器等物理设备这些设备就可能出现故障,只要数据包在网络中传输延迟和丢包就永远存在。在一个异步分布式系统模型中节点无法区分另一个节点是发生了故障还是网络产生了延迟,这一核心困难被称为FLP不可能性定理,它从数学上证明了在纯异步模型中不存在确定性的共识算法。认识到分区容错性的客观必然性之后,CAP定理的真正含义就变得清晰了:分布式系统必须在一致性和可用性之间做出取舍,分区容错性是一种必须接受的前提条件而不是一个选项。
在实际工程中选择CP还是AP取决于具体的业务场景。金融交易系统和分布式锁服务等场景对数据一致性要求极高,哪怕短暂的服务不可用也比出现数据不一致要好,这些场景适合选择CP架构。社交媒体动态展示和点击量统计等场景对数据一致性要求相对宽松,用户更在意服务是否随时可用而不是看到了几秒前的旧数据,这些场景适合选择AP架构。值得强调的是这里的CP和AP不是绝对的二元分类而是一个连续的光谱,现代分布式系统往往通过动态调节一致性和可用性的折中程度以适应不同的运行时条件。
在分布式系统的学术讨论中,ACID事务模型和CAP定理通常被对立地放在一起讨论。但CAP定理真正对应的并非ACID而是BASE理论,后者是互联网时代大规模分布式系统在工程实践中总结出来的设计哲学。BASE三个字母分别是基本可用、软状态和最终一致性的英文缩写。基本可用指的是当系统出现故障时允许损失部分可用性但绝不整体不可用,典型的表现形式包括响应时间变长和部分非核心功能被降级。软状态这个概念直接指出了分布式系统中数据状态不需要时刻保持一致,允许存在一个中间的过渡状态,这个过渡状态的持续时间取决于数据同步的延迟和系统的负载情况。最终一致性就是前面讨论过的模型,系统保证在没有新写入的前提下最终所有副本的数据会收敛一致。
BASE理论与ACID的关系不是简单的对立或替代,而是不同场景下不同的取舍策略。传统的关系数据库系统强调ACID特性,通过锁机制和两阶段提交等协议来保证事务的原子性、一致性、隔离性和持久性,这种策略非常适合银行的转账操作和订单的库存扣减这类不容出错的业务。但在用户规模达到数亿级别的互联网服务中严格的事务保证会严重限制系统的横向扩展能力,此时基于BASE理论的柔性事务和最终一致性方案就变得更加务实。电商平台的商品库存显示就是一个经典案例,当某个爆款商品同时被数万用户抢购时系统不可能对每次库存查询都走一遍严格的一致性协议,而是允许显示的库存数量和实际可售数量之间存在短暂的偏差,在订单提交环节再用最终的一致性检查来拦截超卖。
理解CAP定理和BASE理论的关系对于应对架构科目的考试题目有重要的实际意义。命题人有时候会故意混淆ACID和CAP的讨论语境,在题目中把数据库事务的一致性等同于分布式一致性,或者在讨论CAP取舍时突然插入ACID的概念来干扰判断。考生需要在阅读题干的瞬间就识别出题目讨论的是单机事务模型还是分布式数据复制模型,从而选择正确的理论框架来作答。
Paxos算法由莱斯利兰波特于一九九零年提出,但因为其证明过程过于艰涩难懂直到分布式系统大规模普及之后才被业界广泛采用。Paxos算法解决的核心问题是:在一个可能存在节点故障和网络分区的异
本篇完!