分布式事务

分布式理论

CAP理论

在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance),这三个要素最多只能同时实现两点,不可能三者兼顾。由于P(分区容错)是必选项,所以只能在AP或者CP中选择。

  • 一致性(Consistency):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本) ;

  • 可用性(Availability):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性); 

  • 分区容错性(Partition tolerance):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择;

BASE理论

BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)的缩写。在分布式系统中,CAP理论是指导思维,而BASE理论是CAP理论中AP的延伸,是对 CAP 中的一致性和可用性进行一个权衡的结果,核心思想是:即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。

  • 基本可用(Basically Available):指分布式系统在出现故障的时候,允许损失部分可用性,保证核心可用。

  • 柔性状态(Soft state):指允许系统存在中间状态,并认为该中间状态不会影响系统整体可用性。比如,允许不同节点间副本同步的延时就是柔性状态的体现。

  • 最终一致性(Eventually consistent):指系统中的所有副本经过一定时间后,最终能够达到一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。

事务的一致性

  • 强一致性:系统中的某个数据被成功更新后,后续的访问都能看到更新后的值;

  • 弱一致性:系统中的某个数据被更新后,后续的访问可能得到更新后的值,也可能是更改前的值;

  • 最终一致性:系统中的某个数据被更新,经过一段时间后,最终所有的访问都是更新的值;

事务按照属性分类

事务可以按照对数据的一致性要求进行分类:

刚性事务

分布式理论的CP ,强一致性,遵循ACID,对数据要求强一致性

柔性事务

分布式理论的AP+BASE ,最终一致性,遵循BASE,允许一定时间内不同节点的数据不一致,但要求最终一致;

 

刚性事务

XA协议

XA协议是一个基于数据库的分布式事务协议,其分为两部分:事务管理器(Transaction Manager)本地资源管理器(Resource Manager)。事务管理器作为一个全局的调度者,负责对各个本地资源管理器统一号令提交或者回滚。二阶提交协议(2PC)三阶提交协议(3PC)就是根据此协议衍生出来的。主流的诸如Oracle、MySQL等数据库均已实现了XA接口。

 

2pc

第一阶段:准备阶段

协调者向所有参与者发送 REQUEST-TO-PREPARE,当参与者收到REQUEST-TO-PREPARE 消息后, 它向协调者发送消息PREPARED或者NO,表示事务是否准备好;如果发送的是NO,那么事务要回滚;

第二阶段: 提交阶段

协调者收集所有参与者的返回消息, 如果所有的参与者都回复的是PREPARED, 那么协调者向所有参与者发送COMMIT 消息;否则,协调者向所有回复PREPARED的参与者发送ABORT消息;参与者如果回复了PREPARED消息并且收到协调者发来的COMMIT消息,或者它收到ABORT消息,它将执行提交或回滚,并向协调者发送DONE消息以确认。

 

3pc

3pc分为三个阶段:CanCommit阶段、PreCommit阶段和DoCommit阶段。相比2PC,3PC通过引入一个额外的确认阶段来减轻锁定资源的时间,并减少因协调者故障导致的数据不一致的风险

 

柔性事务

TCC

TCC采用补偿机制,其核心思想是针对每个操作,注册一个对应的确认和补偿(撤销)操作。具体分为三个阶段:Try(尝试执行业务,完成业务检查,预留必要资源)、Confirm(确认执行业务,使用Try阶段预留的资源)、Cancel(若业务执行失败,则取消业务并释放资源)。

 

Saga

Saga模型将一个分布式事务拆分为多个本地事务,每个本地事务都有相应的执行模块和补偿模块。当事务中的任意一个本地事务出错时,通过调用相关的补偿方法恢复之前的事务,达到最终一致性。Saga包括LLT(Long Live Transaction)、本地事务和补偿组成。

Saga模型是把一个分布式事务拆分为多个本地事务,每个本地事务都有相应的执行模块和补偿模块(对应TCC中的Confirm和Cancel),当Saga事务中任意一个本地事务出错时,可以通过调用相关的补偿方法恢复之前的事务,达到事务最终一致性。

Saga 模型由三部分组成:

- LLT(Long Live Transaction):由一个个本地事务组成的事务链。

- 本地事务:事务链由一个个子事务(本地事务)组成,LLT = T1+T2+T3+...+Ti。

- 补偿:每个本地事务 Ti 有对应的补偿 Ci。

Saga 的执行顺序:

- 正常情况: T1,T2,T3,...,Ti

- 异常情况: T1,T2,T3,..Ti,Ci,...C3,C2,C1

Saga 两种恢复策略:

- 向后恢复(Backward Recovery):撤销掉之前所有成功子事务。如果任意本地子事务失败,则补偿已完成的事务。如异常情况的执行顺序T1,T2,T3,..Ti,Ci,...C3,C2,C1。

- 向前恢复(Forward Recovery):即重试失败的事务,适用于必须要成功的场景,该情况下不需要Ci。执行顺序:T1,T2,...,Tj(失败),Tj(重试),...,Ti。

posted @ 2023-05-02 16:45  HexThinking  阅读(10)  评论(0编辑  收藏  举报