分布式系统一致性协议

分布式系统一致性协议

2PC 与 3PC

在分布式系统中,每一个机器节点虽然能够明确地知道自己在进行事务操作过程中的结果是成功或失败,但却无法直接获取到其他分布式节点的操作结果。因此一个事务操作需要跨越多个分布式结点的时候,为了保持事务处理的ACID特性,就需要引入一个称为”协调者(Coordinator)“的组件来统一调度所有分布式节点的执行逻辑,这些被调度的分布式节点被称为”参与者(participant)“。协调者负责调度参与者的行为,并最终决定这些参与者是否把事务真正进行提交。基于这个思想,衍生出了二阶段提交和三阶段提交两种协议。

2PC

2PC是tow-phase-commit的缩写,是计算机网络尤其是数据库领域内,为了使基于分布式系统架构下的所有节点在进行事务处理过程中能够保持原子性和一致性而设计的一种算法。

二阶段提交协议是将食物的提交过程分成了两个阶段来进行处理

阶段一:提交事务请求
  1. 事务询问

协调者向所有参与者发送事务请求,询问是否可以执行事务提交操作,并开始等待各参与者响应

  1. 执行事务

各参与者执行事务操作,并将 Undo 和 Redo 信息记入事务日志中

  1. 各参与者向协调者反馈事务执行的响应

如果参与者成功执行了事务操作,那么就反馈给协调者Yes响应,表示事务可以执行,如果参与者没有成功执行事务,那么就反馈给协调者No响应,表示事务不可以执行

阶段二:执行事务提交

在阶段二中,协调者会根据各参与者的反馈情况来执行最终是否可以进行事务提交操作。

如果 执行事务提交

  1. 发送提交请求
  2. 事务提交
  3. 反馈事务提交结果
  4. 完成事务

如果 中断事务

  1. 发送回滚请求
  2. 事务回滚
  3. 反馈回滚结果
  4. 中断事务

v2-a4e64702fb9e389e57008eb0e2f49c14_r.jpg

优缺点

二阶段提交协议的优点:原理简单,实现方便

二阶段提交协议的缺点:同步阻塞,单点问题,脑裂,太过保守

  1. 同步阻塞:最大的问题即同步阻塞,即:所有参与事务的逻辑均处于阻塞状态。
  2. 单点问题:协调者存在单点问题,如果协调者出现故障,参与者将一直处于锁定状态。
  3. 脑裂:在阶段2中,如果只有部分参与者接收并执行了Commit请求,会导致节点数据不一致。

3PC

3PC 是three-phase commit的缩写,是2PC的改进版,将2PC的提交事务请求过程一分为二,形成了由CanCommit、PreCommit 和 do Commit 三个阶段组成的事务处理协议。

阶段一:CanCommit
  1. 事务询问

协调者向所有参与者发出包含事务内容的CanCommit请求,询问是否可以提交事务,并等待所有参与者响应。

  1. 各参与者向协调者反馈事务询问的响应

参与者收到CanCommit请求后,如果认为可以执行事务操作,则反馈YES并进入预备状态,否则反馈NO。

阶段二:PreCommit

此阶段分两种情况:

  • 所有参与者均反馈YES,即执行事务预提交。
  • 任何一个参与者反馈NO,或者等待超时后协调者尚无法收到所有参与者的反馈,即中断事务。

事务预提交

  1. 协调者向所有参与者发出PreCommit请求,进入准备阶段。
  2. 参与者收到PreCommit请求后,执行事务操作,将Undo和Redo信息记入事务日志中(但不提交事务)。
  3. 各参与者向协调者反馈Ack响应或No响应,并等待最终指令(提交或终止)。

中断事务

  1. 协调者向所有参与者发出abort请求。
  2. 无论收到协调者发出的abort请求,或者在等待协调者请求过程中出现超时,参与者均会中断事务。
阶段三:doCommit

此阶段也存在两种情况:

  • 所有参与者均反馈Ack响应,即执行真正的事务提交。
  • 任何一个参与者反馈NO,或者等待超时后协调者尚无法收到所有参与者的反馈,即中断事务。

提交事务:(所有参与者均反馈Ack响应时)

  1. 如果协调者处于工作状态,则向所有参与者发出do Commit请求。
  2. 参与者收到do Commit请求后,会正式执行事务提交,并释放整个事务期间占用的资源。
  3. 各参与者向协调者反馈Ack完成的消息。
  4. 协调者收到所有参与者反馈的Ack消息后,即完成事务提交。

中断事务:(任何一个参与者反馈NO,或者等待超时后协调者尚无法收到所有参与者的反馈时)

  1. 如果协调者处于工作状态,向所有参与者发出abort请求。
  2. 参与者使用阶段1中的Undo信息执行回滚操作,并释放整个事务期间占用的资源。
  3. 各参与者向协调者反馈Ack完成的消息。
  4. 协调者收到所有参与者反馈的Ack消息后,即完成事务中断。

需要注意的是,一旦进入阶段三,可能会存在以下两种故障

  • 协调者出现问题
  • 协调者和参与者之间的网络出现故障

无论出现哪种情况,最终都会导致参与者无法及时收到来自协调者的doCommit或是abort请求,针对这样的异常情况,参与者都会在等待超时之后,继续进行事务提交。

优缺点

较2PC,3PC最大的头有点就是降低了参与者的阻塞范围,并且能够再出现单点故障后继续达成一致。

3PC的缺点:3PC去除阻塞的同事也引入了新的问题,那就是参与者接收到preCommit消息后,如果出现网络分区,此时协调者所在的结点和参与者无法进行正常的网络通信,在这种情况下,该参与者依然会进行事务的提交,这必然出现数据的不一致性。

参考资料

  • 从 Paxos 到 ZooKeeper 分布式一致性原理与实践.倪超.电子工业出版社