在分布式系统中,每一个机器节点最然都能够,明确知道自己在进行事务操作的过程中是成功还是失败,但却无法直接获取其他分布式节点的操作结果。因为事务操作需要跨越多个分布式节点时,需要引入一个协调者统一调度所有节点的执行逻辑。

2PC

2pc协议共分为提交事务请求,执行事务提交两个阶段。

阶段一:提交事务请求

  1. 事务询问

    • 协调者向所有参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应。
  2. 执行事务

    • 各参与者节点执行事务操作,并将其操作写入到本地事务日志中。
  3. 各参与者向协调者反馈事务询问的响应

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

阶段二:执行事务提交

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

  • 假如协调者收到参与者的反馈都是YES时,那么就会执行事务提交。

    1. 协调者向所有参与者发送正式提交事务的请求(即Commit请求)。
    2. 参与者执行Commit请求,并释放整个事务期间占用的资源。
    3. 各参与者向协调者反馈ACK完成的消息。
    4. 协调者收到所有参与者反馈的ACK消息后,即完成事务提交。
  • 假如协调者收到任何一个参与者反馈NO,那么就执行中断事务

    1. 协调者向所有参与者发出回滚请求(即RollBack请求)
    2. 参与者根据阶段一事务日志中的操作执行回滚操作,并释放整个事务期间占用的资源。
    3. 各参与者向协调者反馈ACK完成的消息。
    4. 协调者收到所有参与者反馈的ACK消息后,完成事务中断。

2PC的缺陷

  • 同步阻塞:即所偶参与的事务逻辑均处于阻塞状态。

  • 单点故障:协调者存在单点故障问题,如果协调者出现故障,参与者将一直处于锁定状态。

  • 脑裂问题:在阶段二中,如果只有部分参与者接受并执行了Commit请求,会导致节点数据不一致。

2PC的优点

原理简单,实现方便。


3PC

三阶段提交协议,是2pc的改进版本,即将事务的提交过程分为CanCommit,PreCommit,DoCommit三个阶段呢来进行处理。

阶段一:CanCommit

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

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


阶段二:PreCommit

此阶段分两种情况

  1. 事务预提交:(所有参与者反馈YES时)

    • 协调者向所有参与者发出PreCommit请求,进入准备阶段。
    • 参与者收到PreCommit请求后,执行事务操作,并记录到事务日志中。(但不提交事务)
    • 各参与者向协调者反馈ACK响应或者NO响应,并等待最终指令。
  2. 中断事务:(任何一个参与者反馈NO或者等待超时后,协调者无法收到所有参与者的反馈时)

    • 协调者向所有参与者发出abort(中止)请求。
    • 无论是收到协调者发出的abort请求,或者在等待协调者请求过程中出现超时,均会中断事务。

阶段三:DoCommit

此阶段也存在两种情况

  1. 提交事务:(所有参与者反馈YES响应时)

    • 如果协调者处于工作状态,则向所有的参与者发送DoCommit请求。
    • 各参与者收到DoCommit请求后,会正式执行事务提交,并释放整个事务期间占用的资源。
    • 各参与者向协调者发送ACK,反馈完成的消息。
    • 协调者收到所有参与者反馈的ACK消息后,即完成事务提交。
  2. 中断事务:(任何一个参与者反馈NO,或者等待超时后,协调者无法收到所有参与者的反馈时)

    • 如果协调者处于工作状态,则向所有参与者发送abort请求。
    • 参与者根据阶段二事务日志中的信息执行回滚操作,并释放整个事务期间占用的资源。
    • 各参与者向协调者发送ACK反馈完成的消息。
    • 协调者收到所有参与者反馈的ACK消息后,即完成事务中断。

进入阶段三之后,无论协调者出现问题,或者协调者和参与者网络出现问题,都会导致参与者无法接收到协调者发出的DoCommit请求或abort请求,此时参与者都会在等待超时之后继续执行事务提交。


3PC的优点

  • 降低了阻塞范围:在等待超时后,协调者或参与者会中断事务。

  • 避免了协调者单点故障:阶段3中协调者出现问题时,参与者会继续提交事务。


3PC的缺陷

  • 脑裂问题依然存在,即在所有参与者收到PreCommit请求后,等待最终指令。如果此时协调者无法和参与者正常通信,会导致参与者继续提交事务,造成数据的不一致。

无论2PC或3PC均无法彻底解决分布式一致性问题,解决一致性问题唯有Paxos算法。