paxos算法简析

今天听到了一个笑话,原文如下:The Paxos algorithm, when presented in plain English, is very simple.

嗯,我们接着说,paxos算法应该是最经典的分布式一致性算法了(考虑各种异常处理),后续的raft和zab都可以认为是其延伸与变种,本文也会对raft做简单介绍。下面先尝试讲一下paxos算法到底是解决了什么问题,有哪些前置设定与其要求。

一、paxos解决的问题:

众所周知,cap不可兼得。一般来讲我们会选择可用性与分区容错性,而在一致性上只追求多数一致性。即当多个节点之间不一致时,少数服从多数,以多数的结果为准

二、paxos的前置设定:

1、在paxos一致性算法中,存在三种参与者,即提案人,投票人,执行人。又提案人进行提议,投票人进行投票,执行人进行执行结果。

2、所有提案带有序号,序号根据时间单调递增。后提出的提案一定比先提出的提案序号更大。

3、同参与者之间可以通过发送消息来通信,使用普通的非拜占庭模式的异步模型:

    • 每个参与者以任意的速度执行,可能会出错而停止,也可能会重启。
    • 当一个提案被选定后,所有的参与者都有可能失败或重启,因此那些失败或重启的参与者可以记录他们的历史应答信息(否则是不可能存在一个解的)。
    • 消息在传输中可能花费任意的时间,可能会重复,丢失,但是不会被损坏(即不存在拜占庭将军问题)。

4、我们假定投票人总数为2p+1

5、每一条提案,提案人会向投票人发起两次请求,即准备投票请求和投票请求。只有当准备投票请求被半数以上的投票人接受是,才会真正发起投票请求,而投票请求通过,才会通知执行人执行投票请求中的值。

6、投票人会记得自己曾经同意过的序号最大的选举请求的序号和值。

7、提案人只需要通知多与p+1个投票人即可,单如果提案想被执行,需要p+1个投票人同意。

三、paxos算法的描述:

原作者在Paxos Made Simple 论文中采取了根据结果倒推条件并逐步收紧的描述,简单描述最后的条件如下:

1、任一投票者只要还未响应任何编号大于 n 的prepare请求,就可以接受一个编号为 n 的提案。

2、一个值为k编号为n的提案如果想被提出,一定要满足以下两种条件之一:

    • p+1的选举者已经拒绝了所有1到n-1之间的提案
    • n是当前所有选举者同意过的,序号最大的提案的值

3、当投票者接到序号为n准备投票请求时,需要进行以下操作

    • 保证不再接受任何序号小于n的投票请求(进一步优化,可以不再接受序号小于等于的准备请求)
    • 如果曾经接受过序号小于n的投票请求,返回序号最大的请求的序号和值

按照如上条件,我们可以按照请求顺序去推演一次序号为n的投票流程:

1、提案者序号为n的请求准备

2、投票者不再接受序号小于n的请求,并且返回曾经接受过的序号最大的请求

3、提案者汇总所有投票者对于准备请求的回执,取其中序号最大的回执的值,作为此次提案的值。如果值不存在,则提案者可以自定义提案值

4、投票者只要尚未同意过值大于n的提案,就通过值为n的提案

四、paxos算法时序图:

4.1投票出结果后,再次发起投票

image.png

  • 3.1中的3表示第三轮请求,1表示由s1提出,X为接受的提案值
  • 由于x已经被s3接受,所以P4.5在s3中会返回x,后续的投票请求的值自然也是x。

4.2投票被部分接受后,尚未形成结果再次发起投票

image.png

4.3投票未被多数接受时,再次发起投票

image.png

  • 在A3.1X发出到S3机器,但是尚未响应前,此时发起p4.5,s3,s4,s5均未能返回值,所以s4定义了提案值为Y。并且被通过。
  • 后续A3.1在s3会被拒绝。

五、活锁:

image.png

如啥按图所示,s1与s5交互提案,会导致活锁。

实际实现过程,可有通过修改每次参与的投票者,或者随机新一轮提案产生时间的延时,均可解决此问题

六、raft:

basic-paxos算法,大多数时间,还是难以理解与实现(实际上paxos的强大之处更多地在于可以兼容太多异常情况)。于是有了基于paxos做出一定简化的raft算法,

    • raft算法中有三种角色,分别是跟随者,领导人,候选人。所有节点初始态都是跟随者。
    • 所有节点会默认同意任意投票请求
    • 每个节点有一个随机的升职时间,如果到达升职时间,还是跟随者,那么该节点会向其余所有节点发出投票请求,最近获取票数最多的节点会自动升职为领导人。并向其他跟随者发送消息,让他们变更为候选人
    • 候选人依旧会在随机时间后,发起投票想把自己变成领导人。为了防止篡位,领导人会在一个比所有随机时间更短的时间周期内,发出心跳消息,让所有候选人重置随机时间(比如后续人篡位随机时间在4-10秒,那么心跳消息间隔就是3秒)。
    • 当领导人宕机后,有可能多个候选人正好一起觉醒想篡位。那么他们会形成平票,此时不形成领导者。只需要等候下一次投票即可,由于随机时间不同,所以连续平票概率极低
    • 领导者选出后,后续修改请求会先请求领导人,此时领导人会与候选人中以类似2pc的方式进行通信同步修改。但是领导人只要收到半数或超过半数的候选人声明准备修改成功,他就会修改自身并通知候选人提交修改,同时对外返回修改成功。

参考资料:

1、Paxos Made Simple英文原文

2、Paxos Made Simple中文译文

3、分布式一致性算法原理剖析及其在实战中的应用

posted @ 2020-12-08 10:33  豆豆323  阅读(382)  评论(0编辑  收藏  举报