分布式系统架构(二)——一致性协议


      分布式系统各个节点都在各自执行自己的事务操作,无法直接获取其他节点执行结果。为保证ACID特性,就需引入一个协调者统一调度分布式节点的执行逻辑。被调度的节点称为参与者。

一、两阶段提交协议:

阶段一:投票

     协调者------->参与者发送事务内容,寻味是否可执行事务提交操作

     协调者<-------参与者执行事务,并返回事务执行结果(成功or失败) ,并将redo、undo信息记录日志

阶段二:执行

     协调者根据参与者事务执行返回结果情况,来决定最终是否进行事务提交操作。

     1、执行事务提交

          发送commit请求给参与者,参与者提交事务,返回Ack,协调者接收Ack,完成事务

     2、不执行,中断事务

         发送rollback请求给参与者,参与者利用记录的undo信息执行事务回滚,完成回滚后发送Ack到协调者,协调者接收,完成事务中断。

        对每个事务都采用先尝试后提交的方式。

优点:

     1、原理简单,实现方便

缺点:

     1、同步阻塞:二阶段提交过程中,所有参与者的事务执行都处于阻塞状态,等待响应过程中无法进行其他任何操作

     2、协调者单点问题

     3、数据不一致:在协调者发送commit请求后,如果发生网络故障,只有部分参与者收到commit请求,则导致分布式系统中出现数据不一致问题。太过保守 

二、三阶段提交协议:

将二阶段两步走

阶段一:询问canCommit

     协调者------->参与者发送包含事务内容的canCommit请求

     协调者<-------参与者判断自身是否可以顺利执行事务,ok则返回yes,反之。

阶段二:预提交preCommit

     协调者根据返回结果情况判断是否进行预提交操作(假如任一参与者返回no,或等待超时,就进行事务中断。)。

     1、执行事务预提交

          协调者------->参与者发送preCommit请求,参与者接收,执行事务操作,记录undo、redo到事务日志

          参与者执行成功---返回Ack,并等待commit或abort终止命令。

阶段三:执行提交doCommit

         协调者接收了所有参与者执行完成preCommit并返回的Ack,则发送doCommit请求,参与者执行,完成之后,再次返回Ack消息。协调者接收到所有的Ack后,完成事务。

         如果有任一参与者返回no response,则发送abort中断指令。 

优点:相较于2PC,最大的优点就是降低了参与者阻塞范围。

缺点:并未解决2PC中网络故障导致的数据不一致问题。 

三、Paxos算法《待解》:

     一种基于消息传递的高容错一致性算法。“拜占庭帝国将军问题”

     引入“过半”理念,支持分布式节点间角色轮换,避免分布式单点问题。

猜你喜欢

转载自blog.csdn.net/daybreak1209/article/details/75145592
今日推荐