--- title: CAP 和 BASE date: 2021-11-08 08:15:33 categories: - 分布式 - 分布式综合 tags: - 分布式 - 一致性 - ACID - CAP - BASE permalink: /pages/f718828e/ --- # CAP 和 BASE ## 一致性 一致性(Consistency)指的是**多个数据副本是否能保持一致**的特性。 在一致性的条件下,分布式系统在执行写操作成功后,如果所有用户都能够读取到最新的值,该系统就被认为具有强一致性。 数据一致性又可以分为以下几点: - **强一致性** - 数据更新操作结果和操作响应总是一致的,即操作响应通知更新失败,那么数据一定没有被更新,而不是处于不确定状态。 - **弱一致性** - 系统在写入数据成功后,不承诺立即能读到最新的值,也不承诺什么时候能读到,但是过一段时间之后用户可以看到更新后的值。那么用户读不到最新数据的这段时间被称为“不一致窗口时间”。 - **最终一致性** - 最终一致性作为弱一致性中的特例,强调的是所有数据副本,在经过一段时间的同步后,最终能够到达一致的状态,不需要实时保证系统数据的强一致性。 ## ACID ACID 是数据库事务正确执行的四个基本要素的单词缩写: - **原子性(Atomicity)** - 原子是指不可分解为更小粒度的东西。事务的原子性意味着:**事务中的所有操作要么全部成功,要么全部失败**。 - 回滚可以用日志来实现,日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。 - **一致性(Consistency)** - 数据库在事务执行前后都保持一致性状态。 - 在一致性状态下,所有事务对一个数据的读取结果都是相同的。 - **隔离性(Isolation)** - 同时运行的事务互不干扰。换句话说,一个事务所做的修改在最终提交以前,对其它事务是不可见的。 - **持久性(Durability)** - 一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。 - 可以通过数据库备份和恢复来实现,在系统发生奔溃时,使用备份的数据库进行数据恢复。 一个支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性。 - 只有满足一致性,事务的执行结果才是正确的。 - 在无并发的情况下,事务串行执行,隔离性一定能够满足。此时只要能满足原子性,就一定能满足一致性。 - 在并发的情况下,多个事务并行执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。 - 事务满足持久化是为了能应对系统崩溃的情况。 ## CAP 定理 ### CAP 简介 1998 年,Brewer 提出了分布式系统领域大名鼎鼎的 CAP 定理。 CAP 定理提出:分布式系统有三个指标,这三个指标不能同时做到: - **一致性(Consistency)** - 在任何给定时间,网络中的所有节点都具有完全相同(最近)的值。 - **可用性(Availability)** - 对网络的每个请求都会返回响应,但不能保证返回的数据是最新的。 - **分区容错性(Partition Tolerance)** - 即使任意数量的节点出现故障,网络仍会继续运行。 CAP 就是取 Consistency、Availability、Partition Tolerance 的首字母而命名。 ![](https://raw.githubusercontent.com/dunwu/images/master/snap/202405160639643.png) 在分布式系统中,分区容错性是一个既定的事实:因为分布式系统总会出现各种各样的问题,如由于网络原因而导致节点失联;发生机器故障;机器重启或升级等等。因此,**CAP 定理实际上是要在可用性(A)和一致性(C)之间做权衡**。 ### AP 模式 对网络的每个请求都会收到响应,即使由于网络分区(故障节点)而无法保证数据一定是最新的。 选择 **AP 模式**,偏向于保证服务的高可用性。用户访问系统的时候,都能得到响应数据,不会出现响应错误;但是,当出现分区故障时,相同的读操作,访问不同的节点,得到响应数据可能不一样。 ### CP 模式 如果由于网络分区(故障节点)而无法保证特定信息是最新的,则系统将返回错误或超时。 选择 **CP 模式**,一旦因为消息丢失、延迟过高发生了网络分区,就会影响用户的体验和业务的可用性。因为为了防止数据不一致,系统将拒绝新数据的写入。 ### CAP 定理的应用 CAP 定理在分布式系统设计中,可以被应用与哪些方面? 一个最具代表性的问题是:服务注册中心应该选择 AP 还是 CP? 在微服务架构下,服务注册和服务发现机制中主要有三种角色: - **服务提供者**(RPC Server / Provider) - **服务消费者**(RPC Client / Consumer) - **服务注册中心**(Registry) **注册中心**负责协调服务注册和服务发现,显然它是核心中的核心。主流的注册中心有很多,如:ZooKeeper、Nacos、Eureka、Consul、etcd 等。在针对注册中心进行技术选型时,其 CAP 设计也是一个比较的维度。 - CP 模型代表:ZooKeeper、etcd。系统强调数据的一致性,当数据一致性无法保证时(如:正在选举主节点),系统拒绝请求。 - AP 模型代表:Nacos、Eureka。系统强调可用性,牺牲一定的一致性(即服务节点上的数据不保证是最新的),来保证整体服务可用。 对于服务注册中心而言,即使不同节点保存的服务注册信息存在差异,也不会造成灾难性的后果,仅仅是信息滞后而已。但是,如果为了追求数据一致性,使得服务发现短时间内不可用,负面影响更严重。所以,对于服务注册中心而言,可用性比一致性更重要,一般应该选择 AP 模型。 ### CAP 定理的误导 CAP 定理在分布式系统领域大名鼎鼎,以至于被很多人视为了真理。然而,CAP 定理真的正确吗? 网络分区是一种故障,不管喜欢还是不喜欢,它都可能发生,所以无法选择或逃避分区的问题。在网络正常的时候,系统可以同时保证一致性(线性化)和可用性。而一旦发生了网络故障,必须要么选择一致性,要么选择可用性。因此,对 CAP 更准确的理解应该是:**当发生网络分区(P)的情况下,可用性(A)和一致性(C)二者只能选其一**。 CAP 定理所描述的模型实际上局限性很大,它只考虑了一种一致性模型和一种故障(网络分区故障),而没有考虑网络延迟、节点失效等情况。因此,它对于指导一个具体的分布式系统设计来说,没有太大的实际价值。 值得一提的是,在 CAP 定理提出十二年之后,其提出者也发表了一篇文章 [**CAP Twelve Years Later: How the “Rules” Have Changed**](https://www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed/),来阐述 CAP 定理的局限性。 ## BASE 定理 BASE 是 **`基本可用(Basically Available)`**、**`软状态(Soft State)`** 和 **`最终一致性(Eventually Consistent)`** 三个短语的缩写。BASE 定理是对 CAP 定理中可用性(A)和一致性(C)权衡的结果。 BASE 定理的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。 - **基本可用(Basically Available)** - 分布式系统在出现故障的时候,**保证核心可用,允许损失部分可用性**。例如,电商在做促销时,为了保证购物系统的稳定性,部分消费者可能会被引导到一个降级的页面。 - **软状态(Soft State)** - 指允许系统中的数据存在中间状态,并认为该中间状态不会影响系统整体可用性,即**允许系统不同节点的数据副本之间进行同步的过程存在延时**。 - **最终一致性(Eventually Consistent)** - 强调的是所有数据副本,**在经过一段时间的同步后,最终能够到达一致的状态**,不需要实时保证系统数据的强一致性。 ## BASE vs. ACID BASE 定理的**核心思想**是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。 ACID 要求强一致性,通常运用在传统的数据库系统上。而 BASE 要求最终一致性,通过**牺牲强一致性来达到可用性**,通常运用在大型分布式系统中。 在实际的分布式场景中,不同业务单元和组件对一致性的要求是不同的,因此 ACID 和 BASE 往往会结合在一起使用。 ## 参考资料 - [**Brewer’s Conjecture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services**](https://www.comp.nus.edu.sg/~gilbert/pubs/BrewersConjecture-SigAct.pdf),[**解读**](https://juejin.cn/post/6844903936718012430) - 经典的 CAP 定理,即:在一个分布式系统中,当发生网络分区时,那么强一致性和可用性只能二选一。 - [**CAP Twelve Years Later: How the “Rules” Have Changed**](https://www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed/), [**解读**](https://www.zhihu.com/question/64778723/answer/224266038) - CAP 定理的新解读,并阐述 CAP 定理的一些常见误区。 - [**BASE: An Acid Alternative**](https://www.semanticscholar.org/paper/BASE%3A-An-Acid-Alternative-Pritchett/2e72e6c022dd33115304ecfcb6dad7ea609534a4),[**译文**](https://www.cnblogs.com/savorboard/p/base-an-acid-alternative.html) - BASE 定理是对 CAP 中一致性和可用性的权衡,提出采用适当的方式来使系统达到最终一致性。