Raft算法

Posted 程序技术分享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Raft算法相关的知识,希望对你有一定的参考价值。

                                    领导者选举


raft只支持领导者、跟随者、候选人三种状态,我们先看着三种状态

        领导者:一切以他为主,平时的工作就三部分,日志的复制,写请求,发心跳包告诉跟随者自己还活着。

        跟随者:接收并处理领导者发送的消息,接收领导者的心跳包,一旦超时没有接到心跳包,就选举自己为候选人。

        候选人:向其他节点发起投票请求,如获得大多数节点的选票,就晋升为领导者。

        

选举的过程和细节:

        1 首先,初始状态下,集群中所有节点的状态都是跟随者,Raft算法实现了随机的超时时间,每个节点等待领导者心跳包的超时时间是不同的,由图可以看出,集群中没有领导者,A超时时间最短,会最先超时。

        2  跟随者A超时后,会增加自己的任期编号,推荐自己为候选人,并投给自己一票,然后发送rpc请求,让其他跟随者,投自己一票

Raft算法(1)

        3 其他候选人接受到A的投票请求后,发现在任期编号为1的请求,还没有进行过投票,就会投给A,并增加自己的任期编号为1,

        4 此时候选者A获得了大多数的票数,就成为了本任期内的领导者,然后就会发送心跳包,告诉跟随者自己还活着,不要在私自投票,

规则:

        1 选举出领导者后,领导者会周期性的发送心跳信息(不包含日志项复制的信息),用于告诉大家,我是领导者,自己还活着,你们不能再投票。

        2 在一个任期内,领导者始终是领导者。领导者因为自身如宕机,网速慢等原因,跟随者在超时时间内,没收到心跳信息,就会推举自己为候选人,发起投票,超过半数票数,自己就晋升为领导者。

        3 在一次选举中,一个服务节点最多对一个任期编号投一次票,比如,节点B任期编号为2,收到节点A,任期编号为3的投票请求,B会发现在任期为3的编号还没投过票,会把票投给节点A,随后又收到来自节点C的任期也为3的投票请求,由于B已经投过了,就不会在给C投票了。

        4 日志完整性高的跟随者,拒绝投票给日志完整性低于自己的候选者,如,跟随者B比候选者A的完整性高,此时A在发起投票请求时候,B就会拒绝投票给他。


以上是关于Raft算法的主要内容,如果未能解决你的问题,请参考以下文章

分布式共识算法——Raft算法(图解)

分布式一致性算法:Raft 算法(Raft 论文翻译)

算法Raft算法详解

编程实践Raft 算法的原理 & go代码实例

raft算法基本原理

Raft算法概述