One minute
分布式一致性协议2PC&3PC
在分布式系统中,每一个机器节点最然都能够,明确知道自己在进行事务操作的过程中是成功还是失败,但却无法直接获取其他分布式节点的操作结果。因为事务操作需要跨越多个分布式节点时,需要引入一个协调者统一调度所有节点的执行逻辑。
2PC
2pc协议共分为提交事务请求,执行事务提交两个阶段。
阶段一:提交事务请求
事务询问
- 协调者向所有参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应。
执行事务
- 各参与者节点执行事务操作,并将其操作写入到本地事务日志中。
各参与者向协调者反馈事务询问的响应
- 如果参与者成功执行了事务操作,那么就反馈给协调者YES响应,表示事务可以执行。
- 如果参与者没有成功过事务操作,那么就反馈给协调者No响应,表示事务不可以执行。
阶段二:执行事务提交
在阶段二中协调者会根据参与者反馈的情况来决定,最终是否可以进行事务的提交操作。
假如协调者收到参与者的反馈都是YES时,那么就会执行事务提交。
- 协调者向所有参与者发送正式提交事务的请求(即Commit请求)。
- 参与者执行Commit请求,并释放整个事务期间占用的资源。
- 各参与者向协调者反馈ACK完成的消息。
- 协调者收到所有参与者反馈的ACK消息后,即完成事务提交。
假如协调者收到任何一个参与者反馈NO,那么就执行中断事务
- 协调者向所有参与者发出回滚请求(即RollBack请求)
- 参与者根据阶段一事务日志中的操作执行回滚操作,并释放整个事务期间占用的资源。
- 各参与者向协调者反馈ACK完成的消息。
- 协调者收到所有参与者反馈的ACK消息后,完成事务中断。
2PC的缺陷
同步阻塞:即所偶参与的事务逻辑均处于阻塞状态。
单点故障:协调者存在单点故障问题,如果协调者出现故障,参与者将一直处于锁定状态。
脑裂问题:在阶段二中,如果只有部分参与者接受并执行了Commit请求,会导致节点数据不一致。
2PC的优点
原理简单,实现方便。
3PC
三阶段提交协议,是2pc的改进版本,即将事务的提交过程分为CanCommit,PreCommit,DoCommit三个阶段呢来进行处理。
阶段一:CanCommit
协调者向所有参与者发出包含事务内容的CanCommit请求,询问是否可以提交事务,并等待所有参与者的反馈。
参与者收到CanCommit请求后,如果认为可以执行事务操作,则反馈YES,并进入预备状态,否则反馈NO。
阶段二:PreCommit
此阶段分两种情况
事务预提交:(所有参与者反馈YES时)
- 协调者向所有参与者发出PreCommit请求,进入准备阶段。
- 参与者收到PreCommit请求后,执行事务操作,并记录到事务日志中。(但不提交事务)
- 各参与者向协调者反馈ACK响应或者NO响应,并等待最终指令。
中断事务:(任何一个参与者反馈NO或者等待超时后,协调者无法收到所有参与者的反馈时)
- 协调者向所有参与者发出abort(中止)请求。
- 无论是收到协调者发出的abort请求,或者在等待协调者请求过程中出现超时,均会中断事务。
阶段三:DoCommit
此阶段也存在两种情况
提交事务:(所有参与者反馈YES响应时)
- 如果协调者处于工作状态,则向所有的参与者发送DoCommit请求。
- 各参与者收到DoCommit请求后,会正式执行事务提交,并释放整个事务期间占用的资源。
- 各参与者向协调者发送ACK,反馈完成的消息。
- 协调者收到所有参与者反馈的ACK消息后,即完成事务提交。
中断事务:(任何一个参与者反馈NO,或者等待超时后,协调者无法收到所有参与者的反馈时)
- 如果协调者处于工作状态,则向所有参与者发送abort请求。
- 参与者根据阶段二事务日志中的信息执行回滚操作,并释放整个事务期间占用的资源。
- 各参与者向协调者发送ACK反馈完成的消息。
- 协调者收到所有参与者反馈的ACK消息后,即完成事务中断。
进入阶段三之后,无论协调者出现问题,或者协调者和参与者网络出现问题,都会导致参与者无法接收到协调者发出的DoCommit请求或abort请求,此时参与者都会在等待超时之后继续执行事务提交。
3PC的优点
降低了阻塞范围:在等待超时后,协调者或参与者会中断事务。
避免了协调者单点故障:阶段3中协调者出现问题时,参与者会继续提交事务。
3PC的缺陷
- 脑裂问题依然存在,即在所有参与者收到PreCommit请求后,等待最终指令。如果此时协调者无法和参与者正常通信,会导致参与者继续提交事务,造成数据的不一致。
无论2PC或3PC均无法彻底解决分布式一致性问题,解决一致性问题唯有Paxos算法。