如果我们期望实现一套严格满足ACID特性的分布式事务,很可能出现的情况就是在系统的可用性和严格一致性之间出现冲突.
在可用性和一致性之间,永远无法存在一个两全其美的方案.
从集中式到分布式
集中式系统
所谓的集中式系统就是指由一台或多台主计算机组成中心节点,数据集中存储于这个中心节点中,并且整个系统的所有业务单元都集中部署在这个中心节点上,系统的所有功能均由其集中处理.
集中式系统特点
集中式系统最大的特点就是部署结构简单.
分布式系统
分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统.
分布式系统特点
- 分布性
- 对等性
- 并发性
- 缺乏全局时钟
- 故障总会发生
分布式系统常见的问题
- 通信异常
- 网络分区
当网络由于发生异常情况,导致分布式系统中部分节点之间的网络延时不断增大,最终导致组成分布式系统的所有节点中,只有部分节点之间能够进行正常通信,而另一些节点则不能.我们将这个现象称为网络分区,就是俗称的脑裂.
- 三态
分布式系统的每一次请求与响应,存在特有的三态概念,即成功,失败与超时.
- 节点故障
从ACID到CAP/BASE
事务及事务的ACID特征
事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元.
事务具有四个特征,分别是原子性(Atomicity),一致性(Consistency),隔离性(Isolation)和持久性(Durability).
分布式事务
分布式事务是指事务的参与者,支持事务的服务器,资源服务器以及事务管理器分别位于分布式系统的不同节点之上.
通常一个分布式事务中会涉及对多个数据源或业务系统的操作.
CAP定理
CAP理论告诉我们,一个分布式系统不能同时满足一致性(Consistency),可用性(Availability)和分区容错性(Partition tolerance)这三个基本需求,最多只能同时满足其中的两项.
- 一致性
在分布式环境中,一致性是指数据在多个副本之间是否能够保持一致的特性.在分布式系统中,如果能够做到针对一个数据项的更新操作执行成功后,所有的用户都可以读取到其最新的值,那么这样的系统就被认为具有强一致性(或严格的一致性).
- 可用性
可用性是指系统提供的服务必须一致处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果.
- 分区容错性
分区容错性约束了一个分布式系统需要具有如下特性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障.网络分区是指在分布式系统中,不同的几点分布在不同的子网络(机房或异地网络等)中,由于一些特殊的原因导致这个子网络之间出现网络不连通的状况,但各个子网络的内部网络是正常的,从而导致整个系统的网络环境被切分成了若干个孤立的区域.需要注意的是,组成一个分布式系统的每个节点的加入与退出都可以看作是一个特殊的网络分区.
放弃CAP定理 | 说明 |
放弃P | 放弃分区容错性以为着退回到了集中式系统,牵一发动全身,违背了分布式系统的初衷 |
放弃A | 放弃可用性意味着在等待期间无法对外提供正常的服务,即不可用 |
放弃C | 放弃一致性值得是放弃数据的强一致性,数据的最终一致性依然保留着. |
从CAP定理中可以看出,一个分布式系统不可能同时满足一致性,可用性和分区容错性这三个需求.
对于一个分布式系统来说,分区容错性可以说是一个最基本的要求.
因此系统架构设计师往往需要把精力花在如何根据特定业务特点在C(一致性)和A(可用性)之间寻求平衡.
BASE理论
BASE是Basically Avaliable(基本可用),Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写.
BASE是对CAP中一致性和可用性权衡的结果,其来源于大规模互联网系统分布式实践的总结,是基于CAP定理逐步演化而来的.
其核心思想是即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来是系统达到最终一致性.
- 基本可用
基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性--但请注意,这绝不等价于系统不可用.如:响应时间上的损失,功能上的损失(服务降级)
- 软状态
软状态也成弱状态,和硬状态相比,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时.
- 最终一致性
最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态.因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性.最终一致性是一种特殊的弱一致性:系统能够保证在没有其他的更新操作的情况下,数据最终一定能够达到一致的状态,因此所有客户端对系统的数据访问都能够获取到最新的值.同时,在没有发生故障的前提下,数据达到一致状态的时间延迟,取决于网络延迟,系统负载和数据复制方案设计等因素.在实际工程实践中,最终一致性存在以下五类主要变种:
-
- 因果一致性
- 读己之所写
- 会话一致性
- 单调读一致性
- 单调写一致性
-
总的来说,BASE理论面向的是大型高可用可扩展的分布式系统,和传统事务的ACID特性是相反的,它完全不同于ACID的强一致性模型,而是提出通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,单最终达到一致状态.
同时,在实际的分布式场景中,不同业务单元和组件对数据一致性的要求是不同的,因此在具体的分布式系统架构设计过程中,ACID特性与BASE理论往往又会结合在一起使用.