浅谈分布式系统一致性之3PC协议
一.写在前面
图(网络)|猎户座大星云
二.3PC的出现
三. 3PC协议的基本过程
3.1 CanCommit阶段
图:询问阶段所有参与者均具备执行事务条件
图:询问阶段存在不具备条件的参与者
3.2 PreCommit阶段
-
CanCommit阶段一致通过
在第一阶段所有参与者都 Ready,那么协调者就会向参与者发送本地执行的相关指令,这部分和 2PC 的第一阶段非常相似,参与者收到指令后进行本地事务执行,并记录日志,并且对处理结果反馈到协调者,来做决策。过程中参与者可能成功或者失败,出现了两种情况:
图:PreCommit阶段参与者均反馈成功
图:PreCommit阶段参与者中存在失败实例
-
CanCommit阶段存在分歧
在第一阶段如果存在参与者不 Ready 的情况,那么协调者就会发送信号给所有参与者,告知本次事务取消了,该干啥干啥吧,对参与者来说损失并不大,因为本质上参与者并没有做什么事情。
3.3 DoCommit阶段
-
PreCommit阶段一致通过
在 PreCommit 之后参与者全部完成本地事务执行但是没有提交,并且都给协调者 ACK 回复,这时协调者认为万事俱备只欠东风了,在 DoCommit 阶段协调者向参与者发送提交指令,参与者收到之后开始执行本地提交,并反馈结果,最终完成这次事务,Cool!
-
PreCommit阶段存在分歧
协调者在第二个阶段 PreCommit 收到参与者的反馈后,发现存在部分参与者无法执行事务的情况,这时就决定告诉其他参与者本地回滚,释放资源,取消本次事务。
四. 3PC中的超时策略
-
参与者等待 PreCommit 超时
协调者和参与者之间可能存在较大的网络延时,或者协调者出现故障,或者出现网络分区等情况,参与者并不会傻等,在超过设定时间之后,参与者就继续做之前的事情了,因为好像被大哥鸽了,只能该干啥干啥,这也是正确的决策。 -
参与者等待 DoCommit 超时
在 CanCommit 和 PreCommit 之后,参与者认为大家都对齐了都是棒棒的,如果参与者在设定时间内并没有收到协调者的 DoCommit 指令,那么就本地执行提交完成这次事务,因为参与者揣测大哥的意思大概率也是让我们提交,干等着也不是办法,回滚可能和大家不一样,抉择之下参与者选择提交事务。 -
协调者等待反馈超时
3PC协调者的等待超时处理和2PC基本上是一样的,无论在哪个阶段超时都认为不具备条件,进行 abort 或者 rollback 操作,这个非常好理解。