目录
一、raft协议的目的
raft是一种一致性协议,在分布式系统中,确保在大部分ongoing的情况下,集群能正常工作并且给出一个正确的结果(业务可用)
二、raft协议的基础概念
节点角色:leader节点,follower节点
节点状态:leader状态,follower状态,candidate状态
term值:任期,每进行一次选举,任期值+1
commitIndex:标识当前节点已知的最大的已提交的日志索引值
lastApplied:当前节点已存储的最大索引
nextIndex数组:需要发送给每个follower节点的下一跳日志的索引值(看似冗余的数组,实际是防止发送失败)
matchIndex数组:已经复制给每个follower节点的最大的日志索引值
三、raft协议的选举
1、发起选举的条件
节点长时间没有收到leader节点的心跳,节点的选举计时器超时,发起新一轮选举。
2、赢得选举的条件
节点获得(包括失联节点在内的)集群中超过半数的选票。
3、选举过程
节点A长时间收不到心跳,发起投票,成为candidate状态,节点B收到A的消息时,如果仍处于Follower状态,则将票投给A并且重置选举定时器,否则节点为candidate状态(不可能为leader状态,如果是leader状态则无需投票),则选举失败。
四、raft协议的日志
1、本地日志保存
每个节点都会维护一个本地log用户记录更新操作,并且维护commitindex和lastApplied,主节点二外维护nextIndex和matchIndex数组。
2、日志同步方式
raft选择批量复制
3、日志复制时机
数据更新时日志会主动同步到从(follower)节点上
数据读取时日志如何操作(这个日志有关读到的数据)?
五、选举存在的问题以及raft协议的解决方式
1、如果选举的节点没有超过半数怎么办?
由于raft的半数节点是指集群中所有节点的半数,而不是可以收到心跳的半数,所以是有可能出现以下情况:部分集群连接不上,并且此集群的节点小于半数并且不包含leader节点。raft将先计算是否有超过半数的节点,如果不超过,则不进行选举。
2、如果选举的时候两个candidate节点相遇怎么办?
如果term值相等,则重新进行选举;否则以term值更大的未candidate节点。
3、如果选举的时候遇到leader节点怎么办?
选举的时候网突然好了,这个得翻源码。
4、如果leader节点相遇怎么办?
选term值较大的为leader节点。
六、日志存在的问题以及raft协议的解决方式
1、leader节点相遇时日志操作?
当集群被分为两个网络后又合并时,依据日志的任期号来决定日志如何保留(保留任期号大的),如果任期号相同,则使用索引比较大的。