【深入 Zookeeper】— CAP 和 BASE 理论
本文是《Paxos到Zookeeper:分布式一致性原理与实践》读书笔记,如有雷同,实属必然。
对于本地事务或者是集中式的事务处理系统,我么可以采用已经被实现很成熟的 ACID 模型来保证数据的严格一致性。随着分布式事务的出现,传统单机事务模型已经无法胜任,我们期望实现一套严格满足 ACID 特性的分布式事务,很可能出现的情况就是在系统的可用性和严格一致性之间出现冲突——因为当我们要求分布式系统具有严格一致性时,很可能就会牺牲掉系统的可用性。因此,在可用性和一致性之间永远无法存在一个两全其美的方案。于是如何构建一个兼顾可用性和一致性的分布式系统成为了工程师探讨的难题,出现了诸如 CAP 和 BASE 这样的分布式系统经典理论。
CAP 定理
CAP 理论:一个分布式系统不可能同时满足一致性(C:Consistency),可用性(A:Availability)和分区容错性(P:Partition tolerance),最多只能同时满足其中的两项。
CAP 定理已经从理论上被证明了可行性,因此,CAP 理论在学术上成为了分布式计算领域的公认定理,并深深的影响了分布式计算的发展。
一致性
在分布式环境中,一致性是指数据在多个副本之间是否能够保持一致的特性。在一致性的需求下,当一个系统在数据一致的状态下执行更新后,应该保证系统的数据仍然处于一致的状态。
一致性还有另一种场景:分布式环境中,一个接口中会调用不同服务写入接口,这时候就需要保证这些接口都调用成功或失败回滚。最典型的例子就是电商网站,下订单,减库存,使用优惠券,如果库存扣减成功,优惠券使用失败,也可以说是没有保证数据一致性。
可用性
可用性是指系统提供的服务必须一致处于可用的状态。对于用户的每一个操作请求总是能够在有限的时间内返回结果。
有限的时间
“有限的时间”是指,对于用户的一个操作请求,系统必须能够在指定时间(即响应时间)内返回处理结果,如果超过了这个时间范围,那么系统就被认为是不可用的。另外,“有限的时间”是一个系统在设计之初就设定好的系统运行指标(比如 SOA 服务中不同客户端的超时时间),通常不同的系统之间会有很大的不同。
返回结果
“返回结果”是可用性的另一个非常重要的指标,它要求系统在完成对用户请求的处理后,返回一个正常的响应结果(成功、失败和超时),而不是一个让用户感到困惑的返回结果。
分区容错性
分区容错性约束了一个分布式系统需要具有如下特性:分布式系统在遇到任何分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性服务,除非是整个网络都发生了故障。
网络分区是指在分布式系统中,不同的节点分布在不同的子网络(机房或异地网络)中,由于一些特殊原因导致这些子网络之间出现不连通的情况,但各个子网络内部网络是正常的,从而导致整个系统的网络环境被切分成若干鼓孤立的区域。需要注意的是,组成一个分布式系统的每个节点的加入与退出都可以看做是一个特殊的网络分区。
以上就是 CAP 理论的简单介绍了,总的来说,一个分布式系统中数据节点越多,分区容错性就越高,但要复制更新的数据就越多,一致性难以保证。为了保证一致性,那同步数据需要的时间就越长,这时候可用性就会降低。
CAP 平衡
另外,需要明确一点,对于一个分布式系统而言,分区容错性可以说是最基本的要求。为什么这么说,其实很简单,因为既然是一个分布式系统,那么分布式系统中组件必然需要被部署到不同的节点,否则也就无所谓分布式系统了,因此必然出现子网络。而对于分布式系统而言,网络问题又是一个必定会出现的异常情况,因此分区容错性也就成为了一个分布式系统必须面对和解决的问题。因此系统架构师往往需要把精力花在如何根据业务特点在一致性和可用性之间寻求平衡。
BASE 理论
BASE 是 Basically Available(基本可用),Soft state(软状态)和 Eventually consistent(最终一致性)三个短语的缩写,由 eBay 架构师提出。BASE 是对 CAP 一致性和可用性权衡的结果,其核心思想是即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。
基本可用
基本可用是指分布式系统在出现不可预知故障的时候,允许出现部分可用性。但这绝不等价于系统不可用。下面是两个“基本可用”的典型例子。
- 响应时间上的损失:正常情况下,一个在线搜索引擎要在 0.5 秒之内返回给用户结果,但由于出现故障(比如系统部分机房发生断点或网络故障),查询结果的响应时间增加到了 2 秒。
- 功能上的损失:正常情况下,在一个电子商务网站上进行购物,消费者几乎能都顺利的完成每一笔订单,但是在一些节日大促购物高峰的时候,由于消费者的购物行为激增,为了保护购物系统的稳定性,部分消费者可能会引导到一个降级页面。
弱状态
若状态也成为软状态,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不影响系统的整体可用性,即允许系统在不同的节点的数据副本之间进行数据同步的过程存在延时。
最终一致性
最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一直的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的一致性。
总结
总的来说,BASE 理论面向的是大型高可用可扩展的分布式系统,和传统事务的 ACID 特性是相反的,它完全不同于 ACID 的强一致性模型,而是提出通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。但同时,在实际的分布式场景中,不同业务单元和组件对数据的一致性的要求是不同的,因此在具体的分布式系统架构设计过程中,ACID 特性和 BASE 理论往往又会结合在一起使用。