Raft理论知识详解

Posted 每日运维

tags:

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

Raft 是一种为了管理复制日志的一致性算法。Raft是针对复制日志的一致性协议。

在Raft中,任何时候一个服务器可以扮演下面角色之一:
Leader: 处理所有客户端交互,日志复制等,一般一次只有一个Leader.
Follower: 类似选民,完全被动
Candidate候选人: 可以被选为一个新的领导人。

raft的工作模式是一个Leader和多个Follower模式,即我们通常说的领导者-追随者模式。

Leader的选举过程:
raft初始状态时所有server都处于Follower状态,并且随机睡眠一段时间,这个时间在0~1000ms之间。最先醒来的server A进入Candidate状态,
Candidate状态的server A有权利发起投票,向其它所有server发出requst_vote请求,请求其它server给它投票成为Leader。
当其它server收到request_vote请求后,将自己仅有的一票投给server A,同时继续保持Follower状态并重置选举计时器。当server A收到大多数
(超过一半以上)server的投票后,就进入Leader状态,成为系统中仅有的Leader。raft系统中只有Leader才有权利接收并处理client请求,并向其它server发出添加日志请求来提交日志。(整个选举过程是有一个时间限制的)

注意:Splite Vote是因为如果同时有两个候选人向大家邀票,这时通过类似加时赛来解决,两个候选者在一段timeout比如300ms互相不服气的等待以后,
因为双方得到的票数是一样的,一半对一半,那么在300ms以后,再由这两个候选者发出邀票,这时同时的概率大大降低,那么首先发出邀票的的候选者得到了大多数同意,成为领导者Leader,而另外一个候选者后来发出邀票时,那些Follower选民已经投票给第一个候选者,不能再投票给它,它就成为落选者了,最后这个落选者也成为普通Follower一员了。

日志复制过程:
Leader选举出来后,就可以开始处理客户端请求。Leader收到客户端请求后,将请求内容作为一条log日志添加到自己的log记录中,并向其它server发送append_entries(添加日志)请求。其它server收到append_entries请求后,判断该append请求满足接收条件,如果满足条件就将其添加到本地的log中,并给Leader发送添加成功的response。Leader在收到大多数server添加成功的response后,就将该条log正式提交。提交后的log日志就意味着已经被raft系统接受,并能应用到状态机中了。Leader具有绝对的日志复制权力,其它server上存在日志不全或者与Leader日志不一致的情况时,一切都以Leader上的日志为主,最终所有server上的日志都会复制成与Leader一致的状态。

安全方面:
1、Leader选举过程中,如果有两个serverA和B同时醒来并发出request_vote请求怎么办?
由于在一次选举过程中,一个server最多只能投一票,这就保证了serverA和B不可能同时得到大多数(一半以上)的投票。如果A或者B中其一幸运地得到了大多数投票,就能顺利地成为Leader,raft系统正常运行下去。但是A和B可能刚好都得到一半的投票,两者都成为不了Leader。这时A和B继续保持Candidate状态,并且随机睡眠一段时间,等待进入到下一个选举周期。由于所有server都是随机选择睡眠时间,所以连续出现多个server竞选的概率很低。

2、Leader挂了后,如何选举出新的Leader?
Leader正常运作时,会周期性地发出append_entries请求。这个周期性的append_entries除了可以更新其它Follower的log信息,另外一个重要功能就是起到心跳作用。Follower收到append_entries后,就知道Leader还活着。如果Follower经过一个预定的时间(一般设为2000ms左右)都没有收到Leader的心跳,就认为Leader挂了。于是转入Candidate状态,开始发起投票竞选新的Leader。每个新的Leader产生后就是一个新的任期,每个任期都对应一个唯一的任期号term。这个term是单调递增的,用来唯一标识一个Leader的任期。投票开始时,Candidate将自己的term加1,并在request_vote中带上term;Follower只会接受任期号term比自己大的request_vote请求,并为之投票。这条规则保证了只有最新的Candidate才有可能成为Leader。

3、Follower在收到一条append_entries添加日志请求后,是否立即保存并将其应用到状态机中去?如果不是立即应用,那么由什么来决定该条日志生效的时间?
Follower在收到一条append_entries后,首先会检查这条append_entries的来源信息是否与本地保存的leader信息符合,包括leaderId和任期号term。检查合法后就将日志保存到本地log中,并给Leader回复添加log成功,但是不会立即将其应用到本地状态机。Leader收到大部分Follower添加log成功的回复后,就正式将这条日志commit提交。Leader在随后发出的心跳append_entires中会带上已经提交日志索引。Follower收到Leader发出的心跳append_entries后,就可以确认刚才的log已经被commit(提交)了,这个时候Follower才会把日志应用到本地状态机。下表即是append_entries请求的内容,其中leaderCommit即是Leader已经确认提交的最大日志索引。Follower在收到Leader发出的append_entries后即可以通过leaderCommit字段决定哪些日志可以应用到状态机。

附加:
term:leader的任期号
leaderId:leader的ID,以便follower重定向请求
prevLogIndex:新的日志条目紧随之前的索引值
prevLogTerm:prevLogIndex条目的任期号
entries[]:准备存储的日志条目(表示心跳时为空,一次多条为提高效率)
leaderCommit:领导人已经提交的日志的索引值

4、只有具有最新日志的server的才有资格去竞选当上Leader,具体是怎么做到的呢?
首先任何server都还是有资格去发起request_vote请求去拉取投票的,request_vote中会带上server的日志信息,这些信息标明了server日志的新旧程度,其它server收到request_vote后,判断如果lastLogTerm比自己的term大,那么就可以给它投票;lastLogTerm比自己的term小,就不给它投票。如果相等的话就比较lastLogIndex,lastLogIndex大的话日志就比较新,就给它投票。

附加:
term:候选人的任期号
candidateId:请求选票的候选人的Id
lastLogIndex:候选人的最后日志条目的索引值
lastLogTerm:候选人最后日志条目的任期号

5、向raft系统中添加新机器时,由于配置信息不可能在各个系统上同时达到同步状态,总会有某些server先得到新机器的信息,有些server后得到新机器的信息。比如下图raft系统中新增加了server4和server5这两台机器。只有server3率先感知到了这两台机器的添加。这个时候如果进行选举,就有可能出现两个Leader选举成功。因为server3认为有3台server给它投了票,它就是Leader,而server1认为只要有2台server给它投票就是Leader了。raft怎么解决这个问题呢?

raft系统中有一部分机器使用了旧的配置,有一部分使用新的配置,解决这个问题的方法是添加一个中间配置(Cold, Cnew),这个中间配置的内容是旧的配置表Cold和新的配置Cnew。这个时候server3收到添加机器的消息后,不是直接使用新的配置Cnew,而是使用(Cold, Cnew)来做决策。比如说server3在竞选Leader的时候,不仅需要得到Cold中的大部分投票,还要得到Cnew中的大部分投票才能成为Leader。这样就保证了server1和server2在使用Cold配置的情况下,还是只可能产生一个Leader。当所有server都获得了添加机器的消息后,再统一切换到Cnew。raft实现中,将Cold,(Cold,Cnew)以及Cnew都当成一条普通的日志。配置更改信息发送Leader后,由Leader先添加一条 (Cold, Cnew)日志,并同步给其它Follower。当这条日志(Cold, Cnew)提交后,再添加一条Cnew日志同步给其它Follower,通过Cnew日志将所有Follower的配置切换到最新。

算法的设计通常会把正确性,效率或者简洁作为主要的目标。尽管这些都是很有意义的目标,但是我们相信,可理解性也是一样的重要。






以上是关于Raft理论知识详解的主要内容,如果未能解决你的问题,请参考以下文章

机器学习从入门到精通系列之BP神经网络理论知识详解

DW吃瓜课程——机器学习理论知识笔记

分布式_理论_06_ 一致性算法 Raft

golang-raft算法理论与实践

数仓初识-理论知识

常见图片格式详解