分布式一致性算法:2PC与3PC算法的基本概念

一、引言

在对一个分布式系统进行架构设计的时候,往往会对其系统的可用性(A)和数据一致性(P)之间进行反复权衡,于是就产生了一致性的协议,其中就包含了二阶段提交协议(2PC)、三阶段提交协议(3PC)。

在2PC和3PC算法中,有两个角色:协调者(Coordinator)和参与者(Participant)。
协调者负责调度参与者的行为,参与者负责执行事务中的内容,事务是否提交或者回滚都由协调者决定。

二、二阶段提交协议(2PC)

目前,绝大多数关系型数据库都是采用二阶段提交协议来完成分布式事务的处理,该协议能够有效地保证分布式数据的一致性。

二阶段协议将事务的提交分为了两个阶段:

阶段1:提交事物执行的请求

1、事务询问
协调者向所有的参与者发送事务的执行内容,并且询问它们能不能执行事务提交操作。协调者发送请求后,便开始等待参与者的响应。

2、执行事务
各参与者执行事务内容,并将执行内容记录在日志中

3、参与者向协调者发送响应
如果参与者成功执行了事务操作,就反馈给协调者成功的响应,表示事务可以提交,如果参与者没有成功执行事务,就将失败的消息反馈给协调者。

阶段2:事务提交/中断

协调者会根据参与者的响应内容来决定是否进行最终的事务提交操作,正常情况下包含两种可能:执行事务提交或是中断事务。

执行事务提交
若所有参与者向协调者发送的响应都是可以完成事务操作,那么就会执行事务提交
1、发送提交请求
协调者向所有参与者发出事务提交请求。

2、提交事务
参与者在接收到协调者的事务提交请求后,会正式执行事务提交操作。完成事务提交后,就会向协调者发送Ack消息。
在这里插入图片描述
中断事务
当一个参与者向协调者发送了不可执行事务的响应或者参与者等待超时后,就会开始中断事务。
1、发送回滚请求
协调者向所有参与者发送事务回滚请求。参与者收到回滚请求后,会根据日志信息来执行事务回滚。

2、发送回滚结果
参与者回滚完成后,向协调者发送Ack消息。

优缺点

优点:原理简单、实现方便
缺点:同步阻塞、单点、数据不一致、过于保守。

1、同步阻塞问题
二阶段提交的执行过程中,所有该事务操作的逻辑都处于一种阻塞状态,在参与者等待响应的过程中,将无法进行这个事务的其他操作。

2、单点问题
在2PC算法中协调者非常重要,若协调者出现问题,那么所有的事务操作都将无法进行。

3、数据不一致
如果在阶段2的提交过程中,当协调者向所有参与者发送事务提交请求后,若发生了局部网络异常或者协调者自身发生了崩溃,导致最后只有一部分参与者收到了事务提交请求。于是这样导致收到了事务提交请求的参与者提交了事务,而没有收到事务提交请求的参与者无法进行事务提交,于是便发生了数据不一致现象。

4、过于保守
如果在协调者指示参与者进行事务提交的询问过程中,参与者出现故障而导致协调者始终无法获取到所有参与者的响应信息的话,那么协调者只能依靠其自身的超时机制判断是否需要中断事务,这样的方式显得比较保守,没有较为完善的容错机制。

三、三阶段提交协议(3PC)

三阶段提交协议实在二阶段提交协议的基础上改进的,把2PC的提交事务请求这一阶段改进为两个阶段,形成了CanCommit、PreCommit、DoCommit三个阶段组成的事务处理协议。

阶段1:CanCommit

1、事务询问
协调者向所有的参与者发送一个包含事务内容的canCommit请求,表示询问参与者是否可以进行事务的提交操作,并等待参与者的响应。

2、各参与者向协调者发送响应
参与者在接收到canCommit请求后,如果认为自己能够执行这个事务,那么便会返回YES响应,否则便会返回NO响应。

阶段2:PreCommit

如果各参与者返回的都是YES响应,那么会正式进入第二阶段:PreCommit,即事务的预提交。
1、发送预提交请求
协调者向所有参与者节点发送PreCommit请求,并等待参与者响应。

2、事务预提交
参与者接收到PreCommit请求后,会执行事务操作,并将事务信息记录在日志中。

3、参与者向协调者反馈
如果参与者成功执行了事务操作,那么便会将Ack响应发送给协调者。

如果有其中一个参与者返回的是NO响应,那么会进行事务的取消操作:
1、协调者向各参与者发送中断请求。
2、中断事务
无论是收到来自协调者的中断请求或是在等待第三阶段协调者的请求过程中发生了超时,参与者都会中断事务。

阶段3:DoCommit

该阶段将进行真正的事务提交,会存在两种情况:
执行提交事务:
1、发送提交请求
进入此阶段,协调者会向所有的参与者发送DoCommit请求,表示让参与者提交事务

2、参与者提交事务
参与者接收到DoCommit请求后,会执行事务提交操作,并将Ack响应发送给协调者。

3、完成事务
协调者在接收到所有参与者的Ack消息后,完成事务。
在这里插入图片描述
中断/回滚事务
如果有任何一个参与者向协调者发送No响应,或者等待某个协调者响应超时,那么就会释放整个事务占有的资源。
1、协调者发送中断请求
协调者向所有参与者发送Rollback请求。

2、事务回滚
参与者在接收到Rollback请求后,会根据事务日志来完成回滚,回滚完成后释放事务占有的资源,然后向协调者发送Ack消息。

优缺点

优点
相对于2PC算法,3PC最大的优势就是降低了阻塞范围,能够在发生单点故障后继续达成一致。

缺点
3PC算法引入了新的问题:在参与者接收到PreCommit消息后,如果网络发生故障导致参与者与协调者不能正常地进行网络通讯,那么依然会导致参与者进行事务提交,从而导致数据的不一致。

三、总结

2PC和3PC超时判断区别

对于2PC算法,只有协调者会进行超时判断。例如在第二阶段事务提交过程中,协调者在等待参与者响应的过程中若发生了超时,则会中断事务。

而在3PC算法中,协调者和参与者都会进行超时判断。例如在第三阶段中,在参与者等待协调者DoCommit请求或是Abort请求过程中发生了超时,那么参与者可能会执行事务的提交操作,解决了2PC算法过于保守的问题。

缺陷分析

1、2PC使用了两个阶段来达成新的共识或者维持旧有的共识,其缺陷在于不能保证在节点永久性崩溃的情况下正常运行。
2、3PC扩展了2PC算法,其缺陷在于不能保证节点暂时性崩溃或者存在网络分区的情况下正常运行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值