2.2 Paxos

基于消息传递且具有高度容错性的一致性算法

Paxos算法需要解决的问题就是如何在一个可能发生宕机或网络异常的分布式系统中,快速且正确地在集群内部对某个数值达成一致,且保证不论发生以上任何异常都不会破会系统一致性。

2.2.1 追本溯源

一种计算机容错理论,拜占庭将军问题 The Byzantine Generals Problem

 

选定提案算法描述

阶段一:

    • Proposer选择一个提案编号Mn,然后向Acceptor的某个超过半数的子集发送编号为Mn的Prepare请求
    • 如果一个Acceptor收到一个编号为Mn的Prepare请求,且编号Mn大于该Aceptor已经响应(promised)的所有Prepare请求的编号,那么它会将已经批准过的(accepted)最大编号的提案作为响应反馈给Proposer,同时该Acceptor会承诺不再批准(不再Accept)任何编号小于Mn的提案

举例说明:假定一个Acceptor已经响应过的所有Prepare请求对应的提案编号分别为1、2、...、5、 7,那么该Acceptor在接收到一个编号为8的Prepare请求后,就会将编号为7的提案作为相应反馈给Proposer。

阶段二:

    • 如果Proposer收到来自半数以上的Acceptor对于其发出的编号为Mn的Prepare请求的相应,那么它会发送一个针对[Mn,Vn]提案的Accept请求给Acceptor。注意,Vn的值是收到的响应中编号最大提案的值,如果响应中不包含任何提案,那么它就是任意值。
    • 如果Acceptor收到这个针对[Mn,Vn]提案的Accept请求,只要该Acceptor尚未对编号大于Mn的Prepare请求做出响应,它就可以通过这个提案。

Learner获取提案

    • 方案一:
      最简单的做法就是一旦Acceptor批准一个提案,就将该提案发送给所有Learner。这样可以将Leaner尽快获取被选中提案,但是通信次数至少为二者个数乘积。
    • 方案二:
      让Acceptor将它们对提案的批准情况,统一发送给一个特定的Learner(主learner),它负责通知其他Learner。通信次数大大减少,通常只是Acceptor和Learner个数的总和。但是引入了不稳定因素:主Learner随时可能出现故障。
    • 方案三:
      将方案二中主Learner范围扩大为一个特定Learner集合,该集合中每个Learner可以通知其他Learner。这个集合Learner个数越多,可靠性越好,同时网络通信复杂度越高

 

通过选取主Proposer保持算法的活性,避免陷入死循环

 

paxos 协议 过程 : Prepare  Promise  Propose  Accept

 

小结

    • 2PC 解决了分布式事务的原子性问题 ,带来了同步阻塞,无线等待,脑裂等问题
    • 3PC 引入PreCommit,缩短了阻塞,避免了无限期等待,但进入2阶段PreCommit后还存在数据不一致情况
    • Paxos 引入“过半”理念,即少数服从多数原则。支持节点角色轮换,避免单点问题,解决了无限期等待问题,解决了“脑裂”
posted @ 2019-07-05 14:33  vvf  阅读(171)  评论(0编辑  收藏  举报