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