raft协议
Posted 修心而结网
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了raft协议相关的知识,希望对你有一定的参考价值。
what:
raft是分布式的一致性协议(Consensus),其相对pasox更加简单。用来保障servers上副本一致性的一种算法。
一致性协议是为了确保容错性,也就是即使系统中有一两个服务器当机,也不会影响其处理过程
how:
确保一致性的核心思想:
采用选举机制,参选者需要说服大多数选民(服务器)投票给他,一旦选定(leader)后,其他的server就是(follower)跟随leader操作,从而确保分布式的一致性。
选leader:
参考如下图(也是follower状态转化图):
Raft 的选主基于一种“心跳机制”。leader 会周期性的向所有节点发送心跳包来维持自己的权威。
第一步:准备选举自己
刚启动时,所以的server节点都是follower身份(Step: starts up)。没有leader时,某个server节点和leader的心跳先超时,它就会从follower变为candidate,而发起选举(Step: times out, starts election)。(注意:为了各节点不同时变为candidate,在各节点的固定超时时间上某个范围内的随机数)。如下图:
五节点都是follower身份,term为1,且选举超时定时器不同
第二步:开始选举自己:
节点身份切换为 candidate,并将term加上1。然后它会向集群其它节点发送“请给自己投票”的消息(RequestVote RPC)。
S1 率先超时,变为 candidate,term + 1,并向其它节点发出拉票请求
第三步:选择结果:
candidate会有3种结果,分别对应上面状态图的3条线。
1. 选举成功(Step: receives votes from majority of servers):
S1获得大部分选票。 S1变为leader,开始发送心跳维持权威
2、选举失败(Step: discovers current leader or new term):
Candidate 在等待投票回复的时候,收到其它自称是 leader 节点发送的心跳包,且term 不小于 candidate 当前的 term,那么 candidate 会承认这个 leader,并将身份切回 follower。term 比自己小,candidate 会拒绝这次请求并保持选举状态。
S4、S2 依次开始选举 S4 成为 leader;S2 在收到 S4 的心跳包,且term不小于自己的,则切为 follower 跟随S4
3、选举超时(Step: times out, new election):
多个 follower 同时成为 candidate,选票是可能被瓜分的,如果没有任何一个 candidate 能得到大多数节点的支持,那么每一个 candidate 都会超时。这里的“特殊处理”指的就是前文所述的随机化选举超时时间。此时 candidate 需要增加自己的 term,然后发起新一轮选举。
S1~S5都在参与选举 没有任何节点愿意给他人投票 没有随机化超时时间,所有节点将会继续同时发起选举……
第四步、老leader更换:
即上面状态图的:discovers server with higher term。一段时间后老 leader 恢复了(如:网络故障、或者机器宕机恢复),收到了来自新leader 的心跳包,发现心跳中的 term 大于自己的 term,此时该节点会立刻切换为 follower 并跟随的新 leader。
S4 作为 term=2 的 leader S4 宕机,S5 即将率先超时 S5 当选 term=3 的 leader
S4 宕机恢复后收到了来自 S5 的 term3 心跳 S4 立刻变为 S5 的 follower
以上是关于raft协议的主要内容,如果未能解决你的问题,请参考以下文章