分布式一致性协议介绍

概述

在分布式系统中,由于一个事务操作需要跨越多个分布式节点,为了保持事务处理的ACID特性,所以引入了协调者参与者的概念。由协调者进行决策,参与者执行决策。并基于这种思想,衍生出2PC和3PC两种提交协议。

2PC

2PC,是Two-Phase Commit的缩写,即二阶段提交,是分布式一致性协议中的一种,用于保证分布式系统中的数据一致性。顾名思义,2PC将整个事务的提交过程分为了两个阶段进行操作。它们分别是:提交事务请求阶段和执行事务提交阶段

(阶段一)提交事务请求阶段

分布式一致性协议介绍_第1张图片

  1. 在上图中,协调者先向各个参与者发出一个询问请求,询问各个参与者能否执行事务提交操作,并等待参与者的回应
  2. 各个参与者收到询问后,执行事务操作,并将Undo和Redo的信息记入事务日志中
  3. 然后各个参与者根据自身情况向协调者反馈YES或者NO。YES表示事务可以执行;NO表示事务不能执行。

至此,2PC的阶段一执行完毕,阶段二会有两种情况,我将分别叙述。

(阶段二情况一)执行事务提交

分布式一致性协议介绍_第2张图片

进入该阶段的前提是所有的参与者皆返回YES响应。否则进入中断事务阶段
  1. 所有参与者在做完事务操作之后,向协调者反馈YES。协调者收到所有参与者的YES响应之后,向所有的参与者发出去commit请求,即表示各个参与者可以提交事务了,请求发送之后,会继续等待参与者的ACK反馈。
  2. 参与者收到 commit 请求后,开始提交事务,并在提交事务之后释放自己在这整个过程中所占有的资源。同时向协调者发送ACK反馈。
  3. 协调者收到所有参与者的ACK反馈后,整个事务完成。
(阶段二情况二)中断事务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JvtFNImp-1585147625908)(https://donkeyx.top/upload/2020/3/2pc-p2-2-83e2e53e4c404bfc8c59cd7fee411e4a.png)]

进入该阶段的条件是有任意的参与者向协调者返回NO或者在等待过程中等待超时
  1. 如果有任意的参与者向协调者返回NO或者协调者等待超时(等待参与者响应),那么协调者会向所有的参与者发送Rollback请求。
  2. 参与者在收到Rollback请求后则会按照之前记录在事务日志中的Undo信息,执行事务回滚操作,然后释放自己在这整个过程中所占有的资源,同时向协调者发送ACK反馈。
  3. 协调者收到所有参与者的ACK反馈之后,整个中断事务完成。
2PC总结

2PC就是简单的把事务的处理过程分为了投票和执行两个阶段,它的优点就是原理简单实现方便。但是它的缺点也很明显。比如同步阻塞单点问题数据不一致太过保守等问题。

同步阻塞 是因为在整个分布式事务的投票和执行阶段,各个参与者会等待其他参与者的响应,而在这个过程中无法做其他事情。

单点问题是因为整个分布式事务的处理过程都是由协调者进行调控,如果协调者出现问题,那么整个系统便会不可用。

数据不一致是因为分布式系统是通过网络进行通信,如果在阶段二,协调者发出了commit请求后,发生了局部网络异常,或者协调者未发送完commit请求后就宕机了,就会出现部分节点执行了提交事务操作,部分节点未执行提交事务操作的情况,从而导致整个分布式系统中的数据不一致的情况

太过保守是因为在协调者和参与者 的通信过程中,如果参与者down机,协调者只会依靠超时机制来判断是否需要中断事务,而没有其他方式。

3PC

3PC,即3阶段提交。3PC在2PC的基础上,将提交事务请求也就是第二阶段分为了2步,同时也为参与者增加了超时机制,所以3PC也解决了一部分2PC的问题

(阶段一)CanCommit阶段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HWGRPsCT-1585147625910)(https://donkeyx.top/upload/2020/3/3PC-canCommit-ff8d14d847584efd9622273cd20f68ee.png)]

  1. 协调者向所有参与者发送一个包含事务内容的canCommit请求,询问是否可以执行事务提交操作
  2. 参与者收到canCommit请求后,根据自身情况反馈YES或者NO

一阶段也是一个简单的投票过程,主要内容是后面两个阶段,都会分情况进行讨论

(阶段二情况一)preCommit阶段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o9lLo5n2-1585147625912)(https://donkeyx.top/upload/2020/3/3PC-preCommit-1-9c1cc2b5e51c4265acee24c09ca9dd5c.png)]
如果所有的反馈都是YES,那么将进入事务预提交阶段。

  1. 协调者收到所有参与者的YES反馈后,向所有参与者发出preCommit请求,此时进入Prepared阶段
  2. 参与者收到preCommit请求后,将Undo和Redo信息记录到事务日志中,然后向协调者反馈一个ACK请求,等待最终的指令

事务预提交阶段,完成了事务操作,并等待提交事务或者中断事务的指令

(阶段二情况二)中断事务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SAukeNN1-1585147625914)(https://donkeyx.top/upload/2020/3/3PC-preCommit-abort-1b4b44915590492abb9f02501f470807.png)]
如果有任意一个参与者反馈了NO或者协调者等待超时。那么将进入中断事务阶段

  1. 协调者收到NO或者等待超时,向所有参与者发送abort请求
  2. 中断事务,协调者不等待ACK响应

在该阶段,协调者发送了abort请求后即意味着事务中断,参与者即使没有收到这个请求,也会在等待超时之后自行中断事务。

(阶段三情况一)doCommit阶段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T9ZzDiVR-1585147625916)(https://donkeyx.top/upload/2020/3/3PC-doCommit-cf469e9bbead4b01bfb776877fb9f579.png)]
协调者在正常工作的前提下,并且收到了所有参与者的ACK响应,那么将会状态会从预提交转换到提交状态

  1. 协调者向所有参与者发送doCommit请求
  2. 参与者收到请求后,执行事务提交,完成后释放自己所占有的资源然后向协调者发送ACK消息
  3. 协调者收到所有参与者的ACK消息后,完成事务

这是 第三阶段的正常完成情况

(阶段三情况二)中断事务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZtpAKZa9-1585147625918)(https://donkeyx.top/upload/2020/3/3PC-doCommit-abort-c532b021e5ba42df83af8d2f315261db.png)]
进入该阶段的条件同preCommit的中断事务一样,只有协调者收到任何一个参与者的NO反馈或者等待超时后仍无法收到所有参与者的响应

这里的NO反馈,指的是doCommit阶段的NO反馈,意味着有参与者没有完成事务提交。

  1. 协调者向所有参与者发送abort请求
  2. 参与者收到abort请求后,按照事务记录日志中的Undo信息执行事务回滚操作,回滚完成后释放自己所占有的资源,然后向协调者发送ACK消息
  3. 协调者收到了所有参与者的ACK消息后,中断事务

进入了阶段三,无论是协调者出现问题还是协调者与参与者之间出现网络故障,参与者都会在等待超时之后自动进行事务提交

3PC 总结

3PC优点是降低了2PC的阻塞范围,且避免了单点问题。

你可能感兴趣的:(分布式服务相关,分布式,java)