分布式一致性协议-Raft学习总结

292 阅读2分钟

Raft 学习总结

基于这个非常棒的动画总结

参考

什么是分布式一致性?

假如考虑单节点。有个客户端向其发送一个修改值的请求,该值被修改,并返回。

假如有多个节点呢,如何保证所有节点的数据保持一致。这就是分布式一致性。

Raft 就是一种实现分布式一致性的协议(或算法)

原理概览

一个节点有3种状态:

  1. Follower
  2. Candidate
  3. Leader
领导选举(Leader Election):
  • 所有的节点起始状态都是:Follower

  • 假如没有从Leader收到消息,变为:Candidate,向其他节点请求选票(Vote),其他节点会返回选票。

  • 如果节点获得超过半数的选票,将成为:Leader

以上过程成为领导选举,此后,系统所有的变更都经过Leader。

在Raft中有2个选举相关的超时时间设置:

  1. 选举超时:Followers节点成为Candidate的等待时间,也即超过该时间,就会改变状态。150~300 ms随机值
    • 超过该时间的节点A成为Candidate,发起选举
    • 投自己一票
    • 向其他节点请求选票
    • 如果其他节点在此轮,没有投票,则将票投给A
    • 从节点重置超时时间
    • 一旦A获取多数选票,升级为:Leader
    • A开始向其他节点发送,*追加条目(Append Entries)*消息
  2. 心跳超时:
    • 个人理解就是心跳间隔

需要超过半数的选票可以保证只有一个leader。

假如在某一轮投票中,出现多个节点获得相同的票数,则需要进行加时赛(Split Vote)

日志复制(Log Replication):
  • 对系统的每一次变更,都在节点上增加一条记录。
  • 此时没有提交,所以实际不会更新节点的值。
  • 将日志复制到Followers节点。跟随下一次心跳报文。
  • 等待多数从节点已经完成日志同步并汇报结果,此时节点提交写入操作。
  • 返回客户端,写入成功状态
  • 将提交结果通知从节点。从节点提交。
  • 此时集群数据一致性。