关于分布式一致性问题不做解释,在长期探索过程中,有几种代表性的解决方案,在这主要说2PC,3PC,Paxos,ZAB。
2PC
2PC(Two-Phase Commit),二阶段提交。目前,绝大多数关系型数据库使用此协议完成分布式事务处理。
协议说明
二阶段提交协议是将事务提交过程分为两个阶段进行处理,其执行流程如下:
阶段一:提交事务请求(投票)
1.事务询问:协调者向所有参与者发送事务内容,询问是否可以执行事务提交操作,并等待响应
2.执行事务:参与者执行事务操作,并将Undo和Redo记入事务日志中
3.各参与者反馈结果:将执行结果提交给协调者(YES/NO)
阶段二:执行事务提交
协调者根据各参与者的反馈决定最终是否进行事务提交。
A.事务提交
所有参与者返回YES,执行事务提交
1.发送提交请求:协调者向所有参与者发出commit请求
2.事务提交:参与者收到commit请求后,正式执行事务提交操作,完成后释放资源
3.反馈结果:参与者完成事务提交后,向协调者发送Ack消息
4.完成事务:协调者收到所有参与者反馈的Ack消息后,完成事务提交
B.中断事务
有参与者返回NO,或等待结果超时后,中断事务
1.发送回滚请求:协调者向所有参与者发出Rollback请求
2.事务回滚:参与者收到Rollback请求后,利用Undo信息执行回滚操作,完成后释放资源
3.反馈结果:参与者完成事务回滚后,向协调者发送Ack消息
4.中断事务:协调者收到所有参与者反馈的Ack消息后,完成事务中断
优点
原理简单,实现方便
缺点
1.同步阻塞:执行过程中,所有参与该事务操作的逻辑处于阻塞状态,无法执行其他任务操作
2.单点问题:协调者出现问题,流程将无法流转。当在阶段二出现问题,会让其他参与者处于锁定状态,无法继续完成事务操作。如果提交事务时出现问题,只有部分参与者收到commit请求,导致数据不一致
3.脑裂:由于网络分区,某些参与者未收到commit请求,导致数据不一致。
4.太过保守:任一节点失败导致整个事务失败
3PC
3PC(Three-Phase Commit),三阶段提交。基于2PC的问题,进行了改进形成了3PC协议。
协议说明
三阶段提交协议将2PC的提交事务请求阶段一分为二,形成CanCommit,PreCommit,doCommit三个阶段。
阶段一:CanCommit