码迷,mamicode.com
首页 > 其他好文 > 详细

分布式一致性协议

时间:2018-09-02 20:14:27      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:算法   一致性   写入   方便   accept   rollback   集成   指令   被占用   

分布式一致性协议

分布式一致性协议包含二阶段提交协议、三阶段提交协议、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算法类似于两阶段提交的算法:

(一)   选定提案

阶段一

  1. proposer选择一个提案编号Mn,然后向Acceptor的某个超过半数的子集成员发送编号为Mn的prepare请求。
  2. 如果一个acceptor收到一个编号为Mn的perpare请求,且编号Mn大于该acceptor已经响应过得所有prepare请求的编号,那么它就把批准过得最大编号的提案作为响应返回给proposer,同时acceptor承诺不会再批准任何编号小于Mn的提案。

阶段二

  1. 如果proposer收到来自半数以上的acceptor对于其发出的编号为Mn的prepare请求的响应,那么它就会发送一个针对【Mn,Vn】提案的accept请求给acceptor。Vn就是收到的响应中编号最大的提案的值。
  2. 如果acceptor收到这个针对【Mn,Vn】提案的accept请求,只要改acceptor尚未对编号大于Mn的prepare请求做出响应,它就可以通过这个提案。

(二)   获取提案

acceptor将批准的提案发送给一个特定的learner集合,该集合中的每个learner都可以在一个提案被选定后通知所有其他的learner。

分布式一致性协议

标签:算法   一致性   写入   方便   accept   rollback   集成   指令   被占用   

原文地址:https://www.cnblogs.com/share2perfect/p/9563717.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!