什么是3PC
Three-phase commit protocol
在计算机网络和数据库中,三阶段提交协议(3PC)是一种分布式算法,它允许分布式系统中的所有节点都同意提交事务。与2PC不同,3PC是非阻塞的。具体来说,3PC为事务提交或中止之前所需的时间设置了上限,确保如果一个给定的事务试图通过3PC提交并持有一些资源锁,那么它将在超时后释放锁。
协议描述
在描述协议时,我们使用了与两阶段提交协议中使用的术语类似的术语。因此,我们有一个协调器(Coordinator)领导事务,一组由协调器指导的一个或多个队列。
- 阶段一:CanCommit
1.事务询问
协调者向所有的参与者发送一个canCommit请求,询问是否可以执行事务提交操作,并开始等待参与者的响应。
2.事务询问反馈
各参与者向协调者反馈事务询问的响应。参与者在接收到协调者的canCommit请求后,正常情况下,如果其自身认为可以顺利执行事务,那么会反馈Yes响应,并进入预备状态,否则反馈No响应。 - 阶段二:PreCommit
执行事务预提交
假如协调者从所有的参与者获得的反馈都是Yes,那么就会执行事务预提交。
1.发送预提交请求
协调者向所有参与者节点发出preCommit请求,并进入Prepared阶段。
2.事务预提交
参与者接收到preCommit请求后,会执行事务操作,并将undo和redo信息记录到驶入日志中。
3.各参与者向协调者反馈事务执行的响应
如果参与者成功执行了事务操作,那么就会反馈给协调者Ack响应,同时等待最终的指令:提交或中止。
中断事务
假如任何一个参与者向协调者反馈了No响应,或者在等待超时之后,协调者尚无法接收到所有参与者的反馈响应,那么就会中断事务。
1.发送中断请求
协调者向所有参与者发送abort请求。
2.中断事务
无论是收到来自协调者的abort请求,或者是在等待协调者请求过程中出现超时,参与者都会中断事务。 - 阶段三:doCommit
该阶段进行真正的事务提交。
执行提交
1.发送提交请求
2.事务提交
3.反馈事务提交结果
4.完成事务
中断提交
该阶段,假设协调者处于正常工作状态,并且有任意一个参与者向协调者反馈了No响应,或者在等待超时之后,协调者无法接收到所有参与者的反馈响应,那么就中断事务。
1.发送中断请求
2.事务回滚
3.反馈事务回滚结果
4.中断事务
优缺点
在阶段三,可能会存在两种故障:
- 协调者出现问题
- 协调者与参与者之间的网络出现问题
这两种情况都会最终都会导致参与者无法及时收到来自协调者的doCommit或者abort请求,针对这样的异常情况,参与者都会在等待超时之后,继续进行事务提交。
优点:相对于二阶段提交,三阶段提交的优点有:(1)降低了参与者的阻塞范围(将二阶段提交的阶段一一分为二,并引入超时中断事务机制)(2)能够在出现单点故障后继续达成一致
缺点:三阶段提交在去除阻塞的同时也引入了新的问题,那就是在参与者接收到preCommit后,如果出现网络分区(此时协调者所在的节点和部分参与者无法进行正常的网络通信),在这种情况下,一部分参与者依然会进行事务提交,另一部分参与者收到abort请求中止事务,从而造成数据的不一致。
参考:https://en.wikipedia.org/wiki/Three-phase_commit_protocol