raft算法的简单理解

看了一下raft算法,自己尝试简单的描述一下

 

1.最初无leader(领导者)的时候,进行领导选举(Leader Election)。所有节点开始进行随机时间的倒计时,这个随机时间一般是150-300ms,最先倒计时结束的A节点会率先成为condidate(候选者),他的选票会投给自己,然后去询问其他未成为condidate的节点,这些节点会投票给A,然后A成为leader。

2.日志复制(Log Replication)。客户端发送信息给leader,leader会将数据存入它的log,此时它自身还没有提交这个数据,Leader然后在最近的一个Heartbeat timeout时发送给Follower节点,follower也会将数据存入log(也就是现在所有节点都没有提交,都只是存到log),然后响应leader(我们follower都存入log了),leader接收到响应后,将数据保存起来,响应给客户端,告诉他提交保存了,然后发消息给follower,让他们也都保存起来。Follower保存后通知leader,leader也响应给客户端,告诉他所有节点都保存了,此时所有节点信息一致,结束。

 

3.Leader会一直对follower进行心跳检测HeartbeatTimeout,以判断是否有节点挂掉,这个心跳时间通常要远小于倒计时时间。

 

4.假如主节点leader挂掉了,那么follower无法收到leader的心跳,他们就会继续进行随机倒计时选举,先倒计时结束的成为condidate,重复步骤1,成为leader。然后继续对其他节点心跳检测。

 

5.假如两个节点同时倒计时结束成为候选者,他们同时投票给自己,然后向其他人发起投票,收到选票后,他们票数一致,无法选举成功,他们两个会再进行第二轮倒计时,率先完成的发起投票,以此成为leader。

 

6.假如网络分区了,比如ABCDE五个节点,A为leader,AB在一起,CDE在一起,则AB正常运行心跳检测,由于CDE无法收到检测,他们会重新选举,即重复步骤4。假如选举出来C为leader。客户端假如发送A数据,A会存入log,并通知B存入log,(即步骤2的部分过程),但由于A代表的是小部分节点,所以AB他们无法提交数据,只在log保存,客户端发信息给C,C代表大多数,则正常运行完步骤2。假如后期修复了网络问题,则由于C代表大多数已提交log,leaderA下台,此时只剩下C。AB将回滚其未提交的log,和C保持一致,由此保持数据log在集群中一致性。

 

 

你可能感兴趣的:(算法)