分布式一致性协议
Posted share2perfect
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式一致性协议相关的知识,希望对你有一定的参考价值。
分布式一致性协议
分布式一致性协议包含二阶段提交协议、三阶段提交协议、Paxos算法。
二阶段提交协议(2PC)
二阶段提交协议处理过程分为了投票和执行两个阶段,其核心是对每个事务都采用先尝试后提交的处理方式,本质是强一致性算法。
阶段一:提交事务请求
1.事务询问
协调者发起请求,询问参与者是否可以执行事务。
2.执行事务
参与者收到事务请求后,执行事务,并把undo和redo写入log中
3.返回相应
参与者向协调者反馈是否可以执行。如果参与者成功执行事务,则返回yes响应;否则返回no响应
阶段二:执行事务提交
正常情况下:
1.发起事务提交
协调者向所有参与者发起commit请求
2.事务提交
参与者执行事务提交
3.反馈结果
参与者把执行事务提交的结果反馈给协调者
4.完成事务
异常情况下:
(如果有任何参与者提交事务失败,并把失败响应反馈给协调者,协调者会执行如下)
1.发起事务回滚
协调者向所有参与者发起rollback请求
2.执行事务回滚
参与者回滚事务
3.反馈回滚结果
4.中断事务
二阶段提交协议的优点:原理简单、实现方便
二阶段提交协议的缺点:同步阻塞、单点、脑裂、过于保守
同步阻塞:各个参与者在等待其他参与者响应的过程中,将无法进行其他任何操作
单点:协调者单点问题。如果在阶段二,协调者出现问题,会导致资源被占用无法释放
数据不一致:如果在阶段二,发生网络异常,部分参与者提交事务,部分未提交,导致数据不一致。
过于保守:协调者未收到参与者响应,就会根据自身的超时机制处理,没有完善的容错机制。
三阶段提交协议(3PC)
阶段一:CanCommit
1.事务询问
协调者向所有参与者发起一个cancommit请求,询问是否可以发起事务提交操作,并等待回应。
2.参与者反馈事务询问的响应
参与者根据自身情况,如果能够执行事务就返回yes响应,否则就返回no响应
阶段二:precommit
协调者根据阶段一反馈结果,执行操作:
(一) 执行事务预提交(所有参与者均返回yes响应)
1.发起预提交请求
协调者向所有参与者发起预提交请求,并进去prepared阶段。
2.事务预提交
各参与者收到请求后执行事务操作,并把undo和redo记录到log中
3.反馈结果
参与者执行完事务后,返回给协调者ack响应,同时等待最终指令:提交或者回滚
(二) 中断事务(参与者返回no响应,或者超时未收到响应)
1.发送中断请求
协调者向所有参与者发起中断请求
2.中断事务
各参与者收到协调者发送的中断请求,或者等待协调者请求的过程中出现超时,参与者都会进行中断事务
阶段三:docommit
该阶段进行真正的事务提交
(一) 执行提交
1.发送提交请求
进入阶段三,假设协调者处于正常状态,并且受到所有参与者的ack响应,那么会向所有参与者发送docommit请求。
2.事务提交
参与者收到docommit请求后,会执行事务提交操作
3.反馈事务提交结果
参与者执行完事务后,向协调者反馈ack消息
4.完成事务
协调者收到所有参与者响应后,完成事务
(二) 中断事务
1.发送中断请求
假设协调者处于正常状态,并且有任意一个参与者反馈了no响应,或者等待超时后协调者无法接收到所有参与者的反馈,协调者发起中断请求。
2.事务回滚
参与者收到中断请求后,利用阶段二中记录的undo信息,发起回滚操作。
3.反馈事务回滚结果
参与者完成事务回滚后,向协调者发送ack消息。
4.中断事务
协调者收到所有参与者反馈的ack消息后,中断事务。
备注:一旦进入阶段三,协调者出现问题,或者协调者和参与者之间网络出现问题,参与者等待超时后都会进行事务提交。
三阶段提交协议的优缺点
优点:1.降低了参与者的阻塞返回;2.出现单点故障后继续达成一致。
缺点:参与者收到precommit后,出现网络异常,但是参与者会继续提交事务,最终会出现数据不一致的情况。
Paxos算法
paxos算法类似于两阶段提交的算法:
(一) 选定提案
阶段一
- proposer选择一个提案编号Mn,然后向Acceptor的某个超过半数的子集成员发送编号为Mn的prepare请求。
- 如果一个acceptor收到一个编号为Mn的perpare请求,且编号Mn大于该acceptor已经响应过得所有prepare请求的编号,那么它就把批准过得最大编号的提案作为响应返回给proposer,同时acceptor承诺不会再批准任何编号小于Mn的提案。
阶段二
- 如果proposer收到来自半数以上的acceptor对于其发出的编号为Mn的prepare请求的响应,那么它就会发送一个针对【Mn,Vn】提案的accept请求给acceptor。Vn就是收到的响应中编号最大的提案的值。
- 如果acceptor收到这个针对【Mn,Vn】提案的accept请求,只要改acceptor尚未对编号大于Mn的prepare请求做出响应,它就可以通过这个提案。
(二) 获取提案
acceptor将批准的提案发送给一个特定的learner集合,该集合中的每个learner都可以在一个提案被选定后通知所有其他的learner。
以上是关于分布式一致性协议的主要内容,如果未能解决你的问题,请参考以下文章