raft算法是分布式系统开发首选的一致性算法
角色分为:
跟随者(Follower):接收领导者的消息,当领导者心跳超时的时候,推荐自己当候选人。
候选人(Candidate):候选人向其他节点请求投票 ,通知其他节点来投票,如果赢得了大多数投票,就晋升领导者。
领导者(Leader):处理写请求、管理日志复制和不断地发送心跳信息,通知其他节点我还活着。
启动流程:
1.初始状态下,集群中所有节点都是跟随者的状态,
2.Raft 算法实现了随机超时时间的特性,每个节点等待领导者节点心跳信息的超时时间间隔是随机的。比如 A 节点等待超时的时间间隔 100ms,B 节点 150 ms
3.当 A 节点的超时时间到了后,A 节点成为候选者,增加自己的任期编号,Term 值从 0 更新为 1,并给自己投了一票
4.节点 B 和 节点 C 接收到节点 A 发送的请求投票信息后,在编号为 1 的这届任期内,还没有进行过投票,就把选票投给节点 A,并增加自己的任期编号。
5.节点 A 收到 3 次投票,得到了大多数节点的投票,从候选者成为本届任期内的新的领导者。
6.节点 A 作为领导者,固定的时间间隔给 节点 B 和节点 C 发送心跳信息,告诉节点 B 和 C,我是领导者,组织其他跟随者发起新的选举。
7.节点 B 和节点 C 发送响应信息给节点 A,告诉节点 A 我是正常的。
领导者的任期:
1.自动增加:跟随者在等待领导者心跳信息超时后,推荐自己为候选人,会增加自己的任期号.
2.更新为较大值:当节点发现自己的任期编号比其他节点小时,会更新到较大的编号值。比如节点 A 的任期为 1,请求投票,投票消息中包含了节点 A 的任期编号,且编号为 1,节点 B 收到消息后,会将自己的任期编号更新为 1。
3.恢复为跟随者:如果一个候选人或者领导者,发现自己的任期编号比其他节点小,那么它会立即恢复成跟随者状态。
4.拒绝消息:如果一个节点接收到较小的任期编号值的请求,那么它会直接拒绝这个请求,比如任期编号为 6 的节点 A,收到任期编号为 5 的节点 B 的请求投票 RPC 消息,那么节点 A 会拒绝这个消息。
5.在一次选举中,每一个服务器节点最多会对一个任期编号投出一张选票