分布式一致性协议-Raft

分布式一致性协议-Raft,第1张

分布式一致性协议-Raft

文章目录
    • 1、什么是Raft
    • 2、Raft相关概念
    • 3、原理解析
      • 3.1、日志复制
      • 3.2、Leader选举
      • 3.3、Leader节点宕机
      • 3.4、多个Candidate竞争选举
      • 3.5、网络分区处理
    • 4、总结
    • 5、参考

1、什么是Raft

Paxos 是论证了一致性协议的可行性,但是论证的过程据说晦涩难懂,缺少必要的实现细节,而且
工程实现难度比较高, 广为人知实现只有 zk 的实现 zab 协议。
Paxos协议的出现为分布式强一致性提供了很好的理论基础,但是Paxos协议理解起来较为困难,
实现比较复杂。
然后斯坦福大学RamCloud项目中提出了易实现,易理解的分布式一致性复制协议 Raft。Java,
C++,Go 等都有其对应的实现之后出现的Raft相对要简洁很多。引入主节点,通过竞选确定主节点。节
点类型:Follower、Candidate 和 Leader。

  • Leader 会周期性的发送心跳包给 Follower。每个 Follower 都设置了一个随机的竞选超时时间(我想称它为“静默时间”),一般为 150ms~300ms;
  • 如果在这个时间内没有收到 Leader 的心跳包,就会变成 Candidate(静默期已到,哥们我要出山了),进入竞选阶段;
  • 通过竞选阶段的投票多的人成为Leader(当老大了)。
2、Raft相关概念

节点状态:

  • Leader(主节点):接受 Client 更新请求,写入本地后,然后同步到其他副本中。
  • Follower(从节点):从 Leader 中接受更新请求,然后写入本地日志文件。对客户端提供读
    请求。
  • Candidate(候选节点):如果 Follower 在一段时间内未收到 leader 心跳。则判断 leader
    可能故障,发起选主提议。节点状态从 Follower 变为 Candidate 状态,直到选主结束。

Election Timeout:

选举超时时间(可以被重置)。是节点状态从Follower变为Candidate的时间,是一个150ms~300ms的随机值。

Heartbeat Timeout:

心跳超时时间。Leader节点会以固定的时间间隔定时给Follower节点发送心跳。

Election Term:

选举轮次。初始值为0,当某个节点从Follower 变为 Candidate时该节点的Term会加1。Term值越大表示当前leader越新。

Request Vote:

请求投票,Candidate 在选举过程中发起,收到多数派响应后,成为 Leader。

3、原理解析

Raft提供两个核心过程:日志复制和Leader选举。

3.1、日志复制

1、来自客户端的修改都会被传入 Leader。注意该修改还未被提交,只是写入日志中。

2、Leader 会把修改复制到所有 Follower。

3、Leader 会等待大多数的 Follower 也进行了修改,然后才将修改提交。

4、此时 Leader 会通知的所有 Follower 让它们也提交修改,此时所有节点的值达成一致。

3.2、Leader选举

1、初始阶段,只有 Follower,没有 Leader。Follower A 优先等待一个随机的Election Timeout(竞选超时时间)之后,没收到 Leader 发来的心跳包,因此进入竞选阶段。

2、A 发送投票请求给其它所有节点。

3、其它节点如果在当前Term没有投过票则会对请求进行回复,如果超过一半的节点回复了,那么该 Candidate 就会变成 Leader。

4、之后 Leader 会根据Heartbeat Timeout周期性地发送心跳包给 Follower,Follower 接收到心跳包,会重置Election Timeout。

3.3、Leader节点宕机


当之前选举的Leader A宕机,节点B和节点C在选举超时时间内没有收到Leader的心跳续约包,其中节点B优先结束选举超时时间即变为Candidate。

后续的流程和之前一样,只不过宕机的节点A不会做出任何响应。

3.4、多个Candidate竞争选举

1、如果有多个 Follower 成为 Candidate,并且所获得票数相同,那么就需要重新开始投票。

2、当重新开始投票时,由于每个节点设置的随机竞选超时时间不同,因此下一次再次出现多个Candidate 并获得同样票数的概率很低。

3.5、网络分区处理

1、当出现网络分区后,如果某个分区没有Leader则会进行Leader选举。

2、当网络分区恢复后,多个分区里面的Leader取Term最大的一个作为分区恢复以后整个集群的Leader,然后向其他节点同步自己的数据。

4、总结

Raft是在Paxos协议基础上的一个便于理解,便于实现的分布式一致性协议。也经常被用在分布式系统和软件当中,其中就包括了大名鼎鼎的Redis,两者都是保证了CAP理论中的“AP”。

通过了解也发现Raft的Leader选举和日志复制过程巧妙又有趣,对于入门分布式,以及了解分布式系统面临的问题有很大的帮助。

5、参考

Raft动画演示:http://thesecretlivesofdata.com/raft/#home。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4000963.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-10-22
下一篇 2022-10-22

发表评论

登录后才能评论

评论列表(0条)

保存