分布式之一致性协议(2PC,3PC)

2PC

二阶段提交协议是将事务的提交过程分成了两个阶段来进行处理,流程如下:

阶段一:提交事务请求(投票阶段)
  1. 事务询问
    协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应。
  2. 执行事务
    各参与者节点执行事务操作,并将Undo和Redo信息记入事务日志中。
  3. 各参与者向协调者反馈事务询问的响应。
    如果参与者成功执行了事务操作,那么就反馈给协调者Yes响应,表示事务可以执行;如果参与者么有成功执行事务,那么就反馈给协调者No响应,表示事务不可用执行。
阶段二:执行事务提交(执行阶段)
  • 执行事务提交(协调者从所有参与者获得的反馈都是Yes)

    1. 发送提交请求:协调者向所有参与者节点发出Commit请求。
    2. 事务提交:参与者接受到Commit请求后,会正式执行事务提交操作,并在完成提交之后释放在整个事务执行期间占用的事务资源。
    3. 反馈事务提交结果:参与者在完成事务提交之后,向协调者发送Ack消息。
    4. 完成事务:协调者接受到所有参与者反馈的Ack消息后,完成事务。
  • 中断事务(任何一个参与者向协调者反馈了No,或者等待超时)

    1. 发送回滚请求:协调者向所有参与者节点发出Rollback请求。
    2. 事务回滚:参与者接受到Rollback请求后,会利用其在一阶段中记录的Undo信息来执行事务回滚操作,并在回滚完成后释放在整个事务执行期间占用的资源。
    3. 反馈事务回滚结果:参与者在完成事务回滚之后,向协调者发送Ack消息。
    4. 中断事务:协调者接受到所有参与者反馈的Ack消息后,完成事务中断。

优缺点:

优点:原理简单,实现方便
缺点:同步阻塞、单点问题、脑裂、太过保守


3PC

阶段一:CanCommit
  1. 事务询问:协调者向所有的参与者发送一个包含事务内容的canCommit请求,询问是否可以执行事务提交操作,并开始等待各参与者的响应。
  2. 各参与者向协调者反馈事务询问的响应:参与者在接受到来自协调者的canCommit请求后,正常情况下,如果其自身认为可以顺利执行事务,那么会反馈Yes响应,并进入预备状态,否则反馈No响应。
阶段二:PreCommit(根据阶段一的反馈)
  • 执行事务预提交(协调者从所有参与者获得的反馈都是Yes)

    1. 发送预提交请求:协调者向所有参与者节点发送preCommit请求,并进入Prepared阶段。
    2. 事务预提交:参与者接受到preCommit请求后,会执行事务操作,并将Undo和Redo信息记入事务日志。
    3. 各参与者向协调者反馈事务执行的响应:如果参与者成功执行 了事务操作,那么就会反馈给协调者Ack响应,同时等待最终的指令:提交中止
  • 中断事务(任何一个参与者向协调者反馈了No,或等待超时)

    1. 发送中断请求:协调者向所有参与者节点发送abort请求。
    2. 中断事务:无论是收到来自协调者的abort请求,或者是在等待协调者请求过程中出现超时,参与者都会中断事务。
阶段三:doCommit(真正的事务提交)
  • 执行提交

    1. 发送提交请求:进入这一阶段,假设协调者处于正常工作状态,并且收到了来自所有参与者的Ack响应,那么它将从“预提交”状态转换到“提交”状态,并向所有的参与者发送doCommit请求。
    2. 事务提交:参与者收到doCommit请求后,会正式执行事务提交操作,并在完成提交之后释放在整个事务执行期间占用的事务资源。
    3. 反馈事务提交结果:参与者在完成事务提交之后,向协调者发送Ack消息。
    4. 完成事务:协调者接受到所有参与者反馈的Ack消息后,完成事务。
  • 中断事务(协调者处于正常工作状态,任意一个参与者反馈了No,或者等待超时后)

    1. 发送中断请求:协调者向所有参与者节点发送abort请求。
    2. 事务回滚:参与者接受到abort请求后,会利用其在阶段二中记录的Undo信息来执行事务回滚操作,并在完成回滚之后释放在整个事务执行期间占用的资源。
    3. 反馈事务回滚结果:参与者在完成事务回滚以后,向协调者发送Ack消息。
    4. 中断事务:协调者收到所有参与者反馈的Ack消息后,中断事务。
优缺点:

优点:降低了参与者的阻塞范围,并且能够在出现单点故障后继续达成一致。
缺点:在去除阻塞的同时引入了新的问题,即:参与者在接受到preCommit消息后,如果网络出现分区,此时协调者所在的节点和参与者无法进行正常的网络通信,在这种情况下,该参与者依然会进行事务提交,这必然出现数据的不一致性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
分布式系统一致性协议是用于确保在分布式系统中的多个节点之间达成一致状态的协议。在分布式系统中,由于网络延迟、节点故障等原因,节点之间的数据可能会出现不一致的情况。一致性协议的目标是通过协调节点之间的操作,使得系统在面对各种故障和并发操作时能够保持一致性。 常见的分布式系统一致性协议包括: 1. 两阶段提交(Two-Phase Commit,2PC):2PC是一种基于中心协调者的协议,它通过两个阶段的消息交换来实现一致性。第一阶段是准备阶段,协调者向参与者发送准备请求,并等待参与者的响应。第二阶段是提交阶段,协调者根据参与者的响应决定是否提交或中止事务。2PC的缺点是存在阻塞和单点故障问题。 2. 三阶段提交(Three-Phase Commit,3PC):3PC是对2PC的改进,引入了超时机制来解决阻塞问题。它将2PC的准备阶段拆分为canCommit和preCommit两个阶段,并引入超时机制来处理参与者和协调者的故障。 3. PaxosPaxos是一种基于消息传递的一致性协议,用于解决分布式系统中的一致性问题。Paxos通过选举一个提议者和多个接受者来达成一致,它具有高度的容错性和可扩展性。 4. Raft:Raft是一种相对于Paxos更易理解和实现的一致性协议。Raft将一致性问题分解为领导选举、日志复制和安全性三个子问题,并通过选举一个领导者来协调节点之间的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步一点_点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值