Raft(我想成为领导者)

Raft

动画演示

nacos使用的是Raft

工作流程

节点可以处于追随者,候选者.领导者三种状态中的一种.

一开始,所有的节点都以追随者状态启动,如果追随者没有收到领导者的消息,那么他可以成为候选人.然后候选者请求其他节点投票,其他节点回复它们的投票.

如果候选者从大多数节点获得选票,则成为领导者.

这就是所谓的选票机制,此过程成为领导者选举

此时堆系统的所有更改都要通过领导者,每个更改都会作为条目添加到节点的日志中.此日志条目未提交,所以此时并不会真的进行更改.

此时领导者会先将更改的日志条目复制到所有的跟随着节点中,然后领导者等待,直到收到大部分的跟随者日志条目接受成功的返回值.此时日志条目在领导者节点上提交,领导者更改数值.

然后领导者通知追随者更改数值,集群的分布式数据达成一致.此过程称为日志复制

领导人选举机制

在Raft中,有两个控制选举的超时设置

超时选举

每个节点都会被分配一个随机的介于150ms到300ms的超时时间(如三个节点,随机分配的超时时间分别为150,200,250).

第一个到达超时时间的节点(150ms)发现领导者没有和自己传输心跳信息,合理怀疑领导者寄了.然后成为候选者(可能出现两个节点超时时间相同,同时成为候选者的情况,后面会说),并且投了自己一票,开启了自己的时代时期(选举任期).然后给 其他还没过期的节点(200ms和250ms)发送消息,让他们支持一下,投自己一票.

如果接受节点尚未在此期间内投票,即没有收到没人要自立为王的消息.则会投给候选人.并且加入他的时代

一旦该候选者获得了大多数的选票(保证每个任期只有一个领导者),则成为领导者,并且定期给追随者发送心跳信息.

自此,整个分布式集群就可以和客户端开始通信了,客户端会给领导者发送消息,之后领导者会保证集群里至少一半的追随者都玩成客户端发送的命令之后才会真正的返回给客户端,表示完成此次命令.

这个时代时期(选举任期)将持续到追随者停止接收信号并成为候选人.

分裂投票

当两个节点超时时间相同,同时成为候选者,并开启自己的任期.并且他们在给其他节点发送投票申请后得到的票数一样,在这个任期内不能再获得更多选票.

则节点将等待新的选举,给所有的节点重新设置随机的超时时间.

日志复制

日志复制在raft的工作流程已经讲的很清楚了,现在讨论一个在日志复制的时候会遇到的问题

Raft可以在面对网络分区的时候保持一致

情景:

有一个客户端和A,B,C,D,C,E五个节点,目前的领导者为B.现因为网络故障将A,B和C,D,E分开,形成了两个分区.

由于C,D,E和B(领导者)分开,所以会有一个节点超时成为候选者,进而成为领导者(假设这里为E).

此时由于网络分区,我们有个两个不同任期的领导者,此时添加另外一个客户端并尝试更新两个领导者.

一个客户端尝试将领导者B的值改为3,由于B只能收到A的接受成功的日志返回,达不到大多数,因此B的修改日志一直保持未提交的状态,

另一个客户端尝试将候选者E的值改为8,因为可以收到C,D的回应,所以达到大多数的条件,所以E的修改提交成功.

此时C,D,E节点的值变成8.而A,B的值没有变化.此时不满足集群一致性的原则

Raft的处理方式:

去除掉网络分区的隔离以后,节点B节点发送的心跳信号中的term号小于E节点的.所以B下台成为跟随者.

节点A和B都将回滚其未提交的日志并匹配新领导的日志.

此时集群保持一致.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值