分布式一致性算法之Raft

Raft算法:(以下三个模块)

为了管理复制日志的一套算法

  1. 领导人选举
  2. 日志复制
  3. 安全性

Raft算法有两个阶段:1、leader选举阶段。2、日志复制阶段

领导人Leader选举

领导者(leader):处理客户端交互,日志复制等动作,一般整个过程中只有一个领导者

候选者(candidate):候选者就是选举过程中提名自己的实体,一旦选举成功,则成为领导

跟随者(follower):类似选民,完全被动的角色,这样的服务器等待被通知投票。

Raft使用心跳机制来触发选举。当Server启动时,初始状态都是follower。每个server有一个定时器,超时时间为election timeout(一般为150ms-300ms),如果某server没有超时的情况下收到来自领导者或者候选者的任何消息,定时器重启,如果超时,它就开始一次选举。

正常情况下的选举
  1. 初始状态都是下集群都中的节点都处于follower状态。

在这里插入图片描述

  1. 某一时刻,其中一个follower由于没有收到leader的心跳,率先发生election timeout进而发起选举。

    在这里插入图片描述

  2. 当集群中超过半数的节点接受投票,canadidate节点将成为leader状态。

在这里插入图片描述

  1. 成为leader节点之后,leader将想follower节点同步日志并发送心跳,并且将所有任期加一。

在这里插入图片描述

异常情况
  1. leader不可用:

    1. 当follower无法收到leader的心跳,follower发生election timeout,其状态变更为candidate,并向其他follower发起投票

      在这里插入图片描述

    2. 当超过半数的follower接受投票后,该节点将成为新的leader并向其他follower同步日志

    在这里插入图片描述

    1. 如果之前的leader再次加入集群,则两个leader会比较任期数,任期数小的将自己切换为follower并将不一致的日志清除,重新同步。

    在这里插入图片描述

  2. follower节点不可用

    1. 当某个follower无法接收心跳时,则无法再接收日志

    2. 当follower重新加入集群,则重新通过leader同步日志,并且将任期数修改成当下的任期数

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

  3. 多个 candidate 或者多个 leader

    1. 初始状态都是follower
    2. 如果两个节点同时成为candidate,candidate则会继续想其他的follower询问投票,由于follower都投票了,candidate会向其他candidate投票。若任期数相同,则candidate相互拒绝。由于第一次未选出 leader,candidate 将随机选择一个等待间隔(150ms ~ 300ms)再次发起投票。如果得到集群中半数以上的 follower 的接受,这一 candidate 将成为 leader。 稍后另一个 candidate 也将再次发起投票。由于集群中已经选出 leader,candidate 将收到拒绝接受的投票。在被多数节点拒绝之后,并已知集群中已存在 leader 后,这一 candidate 节点将终止投票请求、切换为follower,从 leader 节点同步日志。
Raft复制日志剖析
  1. 出现网络分区的时候,多数派可以正常同步日志
  2. 如果多数派都挂掉,则不会进行写操作。

可结合下面的一致性算法动画来理解
演示一致性算法动画:
http://thesecretlivesofdata.com/raft/
https://raft.github.io/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值