分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)

时间线

事务全局图

分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)_第1张图片

 分布式事务章节

事务:分布式事务与本地事务的区别-CSDN博客

分布式事务:CAP理论详细介绍及发展历史-CSDN博客

分布式事务:2PC与3PC的区别-CSDN博客

分布式事务:X/Open DTP分布式事务处理模型与分布式事务处理XA规范-CSDN博客

分布式事务:2PC,XA协议与Java事务当中JTA,JTS的关系-CSDN博客

简介

BASE理论

1997年,Eric Brewer和他的学生们在ACM上《Cluster-Based Scalable Network Services》文章中提出了BASE的术语概念, 包含Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)。

2004年,Eric Brewer上课的时候会进行对CAP和BASE进行讲解。

2008年5月(ACM上写了5月,其他有的写了7月,我按照最早的时间来),eBay的Dan Pritchett发表了《Base: An Acid Alternative》扩充并推广了BASE理论,可以说,此时BASE理论才被广泛的认识到。

 1997年的ACM文章:Cluster-based scalable network services (acm.org) 

 Eric Brewer的2004年上课的PPT的CAP定理(里面有BASE理论)地址:https://people.eecs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf

 Dan Pritchet的base理论说明 BASE: An Acid Alternative (acm.org)

BASE定理详细介绍

BASE定理是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)的缩写。它放宽了对一致性的要求,强调在分布式系统中可以容忍一定程度的数据不一致,但保证最终数据会达到一致状态。 

Eric Brewer和学生们关于BASE概念的主要内容

分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)_第2张图片

在1997年的文章当中,他们在设计和实施战略的时候,观察到许多数据在网络和相关服务当中,是可以容忍比ACID要弱一点的要求,不需要ACID那么强。他们通过合并可用性和一致性,还有软状态,容错相关内容的网络服务相关数据的语义,并进行权衡和归纳,得出了一开始的BASE概念,BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)的缩写。在提出这个BASE概念的时候,还提出了符合BASE概念的集群服务框架上的一个程序(讲到的东西有很多,有兴趣可以看下ACM的原文 :Cluster-based scalable network services (acm.org) )。

网络服务

分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)_第3张图片

整个网络服务分为用户的数据库(Customization Database),前端程序(Front Ends),工作池(Worker Pool),管理者(Manager),图形监视器(Graphical Monitor ),系统局域网(System-Area Network )

分层模型

他们的使用BASE的可扩展分层模型分为三层:

分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)_第4张图片

(1)服务层(代码):1.向TACC提供人机界面的工人模块,包括特定于设备的演示。2控制服务的用户界面

(2)转换聚合、缓存、自定义层:1.API用于无状态大坝转换的合成和内容聚合模块。2.对原始数据、聚合后数据和转换后数据进行统一缓存。3.透明访问定制数据库

(3)可扩展网络服务支持层:1.增量和绝对可扩展性。2.工作负载平衡和溢出管理。3.前端可用性、容错机制。4.系统监控和日志记录

ACID与BASE

他们相信,网络服务的设计空间可以根据每个服务的数据语义需求进行分区。一个极端是传统的事务数据库具有ACID属性(原子性、一致性、隔离性、持久性),提供最高级别的最强语义需要成本和极高的复杂性,而且ACID不保证有效性。他们认为ACID服务可以是无效的,这样能够以放松ACID约束的方式发挥作用。ACID语义非常适合于互联网商务交易操作、向用户计费或维护的用户配置文件信息或者个性化服务。

然而,对于其他互联网服务,用户不一定具有很强的一致性或耐用性,而是数据的高可用性:

1.只要所有副本都存在,就可以暂时容忍过时的数据的数据在短时间后最终达到一致性(例如DNS服务器在进入超时之前不会达到一致性到期)。

2.软状态,可以以牺牲为代价生成利用额外的计算或文件I/O来改进表演数据不持久。

3.大致答案(基于陈旧的数据或不完整的数据软状态)可能比精确传递更有价值答案传递得很慢。

他们这些指的是由组合产生的数据语义,这些技术如BASE基本可用、软状态、最终一致性。根据定义不是严格意义上指定为某一项。BASE语义允许处理集群中的部分故障具有较低的复杂性和成本。BASE降低了服务实现的复杂性,BASE提供了更好表现的机会。例如,其中ACID需要持久且一致的部分故障记录,BASE语义通常允许我们避免通信和磁盘活动或者推迟到更方便的时候。BASE语义极大地简化了在框架内实现容错和可用性,并允许性能优化

2004年Eric Brewer课件

分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)_第5张图片

CAP定理

2000 年 7 月,加州大学伯克利分校的 Eric Brewer 教授在“ACM 分布式计算原理研讨会(PODC)”上提出的一个CAP猜想,这时候才广为人知。

 2002 年,麻省理工学院的 Seth Gilbert 和 Nancy Lynch,用严谨的数学推理证明了 CAP 猜想。自文章发布之后,CAP 正式从猜想变为分布式计算领域所公认的著名定理。

Eric Brewer的2004年上课的PPT的CAP定理(里面有BASE理论)地址:https://people.eecs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf

在2004年的大学课件当中,分别讲解了CAP与BASE。 

ACID与BASE区别

区别 ACID BASE
一致性 强一致性

弱一致性

优先关注点 提交 高可用
事务类型 嵌套 尽最大努力
态度 保守(悲观) 积极(乐观)
效率
是否容易升级 容易

Dan Pritchett的BASE理论主要内容(有部分归纳改动了下)

分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)_第6张图片

eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,也是对Eric Brewer的BASE概念进行的深入挖掘及实践,核心思想是即使无法做到强一致性(StrongConsistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。现在来看下具体的关于CAP和BASE部分的内容。

CAP定理

加州大学教授Eric Brewer提出来的,推测Web服务不能确保所有同时具有以下三个属性(CAP):一致性,可用性,分区容错性。

具体地说,对于任何数据库设计,只有其中两个属性。显然,任何横向扩展策略都是基于数据划分;因此,设计师不得不做出决定在一致性和可用性之间。

ACID数据库事务

ACID数据库事务极大地简化了应用程序开发人员。数据库供应商早就认识到需要对数据库进行分区,并引入了一种已知的技术2PC(两阶段提交,参考看分布式事务:2PC与3PC的区别-CSDN博客),用于跨多个数据库实例提供ACID保证。

ACID缺点是什么

我们的一致性是跨分区的,如果Eric Brewer是正确的,那么我们一定影响了可用性,为什么呢?在CAP中的“任何系统的可用性都是运行所需组件的可用性“,该发言的最后一部分是最重要的。系统可能使用但未使用所需的组件,不会降低系统可用性。一笔交易在2PC提交中涉及两个数据库,那么产品的可用性将包含每个数据库的可用性。例如,如果我们假设每个数据库都有99.9%的可用性,则事务的可用性变为99.8%。

如何实现可用性

如果ACID为分区提供一致性选择数据库,那么如何实现可用性?

一个答案是BASE(基本可用,软状态,最终一致)。BASE与ACID截然相反。其中ACID是悲观的,并在每个结尾强制保持一致操作,BASE是乐观的,并接受数据库一致性将处于不断变化的状态,并带来ACID无法实现的可扩展性。BASE的可用性是通过支持部分故障而不支持整个系统故障来实现的。在这里是一个简单的例子:如果用户被划分为五个数据库服务器,根据BASE设计,一台用户数据库故障,该台影响的只有该特定主机上20%的用户。根据这种方式,确实会有更高的系统可用性。

 如何使用BASE

现在您已经将数据分解为跨多个数据库的功能模块,如何合并BASE进入您的应用程序?BASE需要根据在实际逻辑事务更深入的分析。以下部分提供了一些根据Brewer的关于一致性模式猜想的方向。如果BASE允许分区数据库中的可用性,然后放松一致性,必须承认这通常是这很困难,因为业务利益相关者和开发人员都倾向于一致性,这对应用程序的成功至关重要。整个过程中不一致性无法向最终用户隐藏,因此工程和产品所有者都必须处理怎么放松一致性,才能够影响最小。

ACID下的业务

图2是一个简单的数据库表结构

分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)_第7张图片

该图说明了BASE的一致性注意事项。用户表容纳用户包括销售和购买总额在内的信息。事务表保存涉及卖方和买方的每个交易。这些都简单化了真实的表,但包含说明一致性的几个方面的必要元素。一般来说,跨职能组的一致性是比在功能组内更容易放松。示例schema有两个功能组:用户和事务。每次出售商品时,都会在交易表和买卖双方的计数器更新。

分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)_第8张图片

使用ACID风格的事务,SQL如图3所示。用户表中的总买入和卖出列可以被视为事务表的缓存。它是以提高系统的效率。鉴于此,对一致性的限制可以放宽。买方和卖家的期望值可以设定,这样他们的实时余额就可以不立即反映交易的结果。这并不罕见,事实上,人们会遇到这种在交易及其运行余额之间(例如ATM取款和手机通话)延迟。

BASE下的改造处理方案
第一步 事务改造

如何修改SQL语句以放松一致性取决于运行平衡的方式,如果它们只是估计,意味着事务可能会被遗漏,更改非常简单,如图4所示。

分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)_第9张图片
 

我们现在已经将更新解耦到用户事务表。表之间出现不一致。事实上,第一个和第二个之间的故障事务将导致用户表永久不一致,但如果合同规定运行总数是估计数,这可能就足够了。

第二步 引入队列

但是,如果估计值不可接受怎么办?仍然可以将用户更新和事务更新解耦吗?引入持久性消息队列解决了问题,有几个实现持久消息的选项中最关键的因素实现队列。然而,在确保支持持久性与相同的数据库资源允许队列事务性承诺而不涉及2PC的,这是必要的。现在SQL操作看起来有点不同,因为如图5所示。 

分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)_第10张图片
 

 此示例语法上的一些自由,通过排队内的持久消息与相同的事务插入,简单化说明的逻辑概念。需要更新用户的实时余额已被得到了。这个事务包含在单个数据库实例因此不会影响系统可用性。

对于队列中的每条消息,将每条消息出列,并将信息应用于用户表。该示例似乎解决了所有问题,但是存在一个问题。消息持久性位于事务主机以避免在排队期间出现2PC。如果消息在涉及的事务内出列用户主机消息,我们仍然有2PC的情况。2PC在消息处理中的一种解决方案,组件是什么都不做。通过解耦更新到一个单独的后端组件中,您可以保留面向客户的组件的可用性。这个消息处理器的较低可用性对于业务需求来说可能是可接受的。

第三步 幂等性处理

然而,假设2PC根本不可接受在您的系统中。如何解决这个问题?第一你需要理解幂等性的概念。通过运算处理,认为幂等的一次或多次具有相同的结果。幂等运算很有用,因为它们允许部分失败,它们不会改变系统的最终状态。

所选示例,仔细看,幂等性是有问题的。更新操作很少是幂等的。此示例在适当位置递增平衡列。多次应用此操作显然会导致不正确的平衡。关于更新当中的幂等性,并不是简单地设置一个值。如果系统不能保证按顺序处理更新,则系统的最终状态将不正确。稍后将对此进行详细介绍。在平衡的情况下更新,您需要一种方法跟踪哪些更新已成功应用并且可以识别的。一种技术是使用记录的表事务标识符。

分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)_第11张图片

中所示的表格图6 包含了跟踪交易ID,已更新余额,并且用户余额所在的ID应用现在我们的样品伪代码 如所示图7。

分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)_第12张图片

这个例子展示了能够通过队列中的消息进行判断,成功处理后将其删除。方式:使用两个独立的事务处理:一个在消息队列和用户上的一个数据库队列

第四步 顺序性(乐观锁)

数据库操作已成功提交。现在算法部分故障,并且在不使用2PC的情况下仍然提供事务性保证。有一种更简单的技术可以保证幂等性。为了说明如果唯一关心的是订购,则进行更新这一新的目标,重新设计下解决方案,让我们改变我们示例模式看下(见图8)。

分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)_第13张图片

假设您也想跟踪用户的最后销售和购买日期。你可以依赖于类似的用消息更新日期的方案,但有一个问题。假设在短时间内发生两次购买窗口,而我们的消息系统无法确保有序操作。你现在的情况是,取决于根据消息的处理顺序,您将last_purchase的值不正确。幸运地这种更新可以通过对SQL进行轻微修改来处理,如图9所示。

分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)_第14张图片

通过不允许最后的采购时间比过去在时间上还要晚来约束,您已经进行了独立更新订单操作。您也可以使用此方法保护任何更新不受无序更新的影响。作为使用时间的替代方案,你也可以尝试单调增加事务ID。

消息队列的排序和已经传递的订购消息是相关的。消息系统提供了确保消息按照收到的顺序交付。这里提供的示例说明了消息订购可以放松开销,并且仍然提供一致的数据库视图,在大多数情况下是明显低于在消息中强制排序的开销。

此外,无论交互的风格如何,Web应用程序在语义上都是事件驱动的系统。这个客户端请求以任意顺序到达系统。每个请求所需的处理时间各不相同。整个系统组件的调度是不确定性的,导致排队的消息是不确定的。此时处理的订单会存在一些问题。也就是说,不确定性的输入将导致不确定性的输出。

软状态/最终一致

到目前为止,重点一直是用一致性换取可用性。现在来探讨,理解软状态和最终的一致性对应用程序设计有什么样的影响。作为软件工程师,我们倾向于关注我们的系统作为闭环。我们考虑他们的可预测性根据可预测的输入产生可预测的输出的行为。这是创建正确软件系统的必要条件。在许多情况下,好消息是使用BASE不会改变现有的闭环系统,但它确实需要查看其中的全部行为。

一个简单的例子可以帮助说明这一点。考虑一个用户将资产转移到其他人的系统用户。资产的类型无关紧要——可能是钱或游戏中的对象。对于这个例子,我们将假设我们已经将资产信息通过解耦的消息队列,一起提供给另一个用户。这个系统有不确定的地方。有资产有一段时间离开了一个用户,还没有到达另一个用户。这个时间窗口的大小可以由消息系统设计。无论如何,从开始到结束有一段时间的滞后和结束状态,其中两个用户似乎都没有资产。如果我们从用户的角度考虑这一点,这种滞后可能并不相关,甚至是未知的。接收用户和发送用户都可能不知道何时资产到达。如果发送和接收之间存在滞后几秒钟,用户实际上是看不见的,或者是可以忍受。在这种情况下,我们依赖于软状态和最终的一致性,用户资产转移的这样的系统行为被认为是一致的,用户可以接受。

事件驱动架构

如果你确实需要知道状态何时变为一致,那么需要应用于状态处理的算法。简单的方法是依赖于状态生成的事件一致。继续前面的例子,如果是否需要通知用户资产已到达?在事务中创建一个事件,该事件提交后,为用户的资产接收提供了一种机制,用于在状态已知,并且已经发生时执行进一步通知。EDA(事件驱动架构)可以提供可扩展性和体系结构方面解耦的显著改进。

以现在的目光看BASE定理

组成

分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)_第15张图片

BASE是Basically Available(基本可用)、Soft State(软状态)和Eventually consistent(最终一致性)三个短语的缩写。是在CAP定理的基础上,针对大规模分布式系统设计中的一致性和可用性权衡问题提出的一种实践指导原则。在实际应用中,尤其是在互联网服务等高度可扩展、高可用要求的场景下,强一致性往往难以保证且代价高昂。因此,BASE理论提倡:

  • 基本上可用(Basically Available):即使在部分故障或异常情况下,系统也要尽可能对外提供服务,不追求100%的服务连续性,但要确保核心功能可以使用。

  • 软状态(Soft State):系统可以在一段时间内保持中间状态,并允许状态随着时间推进和消息传播而发生变化。这意味着系统不必在任何时刻都保持完全一致的状态,而是通过时间窗口逐渐收敛到一致状态。

  • 最终一致性(Eventually Consistent):所有数据副本在一定时间内最终会达到一致状态,而不是立即一致。这种策略允许在保证数据最终正确性的前提下,降低对实时同步的要求,从而提高系统的响应速度和可用性。

核心思想是即时无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。接下来我们详细看下这三点。

1、Basically Available(基本可用)

BASE理论中的第一个关键要素,具体的关注点有以下几点

​​​​​​​​​​​​
  1. 响应能力:基本可用意味着系统需要在合理的时间内对用户的请求做出响应,尽管这种响应可能不是最优的或者包含的数据不是最新的。

  2. 降级处理:在部分故障情况下,系统可以采取降级模式运行,即只提供核心功能,而非全部功能。例如,在分布式存储系统中,当某个节点不可达时,系统可以暂时将流量导向其他正常工作的副本节点,保证用户能够访问到部分数据,即使这部分数据并非全局最新的状态。

  3. 可接受的服务质量:基本可用并不保证服务性能始终保持最优,但在出现故障的情况下,仍能为用户提供一定的服务,比如在高并发时限制新用户的接入速度以保障现有用户的体验,或者在资源紧张时返回给用户一个默认值、错误信息或者过期数据。一般通过

  4. 限流和熔断操作:在极端情况下,为了保持整体系统的稳定性和避免数据不一致,系统可能会暂时限制某些写操作,但会尽量确保读操作的基本可用性。

  5. 错误处理与重试机制:系统应当具备良好的错误处理能力,对于暂时性的故障应具有重试机制,确保操作能够在后续尝试中成功完成。同时,返回合适的错误信息给客户端,以便客户端可以做出相应的应对。

总结起来,基本可用意味着在分布式系统遇到问题时,首先确保系统能够在有限的功能范围内持续运行,并尽可能减少对用户体验的影响,而不仅仅是追求在所有场景下都提供完美一致的服务。这一特性使得分布式系统在实际应用中具有更强的韧性和适应性。

2、Soft state(软状态)

软状态(Soft State)是BASE理论中的第二个关键要素,它描述了分布式系统中数据的状态可以随着时间的推移而改变,并且这种变化并不是立即同步到所有节点上的。在软状态模型下,系统的状态不会始终保持固定不变,而是允许存在一定的中间状态,并不会影响整体可用性。

具体来说:

​​​​​​​​​​​​​​
  1. 状态过渡:软状态意味着系统内部的数据或状态可以在一段时间内处于不一致状态,例如,在数据复制过程中,主从节点之间可能存在短暂的数据延迟,即从节点可能还未接收到主节点最新的更新。

  2. 时间相关性:软状态与时间有关,随着系统处理更多的请求和事件,其内部状态会发生变化,而且这些变化可能不会立刻反映在所有的副本或节点上。

  3. 容忍不一致:设计时考虑到网络延迟、节点故障等因素导致的数据同步滞后问题,系统能够在一定时间内接受部分节点之间的状态不一致,而不是要求严格的一致性。

  4. 最终一致性保证:尽管软状态允许系统在某个时间窗口内存在不同步的问题,但通常会结合“最终一致性”原则,确保系统经过一段时间后能够自我修复并达到全局一致的状态。

也就是说,软状态是为了适应大规模分布式环境下的性能和可用性需求,对强一致性要求的一种妥协。通过允许系统在特定场景下保持软状态,可以实现更好的扩展性和更高的响应速度。

3、Eventually consistent(最终一致性)

强调系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。其本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。

数据一致性可以按照不同标准和应用场景细分为多种类型,以下是几种主要的数据一致性模型:

分布式事务:BASE理论详细介绍及发展历史(Eric Brewer,Dan Pritchet)_第16张图片

  1. 强一致性(Strong Consistency )

    在强一致性模型(也称为线性一致性Linearizability)中,任何对数据的更新操作一旦完成,在所有后续的读取请求中都能立刻看到这个更新结果。这意味着在分布式系统中的所有节点上,数据的变化就像是在一个全局时钟下的瞬时同步。
  2. 顺序一致性(Sequential Consistency)

    保证所有节点上的操作看起来像是按照某种全局顺序执行的,尽管实际的操作可能并发进行。每个节点看到的操作顺序与全局顺序一致。
  3. 因果一致性(Causal Consistency)

    如果一个事件A在事件B之前发生,并且两个事件发生在不同的节点上,那么所有观察到事件A的节点也必须以相同的顺序看到事件B。这种模型允许并行修改没有因果关系的数据项。
  4. 弱一致性(Weak Consistency)

    不保证节点之间数据的立即同步,通常不提供任何关于何时可以看到更新的具体时间窗口。用户可能会看到过时的数据。
  5. 最终一致性(Eventual Consistency)

    系统最终会达到一致性状态,即所有的节点最终都会看到相同的数据版本,但无法保证达成一致的时间点。这是一种较弱的一致性模型,适用于某些高可用性和可扩展性要求较高的场景。

BASE理论是提出通过牺牲一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。

最终一致性怎么保证

在分布式系统中,最终一致性(Eventual Consistency)是指即使在出现网络分区、延迟或故障的情况下,系统中的所有数据副本经过一段时间后最终会达到一致状态。以下是几种确保最终一致性的方式:

  1. 异步复制

    数据更新首先在主节点完成,然后通过异步方式将变更传播到其他副本节点。这种方式下,不同节点上的数据可能会有短暂的不一致,但随着时间推移,所有的副本都会收到并应用更新,从而实现最终一致性。
  2. 版本号/时间戳

    在数据项上添加版本号或时间戳信息,当多个并发操作发生时,可以根据版本号或者时间戳来决定哪个更新应该被保留,并确保后续操作能够基于最新的版本进行。
  3. 冲突解决策略

    当不同的副本接收到互相冲突的更新时,需要有冲突解决机制,比如最后写入胜出(Last Write Wins, LWW)、基于业务规则选择等方法来确定最终的数据值。
  4. 消息队列/事件驱动

    通过消息中间件实现数据同步,更新操作产生的事件会被发送到消息队列,各节点从队列消费事件并执行相应操作,这样可以保证在没有竞争条件的情况下顺序处理,实现最终一致性。
  5. 向量时钟和多版本并发控制

    使用向量时钟(Vector Clocks)或其他并发控制技术追踪每个数据项的更新历史,从而能够在合并不同副本的更新时避免或解决冲突,使得所有副本最终达成一致。
  6. 补偿事务与重试机制

    对于无法立即一致的操作,可以采用TCC(Try-Confirm-Cancel)事务模型,在确认阶段检测到的冲突通过回滚先前的尝试操作并重新发起,以确保最终的一致性。
  7. 读修复/写修复

    当读取节点发现其持有的数据版本过期时,可以通过读修复从最新版本的节点获取数据;同样地,当新数据写入成功后,系统自动触发对其他副本的更新,以此逐步实现一致性。

设计者需要根据实际应用场景和需求选择合适的方案来确保数据最终达到一致的状态。

BASE理论与CAP的关系

BASE理论是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结, 是基于CAP定理逐步演化而来的。BASE理论的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性

BASE理论是对CAP理论在实际分布式系统设计和实现中的一种实践指导,尤其是在面对大规模、高可用性和可扩展性需求的场景下,保持数据最终一致。

ACID 和 BASE 的区别与联系

Eric Brewer的2004年的课件当中,已经提出相应的区别

区别 ACID BASE
一致性 强一致性

弱一致性

优先关注点 提交 高可用
事务类型 嵌套 尽最大努力
态度 保守(悲观) 积极(乐观)
效率
是否容易升级 容易

ACID模型通常适用于数据库系统,在这些场景中强调的是强一致性保证,确保任何时刻查询到的数据都是最新的、准确的,并且不受其他事务影响。

BASE理论适用于大规模分布式系统,这类系统需要在高可用性和可扩展性上做出权衡,因此牺牲了强一致性以换取更高的可用性和更大的扩展能力。在这种环境下,不同节点间的数据更新可能有延迟,但通过各种策略(如异步复制、冲突解决机制等)可以保证在足够长的时间窗口之后,整个系统的数据状态最终是一致的。

在实际分布式系统架构设计过程中,ACID特性和BASE理论会结合使用。某些核心业务模块或者关键数据可能依然要求严格的ACID特性,而一些非关键性服务或数据存储则可以选择采用BASE原则,这样既可以保障整体系统的稳定性和可靠性,又能实现灵活的扩展和服务水平。例如,在一个大型电商系统中,用户订单相关的事务可能需要遵循ACID原则来保证交易的完整性和准确性;而用户的购物车信息或推荐列表等相对次要的数据,则可以通过最终一致性模型来提高系统性能和可用性。

总结

ACID理论是传统关系型数据库设计的核心原则,它强调事务处理的四个关键特性:Atomic原子性Consistency一致性Isolation隔离性Durability持久性,以确保数据在并发操作下的完整性和准确性。然而,在大规模分布式系统中,尤其是在需要高可用性和可扩展性的NoSQL数据库场景下,强一致性的追求可能会导致性能瓶颈和扩展难题。

BASE理论应运而生,为解决上述问题提供了新的设计理念。该理论倡导Basically Available(基本可用)Soft State(软状态)Eventually consistent(最终一致性),允许系统在面对网络分区或故障时暂时牺牲强一致性来换取服务的持续可用性和系统的扩展性。在实际应用中,BASE理论被广泛应用于NoSQL数据库系统的设计中,成为应对大数据和互联网分布式环境的重要指导思想。

对于任何集群系统来说,尤其是大型分布式后台系统,不可避免会遇到各种不可预知的故障情况,这些故障可能导致系统过载。因此,如何在系统设计阶段就充分考虑并实现有效的过载保护机制,保证系统在压力过大时仍能保持基本的服务功能和可用性,是开发与运维此类系统的关键任务之一。通过合理的资源分配、负载均衡、限流、熔断等技术手段,可以实现即使在过载状态下也能提供一定的服务水平。

 参考内容

1.1997年的ACM文章:Cluster-based scalable network services (acm.org) 

2.Eric Brewer的2004年上课的PPT的CAP定理(里面有BASE理论)地址:https://people.eecs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf

3.CAP定理证明地址:BrewersConjecture-SigAct.pdf (nus.edu.sg)

4.Seth Gilbert 和 Nancy Lynch关于Cap的另一文章:Brewer2.pdf (mit.edu)

5.时间线参考 https://www.julianbrowne.com/article/brewers-cap-theorem/

6.CAP对立观点 A CAP Solution (Proving Brewer Wrong) | Blog | Atomikos

7.Dan Pritchet的base理论说明 BASE: An Acid Alternative (acm.org)

你可能感兴趣的:(分布式事务,java,数据库,分布式,分布式事务,BASE,CAP)