本篇介绍分布式一致性算法:三阶段提交(3PC)
3PC,即三阶段提交,是2阶段提交的改进版,其将二阶段提交协议的“准备阶段”一份为二,形成了cancommit,precommit,do commit三个阶段。
阶段一:CanCommit
事务询问
协调者向所有的参与者发送一个包含事务内容的canCommit请求,询问是否可以执行事务提交操作,并开始等待各参与者的响应。
参与者响应
在参与者接收到协调者的canCommit请求,如果可以执行,参与者发送Yes进行反馈,否者发送No。
阶段二:PreCommit
如果协调者从阶段一中的CanCommit响应中得到Yes反馈
1. 发送预提交请求
协调者向所有的参与者发送preCommit请求,并进入Prepared阶段。
2. 事务预提交
参与者接收到preCommit请求后,会执行事务操作,并将Undo和Redo信息记录到事务日志中。
3. 参与者响应 如果参与者成功执行了事务操作,就会返回给协调者Ack响应,同时等待最终指令。 如果协调者从阶段一中的CanCommit响应中得到No反馈,或者协调者等待超时后发送中断请求协调者会向所有的参与者发送abort请求。 中断事务,无论是接收到协调者的abort请求,还是等待协调者的响应而出现的超时,参与者都会中断事务。
阶段三:doCommit
执行提交
发送提交请求:当协调者收到所有参与者反馈的Ack响应,向所有参与者发送DoCommit请求,从预提交状态转到提交状态
事务提交:参与者接收到DoCommit请求后,正式执行事务提交操作,并释放占用的事务资源
反馈事务提交结果:参与者完成事务提交后向协调者发送Ack消息
完成事务:协调者接受到所有参与者反馈的Ack响应后,完成事务
中断事务
发送中断请求:协调者向所有参与者节点发出Abort请求
事务回滚:参与者接收到Abort请求后,利用Undo信息执行事务回滚操作,并释放占用的事务资源
反馈事务回滚结果:参与者完成事务回滚后向协调者发送Ack消息
中断事务:协调者接收到所有参与者反馈的Ack响应后,中断事务
第三阶段中若参与者无法及时接收到协调者发送的DoCommit或者Abort请求都会在等待超时后继续进行事务提交
3PC的优缺点
优点:降低参与者的阻塞范围,能够在出现单点故障后继续达成一致
缺点: 接受者接收到PreCommit消息后,如果出现网络分区导致协调者和参与者无法正常通信,这时参与者仍会进行事务提交,造成数据的不一致 协调者出现问题
协调者和参与者网络出现问题
无论出现哪种情况,最终都会导致参与者无法及时接收到来自协调者的doCommit或者是abort请求,针对这样的情况,参与者都会在等待超时之后,继续进行事务提交。