分布式一致性理论
1.数据库事务ACID理论
为保证事务正确可靠而必须具备的四个核心特性。这四个特性分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。下面我将对这四个特性进行详细介绍:
-
原子性(Atomicity)
含义:事务被视为一个不可分割的工作单位,事务中的所有操作要么全部完成,要么全部不完成,即"all-or-nothing"原则。
实现:如果在事务执行过程中发生错误或故障,则整个事务会被回滚(Rollback)到事务开始前的状态,就像这个事务从未执行过一样。
示例:银行转账时,从A账户扣款和向B账户存款这两个操作要么同时成功,要么同时失败,以确保资金的正确流转。
-
一致性(Consistency)
含义:事务必须使数据库从一个一致性状态转变到另一个一致性状态。即事务的执行不会破坏数据库的完整性约束。
实现:事务开始之前和事务结束之后,数据库的完整性没有被破坏。写入的资料必须完全符合所有的预设规则,包括数据的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
示例:假设有一个完整性约束a+b=10,如果事务改变了a的值,那么b的值也必须相应改变,以确保事务结束后依然满足a+b=10。
-
隔离性(Isolation)
含义:多个事务并发执行时,一个事务的执行不应影响其他事务。即每个事务都在自己的"世界"中执行,无法看到其他并发事务的中间状态。
实现:事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。这些级别提供了不同程度的事务隔离,以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
示例:在A账户向B账户转账的过程中,B账户在事务完成前无法看到新增加的金额。
-
持久性(Durability)
含义:一旦事务提交,它对数据库的修改就是永久性的,即使系统发生故障也不会丢失。
实现:事务处理结束后,对数据的修改会被永久地保存在数据库中,不会因系统故障或重启而丢失。
示例:如果银行转账成功并提交,即使此时数据库宕机,重启后依然能够看到转账成功后的结果。
2.本地事务和分布式事务
事务简单来说:一个会话中所进行所有的操作,要么同时成功,要么同时失败。
事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。
分布式事务指的是事务操作跨越多个节点,并且要求满足事务的 ACID 特性。
分布式事务相比于单机事务,实现复杂度要高很多,主要是因为其存在以下难点:
- 事务的原子性:事务操作跨不同节点,当多个节点某一节点操作失败时,需要保证多节点操作的都做或都不做(All or Nothing)的原子性。
- 事务的一致性:当发生网络传输故障或者节点故障,节点间数据复制通道中断,在进行事务操作时需要保证数据一致性,保证事务的任何操作都不会使得数据违反数据库定义的约束、触发器等规则。
- 事务的隔离性:事务隔离性的本质就是如何正确多个并发事务的处理的读写冲突和写写冲突,因为在分布式事务控制中,可能会出现提交不同步的现象,这个时候就有可能出现"部分已经提交"的事务。此时并发应用访问数据如果没有加以控制,有可能出现"脏读"问题。
在分布式领域,要实现强一致性,代价非常高昂。因此,有人基于 CAP 理论以及 BASE 理论,有人就提出了柔性事务的概念。柔性事务是指:在不影响系统整体可用性的情况下(Basically Available 基本可用),允许系统存在数据不一致的中间状态(Soft State 软状态),在经过数据同步的延时之后,最终数据能够达到一致。并不是完全放弃了 ACID,而是通过放宽一致性要求,借助本地事务来实现最终分布式事务一致性的同时也保证系统的吞吐。
3.CAP 理论
CAP理论指的是在一个分布式系统中,Consistency(一致性)、Availability(可用性)和Partition Tolerance(分区容错性)这三个特性无法同时满足,只能满足其中的两个。
三个特性解释:
- 一致性(Consistency):
定义:一致性是指在一个分布式系统中,多个节点之间的数据是始终保持一致的。也就是说,当一个节点修改了数据后,其他节点能够立即看到这个修改。
重要性:一致性保证了分布式系统中数据的正确性和完整性。 - 可用性(Availability):
定义:可用性是指系统能够在任意时刻提供正确的响应,即系统一直处于可用的状态。
重要性:可用性保证了用户能够随时随地访问分布式系统,并获得有效的响应。 - 分区容错性(Partition Tolerance):
定义:分区容错性是指分布式系统中的网络可能会发生故障或分区的情况,但系统仍能够继续工作。
重要性:分区容错性是为了应对网络故障或分区产生的情况,保证整个分布式系统的稳定性和可靠性。
重点说说一致性
在一致性的条件下,分布式系统在执行写操作成功后,如果所有用户都能够读取到最新的值,该系统就被认为具有强一致性。
数据一致性又可以分为以下几点:
- 强一致性 - 数据更新操作结果和操作响应总是一致的,即操作响应通知更新失败,那么数据一定没有被更新,而不是处于不确定状态。
- 最终一致性 - 即物理存储的数据可能是不一致的,终端用户访问到的数据可能也是不一致的,但系统经过一段时间的自我修复和修正,数据最终会达到一致。
3.BASE 理论
BASE 定理是对 CAP 中一致性和可用性权衡的结果。
3.1 BASE思想
BASE 是 基本可用(Basically Available)、软状态(Soft State) 和 最终一致性(Eventually Consistent) 三个短语的缩写。
BASE 理论的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。
- 基本可用(Basically Available)分布式系统在出现故障的时候,保证核心可用,允许损失部分可用性。例如,电商在做促销时,为了保证购物系统的稳定性,部分消费者可能会被引导到一个降级的页面。
- 软状态(Soft State)指允许系统中的数据存在中间状态,并认为该中间状态不会影响系统整体可用性,即允许系统不同节点的数据副本之间进行同步的过程存在延时。
- 最终一致性(Eventually Consistent)强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能达到一致的状态。
3.2 BASE和ACID的比较
BASE 的理论的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。
ACID 要求强一致性,通常运用在传统的数据库系统上。而 BASE 要求最终一致性,通过牺牲强一致性来达到可用性,通常运用在大型分布式系统中。