从Paxos到ZooKeeper-一致性协议之2PC、3PC

2022年10月3日11:16:45

一、2PC

    在上一节ZooKeeper-分布式架构中有讲到,分布式系统架构设计中往往是在系统可用性和数据一致性之间进行反复权衡,于是产生了系列一致性协议

    在分布式系统中,每个节点都能明确知道自身事务操作结果,但无法直接获取到其他分布式节点的操作结果。所以当一个事务要横跨多个节点时,为了保证事务处理的ACID特性而引入了协调者组件来统一调度所有分布式节点(参与者)的执行逻辑,协调者调度参与者的行为并最终决定是否把参与者的事务进行真正的提交

    2PC(Two-Phase Commit 两阶段提交):完成参与者的协调,统一决定事务的提交或回滚,使基于分布式系统架构下的所有节点在进行事务处理过程中能够保持原子性和数据一致性

1. 协议说明

    二阶段提交协议将事物的提交过程分为两个阶段处理

(1)提交事务请求

事务询问:协调者向所有参与者发送事务内容,询问是否可以执行事务提交操作,等待响应
执行事务:参与者节点执行事务操作,并记录Undo和Redo信息到事务日志
参与者响应:若参与者成功执行事务,则向协调者反馈Yes响应,否则反馈No响应

(2)执行事务提交-提交

    如果所有参与者的反馈都是Yes响应,那么执行事务提交

发送提交请求:协调者向所有参与者发送Commit请求
事务提交:参与者接受到Commit请求后执行事务提交操作并释放占用的事务资源
反馈事务提交结果:参与者完成事务提交后向协调者发送Ack消息
完成事务:协调者收到所有参与者的Ack响应后,完成事务提交

从Paxos到ZooKeeper-一致性协议之2PC、3PC

(3)执行事务提交-中断

    如果任何一个参与者返回了N响应或者协调者等待超时后就会中断事务

发送回滚请求:协调者向所有参与者发送Rollback请求
事务回滚:参与者受到请求后通过Undo信息执行事务回滚操作并释放占用的事务资源
反馈事务回滚结果:参与者回滚事务后向协调者发送Ack消息
中断事务:协调者接收到所有参与者的Ack响应后,完成事务中断

从Paxos到ZooKeeper-一致性协议之2PC、3PC

2. 优缺点

(1)优点

    原理简单,实现方便

(2)缺点

同步阻塞:在阶段二事务提交过程中,所有参与者的操作逻辑都处于阻塞状态,等待其他参与者响应,协调者请求
单点问题:一旦协调者出现问题,阶段二提交流程无法运转,并且参与者会一直处于锁定事务资源的状态,无法继续事务操作
数据不一致:当协调者向所有参与者发送了Commit请求后局部网络异常或协调者半路出错导致只有部分参与者收到Commit请求,造成系统出现数据不一致
太过保守:任何一个参与节点的失败使得协调者无法获取所有参与者的响应信息都会导致整个事务的失败

二、3PC

    3PC(Three-Phase Commit 三阶段提交)将二阶段提交的提交事务请求过程一分为二,形成CanCommit、PreCommit、doCommit三个阶段

从Paxos到ZooKeeper-一致性协议之2PC、3PC

1.协议说明

(1)CanCommit

事务询问:协调者向所有参与者发送包含事务内容的CanCommit请求,询问是否可以执行事务提交操作,等待响应
参与者响应:参与者接收到CanCommit请求后判断自身能够顺利执行事务,能则返回Yes响应并进入预备状态,否则返回No响应

(2)PreCommit

  • 执行事务预提交

    如果所有参与者反馈都为Yes响应,则执行事务预提交

    发送预提交请求:协调者向所有参与者节点发出PreCommit请求,并进入Prepared阶段
    事务预提交:参与者接收到PreCommit请求后执行事务操作,并记录Undo和Redo信息到事务日志中
    参与者响应事务执行结果:若参与者成功执行事务后则返回Ack响应给协调者,等待最终命令

  • 中断事务

    若任何一个参与者反馈了No响应或者协调者等待超时则中断事务

    发送中断请求:协调者向所有参与者节点发出Abort请求
    中断事务:无论收到Abort请求或者等待协调者请求超时,参与者都会中断事务

(3)DoCommit

  • 执行提交

    发送提交请求:当协调者收到所有参与者反馈的Ack响应,向所有参与者发送DoCommit请求,从预提交状态转到提交状态
    事务提交:参与者接收到DoCommit请求后,正式执行事务提交操作,并释放占用的事务资源
    反馈事务提交结果:参与者完成事务提交后向协调者发送Ack消息
    完成事务:协调者接受到所有参与者反馈的Ack响应后,完成事务

  • 中断事务

    发送中断请求:协调者向所有参与者节点发出Abort请求
    事务回滚:参与者接收到Abort请求后,利用Undo信息执行事务回滚操作,并释放占用的事务资源
    反馈事务回滚结果:参与者完成事务回滚后向协调者发送Ack消息
    中断事务:协调者接收到所有参与者反馈的Ack响应后,中断事务

    第三阶段中若参与者无法及时接收到协调者发送的DoCommit或者Abort请求都会在等待超时后继续进行事务提交

2. 优缺点

(1)优点

    降低参与者的阻塞范围,能够在出现单点故障后继续达成一致

(2)缺点

    接受者接收到PreCommit消息后,如果出现网络分区导致协调者和参与者无法正常通信,这时参与者仍会进行事务提交,造成数据的不一致

  • 作者:DWWWWWEI
  • 原文链接:https://blog.csdn.net/qq_29999343/article/details/78261681
    更新时间:2022年10月3日11:16:45 ,共 2055 字。