raft协议学习


动画理解: http://thesecretlivesofdata.com/raft/
博客理解:
https://www.cnblogs.com/xybaby/p/10124083.html

注:

  1. 每个节点都有三种状态, follower, candidate, leader
  2. 初始状态每个节点都是follower
  3. 每个follower在的那个term中只能投一次票

过程:

  1. 初始状态

    • 所有节点等待leader发请求,由于没有leader,所以某些节点会率先超时并进入candidate状态.
    • candidate节点向其他follow节点请求投票,投票完后获得majority票数的candidate成为leader并开启第一个term(即term数为1)
  2. 同步数据过程

    • client向leader发送更新数据请求.
    • leader首先将这个更新操作存进log, 然后通过log replication将这个操作同步广播给follower的log.
    • 各follower会返回数据包表示已同步.
    • leader在收到majority数量的包后会进行数据更新(此时才真正影响了该leader节点),并广播通知follower可以更改数据了(此时才真正影响了各个follower节点)
  3. 重新选举的情况

    1. 某个follower停止接受心跳且成为了candidate, 那么该term结束
    2. 平票
  1. 投票过程, 在开启投票的时候若某节点成为了candidate,就会发起投票请求,然后等待其他节点回复,这里面可能存在三种结果

    1. 收到majority投票成为leader, 并广播给其他节点避免出发新的选举
    2. 被告知别人已经当选, 那么自行切换到follower
    3. 没收到majorrity也没被告知有人当选, 则保持candidate状态等待超时时间过后重新发起选举
  2. follower如何决定是否给某个选举请求投票:

    • 在任一任期内,单个节点最多只能投一票
    • 候选人知道的信息不能比自己的少(通过log replication和safety)
    • first-come-first-served 先来先得

Author: Lic
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Lic !
  TOC