Raft论文阅读笔记

Raft是一种用于解决复制状态机一致性问题的算法。在此之前,Leslie Lamport老爷子的Paxos算法是处理一致性问题的主流算法,但是Paxos过于玄学,难以理解,而Raft对处理一致性问题的过程进行了简化,将其分为leader选举、日志拷贝、安全性等一系列环节,从而更加易于理解。
在Raft中,每个server只有三种状态:leader、follower、candidate。其转换关系为

Raft将分布式系统运行的环节分为一个个整数递增编号的term,可以理解为leader的任期。每个term内至多只有一个leader,因此每个term内可以分为开始阶段的选举时期和之后的正常工作时期。若选举失败,则该term内只有选举时期,继续进行下一term。每个server会保存自己当前的term值。Raft可以总结为如下图所示。

leader选举

最开始,每个server都是follower身份。follower需要定期接收到来自leader的心跳信号,即一个空的AppendEntires RPC,从而保证当前时刻是有leader正常工作。假如在超出一定时间后仍没接收到来自leader的心跳信号,则该server就会认定leader出现故障,需要重新选举leader。超时的时间设置为随机数,如100-500ms。在认为leader失效、重新开始选举后,follower就会转变为candidate,将自身term加一,在首先为自己投一票后,就向其他server发送RequestVote RPC进行拉票。在此之后,若拉到的票数超出总server数量的一半,则该candidate就会转变为新的leader,同时开始定时向各follower发送心跳信号来巩固自己的领导地位;假若此时又接收到来自合法leader的信号,则该candidate又会重新转变为follower;如果本次选举内没有成功选出任何leader,比如同时有多个candidate进行拉票,则将会将term数加一,重新开始新一轮的拉票竞选。
成功竞选为leader的条件是需要拿到超过总server数一半以上的票数,而每个server只能投一票,因此每个term期间至多有一位leader。为尽可能避免同时有多位candidate进行竞选,通常每个server的超时时间选用随机数的形式,从而保证有server率先拉票赢得选举。

日志复制

一条日志由index、term和指令内容三部分组成,其中index为指令按照时间序列的编号,保证了指令的唯一性与先后顺序,term为任期。log保存在永久性存储设备如磁盘上,保证了信息的持久性。首先client向leader发送指令,leader会将该指令先加入本地日志,然后复制至各follower处,follower在接收到来自leader的信号并向leader返回成功信号,假如leader接收到的成功信号超过总server数的一半,则leader则会将该指令commit,写入本地,同时通知client操作成功,并通知各follower将该条日志写入各自复制状态机。假如leader向某follower发送失败,则leader会无限重复发送直至成功。index与term编号的唯一性决定了假如在两台server上的两条日志有相同的index和term,则这两条指令必定相同。并且,假如一条日志commit成功,则代表该条日志之前的所有日志都commit成功。原因在于leader发送的AppendEntries RPC包含了上一条日志的编号,接收到的follower只有在在当前编号与leader上一条编号相同时才能成功接收新的添加指令。如图所示。

leader变更

在每个新的leader的term刚开始时,上一任leader可能对不同follower仅将部分日志复制完成,因此需要保证新的leader的日志是完整的。在Raft中,一旦一个leader中的日志已经commit,则该内容将会永久保存在之后所有的leader的日志中。并且,leader的日志内容从来都不会被重写,只能够添加新的日志,而日志内容只有commit之后才能保存在本地。那么,该如何选取合适的leader从而避免日志丢失呢。在选举阶段,需要尽可能保证candidate具有完整的日志信息,因此candidate的RequestVote RPC中包含其本地已成功commit的最新的index和term编号,而接收到拉票信息的follower则会将该信息与自身index和term做对比,若candidate的term小于自身term或term相等但index小于自身index,则该follower则会拒绝为其投票。通过选举准则与commit准则双重要求,保证了每次选举出的leader都具有完整的已成功commit的所有日志信息。
在新的leader成功当选后,需要对其他follower进行日志修正,一方面,对于日志不全的follower,需要对其补充亏缺的日志;对于含多余日志的follower,则需要将其多余日志进行删除。

旧leader处理

或许由于网络原因,在新的leader选举成功后,旧的leader仍然存在,因此需要对旧leader进行处理。此时,旧的leader通过与新leader的term编号进行对比,发现自身term较小,则会自动变为follower,并更新自身term与新leader相同。

client协议

由于client的指令只能发送给leader,因此在leader未知时,client需要将指令发送给所有server,而follower接收到来自client的指令后,则会重定向至当前leader。同时,为了避免多条重复指令发送给leader,leader会根据指令中的index和term进行判断,确定是否是重复指令。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值