其他分享
首页 > 其他分享> > RAFT共识协议学习(一)

RAFT共识协议学习(一)

作者:互联网

RAFT

共识协议也根据是否支持拜占庭故障,被划分为 CFT(Crash Fault Tolerance,故障容错)共识协议和 BFT(ByzantineFault Tolerance,拜占庭容错)共识协议。

典型的CFT协议:Paxos共识协议:以解决存在失败节点或网络不可靠情况下的容错和一致性问题

故障节点:节点因为繁忙,宕机或者网络问题等其他异常情况导致的无响应

作恶节点:除了可以故意对集群的其他节点的请求无响应之外,还可以故意发送错误数据,或者给其他节点发送不同的数据使整个集群无法达成共识

                                                  

首先介绍Raft共识协议

     简单来说,Raft协议是CET共识协议,Paxos的优化算法。

     Raft的最大容错数是(n-1)/2,假设集群的总结点数是n,故障节点数是f,根据少数服从多数原理,正常的节点需要比故障节点多一个就可以达成共识,也就是f+1,所以总节点数是2f+1

     举例,如果集群中有三个节点,那么不允许有节点有故障,否则无法进行工作,如果集群中共有4个节点,那么允许有一个节点有故障,如果集群中有5个节点,那么最多允许有2个节点出故障

                                        

角色

在Raft集群中共有三种角色,分别是领导者,候选者,跟随着

状态

领导者:集群中只有一个处于领导者状态的服务器,负责响应所有客户端的请求。

候选者:跟随者状态服务器准备发起新的领导者选举前需要转换到的状态,是跟随者和领导者的中间状态。

跟随者:刚启动时所有节点为跟随者状态,响应领导者的日志同步请求,响应候选者的投票请求  。

任期

Raft中有任期的概念,每个领导者都有自己的任期,这个任期就是一个编号,任期到期就需要开始新一轮选举,在每个任期内,可以没有领导者,但是不能出现大于两个的领导者。

关于上述,任期到期是指节点发生故障需要重新选举领导者,在任期内,只要领导者节点运行正常不会挂掉,那么任期号不会变,一直会由当前领导者节点保持这个任期号。

领导选举机制

在集群初始,集群中是没有领导者节点的,那么就需要进行选举,每个节点会随机设置自己的选举超时时间,如果节点超过选举超时时间,节点就会增加任期号称为候选人,当然每个节点都有称为候选者的权利,正是由于随机选举超时时间的存在,使得每个节点称为候选人的时机不同,率先超过选举超时时间的节点会最先的称为候选人,并向其他节点发送心跳以获取票数,在节点没有成为候选者的时候,当他收到候选者发送的心跳,就会投出自己的票保持跟随者的状态,因为候选者节点的任期号已经自动增加,自己的任期号低于候选者的任期号;如果有两个节点同时超过选举超时时间,那么他们向其他节点寻求投票,如果本轮并没有选举出领导者,他们此时是候选者状态,集群中有节点超过选举超时时间会自动增加任期号请求投票,上一轮的候选者会成为跟随者,因为他们的任期号低于这轮的任期号。也就是候选人等待投票期间,如果没有任何候选人获得多数票,那么就利用raft算法的随机选举超时时间来解决如果收到其他节点发来的心跳,比较任期号,大于就胜任leader,小于就败选leader。

如果候选人节点收到n台服务器中至少n/2+1张选票,这个节点就会成为领导者

日志复制

1.客户端向领导者发请求

2.领导者将新的日志附加到自己日志并发送心跳给跟随者

3.跟随着确认收到并反馈

4.领导者收到大多数反馈就更新确认状态机,通知所有跟随着更新自己的状态机

注意:raft算法中,leader会强制跟随着更新日志保证分布式节点的日志一致性

安全性(Raft可能会出现的各类问题)

1.宕机,节点重新选取

2.网络分区,双领导问题

3.leader收到客户端请求,还未复制到跟随着节点发生故障,启动选取

4.leader收到客户端请求,成功复制到跟随着但尚未收到确认发生故障,拥有最新数据的节点成为领导者

5.两份日志任期号不同,按日期号大的进行更新

6.如果投票时跟随者的日志比候选人的新,那么拒绝该人的投票请求

总结

Raft共识可应用于非拜占庭容错环境,并在网络延迟,分区,丢包,冗余,乱序等错误出现保证操作的正确性,在联盟链和私有链场景中有很大的用武之地

Raft动画:https://raft.github.io/

标签:候选者,协议,任期,领导者,跟随者,集群,共识,RAFT,节点
来源: https://blog.csdn.net/rainbowIT/article/details/117474225