前面的文章中,我们介绍了分布式系统中的CAP理论和BASE理论,本文会就分布式事务的实现方案之一:两阶段提交(2PC)进行介绍。2PC是一个非常经典的强一致、中心化的原子提交协议。中心化是指协议中有两类节点:一个是中心化协调者节点(coordinator)和N个参与者节点(partcipant)。
2PC
一致性概念
一致性,是指对每个节点一个数据的更新,整个集群都知道更新,并且是一致的,假设一个具有N个节点的分布式系统,当其满足以下条件时,我们说这个系统满足一致性:
- 全认同: 所有N个节点都认同一个结果;
- 值合法: 该结果必须由N个节点中的过半节点提出;
- 可结束: 决议过程在一定时间内结束,不会无休止地进行下去;
一致性的挑战
消息传递异步无序: 现实网络不是一个可靠的信道,存在消息延时、丢失,节点间消息传递做不到同步有序:
- 节点宕机: 节点持续宕机,不会恢复;
- 节点宕机恢复: 节点宕机一段时间后恢复,在分布式系统中最常见;
- 网络分化: 网络链路出现问题,将N个节点隔离成多个部分;
- 拜占庭将军问题: 节点或宕机或逻辑失败,甚至不按套路出牌抛出干扰决议的信息。
2PC原理
2PC(tow phase commit)两阶段提交。所谓的两个阶段是指:
- 第一阶段:准备阶段(投票阶段)
- 第二阶段:提交阶段(执行阶段)。
我们将提议的节点称为协调者(coordinator),其他参与决议节点称为参与者(participants, 或cohorts)。
2PC第一阶段
2PC的第一阶段是投票环节,投票由协调者节点发起,可以进一步细分为以下步骤:
- 事务询问:协调者向所有的参与者发送事务预处理请求,称之为Prepare,并开始等待各参与者的响应。
- 执行本地事务:各个参与者节点执行本地事务操作,但在执行完成后并不会真正提交数据库本地事务,而是先向协调者报告说:“我这边可以处理了/我这边不能处理”。
- 各参与者向协调者反馈事务询问的响应:如果参与者成功执行了事务操作,那么就反馈给协调者Yes响应,表示事务可以执行,如果没有参与者成功执行事务,那么就反馈给协调者No响应,表示事务不可以执行。
第一阶段执行完后,会有两种可能。1、所有都返回Yes. 2、有一个或者多个返回No。
2PC第二阶段:正常提交
如果第一阶段所有的参与者都返回Yes,那么我们就可以继续执行2PC第二阶段的正常提交步骤:
- 协调者节点通知所有的参与者Commit事务请求;
- 参与者收到Commit请求之后,就会正式执行本地事务Commit操作,并在完成提交之后释放整个事务执行期间占用的事务资源。