分布式系统一致性协议:2PC&3PC

分布式系统一致性协议

在分布式系统当中,一致性,可用性,分区容错性排列组合,成为CAP理论中的三种情况,如果有不了解的同学可以先参照小灰灰之前写过的一篇博客简单了解一下(https://blog.csdn.net/yangchenhui666/article/details/92014829)。
对于一个分布式系统而言,分区容错性是一个最基本的要求。服务必然会被部署到不同的网络节点,否则就不存在所谓的分布式系统了,所以在分布式系统当中,必然会出现子网络。根据CAP理论,在架构上必须在一致性和可用性上面作出权衡,但是一般的分布式系统,都会存在大量的并发,可用性往往是需要保证的,所以,解决分布式系统问题,很多时候就变成了解决分布式一致性问题。
在这里插入图片描述
由于网络分区,各个子系统虽然知道自己系统当中事务是否有执行成功,但是对于其他系统的事务状态是无法确定的。所以在这种情况下,需要引入一个协调者来统一调度各个网络节点的事务执行,根据各个节点的事务执行情况,判断这个分布式事务最后是否提交。
基于这个思想,衍生出了2PC和3PC协议。

2PC

二阶段事务提交就是将事务的提交过程分为两个阶段进行:

1、提交事务请求

1、协调者向所有的参与者发送事务内容,询问该事务是否可以提交;
2、参与者执行事务,并将Undo和Redo信息记录到事务日志中;
3、参与者向协调者发送事务执行结果,成功即为Yes,失败即为No。

整个过程看上去可以看作是所有参与者对协调者发起的事务的一次投票,所以2PC的第一个阶段也被称作为“投票阶段”,每个参与者都会表明自己能否执行该事务。

2、执行事务提交

协调者根据所有参与者返回状态,确定是否提交事务,任意一个参与者返回No,则表示该事务不能够被提交。如果所有的参与者都返回Yes,表示可以发送事务提交指令,所以2PC的第二阶段会有一下两种情况:

I、执行事务提交

1、协调者向所有的参与者发送提交请求;
2、参与者执行事务,释放事务资源;
3、完成事务提交后,向协调者发送Ack消息;
4、协调者接收到所有Ack消息,完成事务。
在这里插入图片描述

II、中断事务提交

1、协调者向所有参与者发送事务回滚请求;
2、参与者通过事务日志,执行事务回滚,回滚完成后释放系统资源;
3、完成事务提交后,向协调者发送Ack消息;
4、协调者收到所有Ack消息,中断事务提交。
在这里插入图片描述

2PC优缺点

优点

1、原理简单,实现方便

缺点

1、同步阻塞
在投票阶段,必须同步等待所有的参与者返回投票结果后才能够进行下一步操作,这会极大的限制分布式系统的性能。
2、单点问题
在2PC的成员组成中,我们可以看到协调者只有一个,如果协调者出现单点故障问题,那么整个2PC过程将会受到影响。
如果在投票阶段出现问题,那么参与者将同步阻塞等待其他参与者的事务提交返回状态,但是由于协调者已经挂掉,他们将接收不到事务提交或者事务回滚的指令。
还有一种严重的情况就是,如果在第二阶段只是向部分参与者发送了事务执行指令,协调者挂掉,那么将会出现分布式系统中数据不一致的情况。
3、没有容错机制
如果协调者向所有的参与者发送指令后,但是有一个参与者宕机,协调者无法收到ACK消息时,就只能够等到超时,才能够判断事务是否应该中断。没有好的容错机制,导致任意一个参与者事务的失败都会导致整个事务的失败。

3PC

数据库的XA、JTA事务提交就是使用的2PC策略,3PC由于超时时间的复杂性,基本没有被真正的应用过,下面简单的介绍下3PC。
在这里插入图片描述
3PC即为Three-Phase Commit,3PC将2PC的第二阶段分成了两个部分,所以3PC的三个阶段分别为:CanCommit,PreCommit,DoCommit.

CanCommit

1、事务询问,协调者向参与者发送事务请求;
2、参与者向协调者返回响应结果;

PreCommit

跟2PC的一样,会存在两种情况:

I、执行事务预提交

1、协调者向所有参与者发送预提交请求,并进入Prepare阶段
2、事务预提交,参与者接收请求,记录Undo,Redo日志,执行事务预提交
3、参与者返回ACK消息给协调者,并等待最终指令:Commit,Abort

II、中断事务

1、协调者向所有参与者返送Abort请求;
2、中断事务,不论是收到协调者的Abort请求,还是自身等待超时,参与者都会中断事务;

DoCommit

进行最后的事务提交,这个过程中仍然会出现两种情况。

I、执行提交

1、如果协调者处于正常工作状态,并且接收到所有的ACK确认,就向所有的参与者发送事务提交请求;
2、参与者执行事务提交操作,完成事务提交并释放资源;
3、参与者向协调者发送ACK消息;
4、协调者接收到消息,完成事务

II、中断事务

1、如果协调者处于正常工作状态,并且接收任意一个No的ACK确认,或者超时仍没有接收到所有的ACK确认,就向所有的参与者发送中断事务请求;
2、协调者接收到Abort请求后,执行事务回滚操作,释放系统资源;
3、完成事务回滚后,向协调者发送ACK确认;
4、协调者接收到所有参与者的ACK确认,中断事务。

进入到DoCommit阶段后,不管参与者是否接收到DoCommit指令或者Abort指令,在等待超时之后,都会提交事务。

3PC的优缺点

优点

降低了参与者的阻塞范围,2PC阶段中,参与者在第一阶段就阻塞等待指令,但是3PC,到第二阶段才阻塞;
只要参与者接收到PreCommit指令后,协调者出现单点问题,仍然能够达成一致性。

缺点

如果只有部分参与者接收到PreCommit指令,随后协调者宕机,将会出现数据不一致的情况。

发布了10 篇原创文章 · 获赞 23 · 访问量 937

猜你喜欢

转载自blog.csdn.net/yangchenhui666/article/details/98512432