Raft 学习总结
基于这个非常棒的动画总结
另参考
什么是分布式一致性?
假如考虑单节点。有个客户端向其发送一个修改值的请求,该值被修改,并返回。
假如有多个节点呢,如何保证所有节点的数据保持一致。这就是分布式一致性。
Raft 就是一种实现分布式一致性的协议(或算法)。
原理概览
一个节点有3种状态:
- Follower
- Candidate
- Leader
领导选举(Leader Election):
-
所有的节点起始状态都是:Follower
-
假如没有从Leader收到消息,变为:Candidate,向其他节点请求选票(Vote),其他节点会返回选票。
-
如果节点获得超过半数的选票,将成为:Leader
以上过程成为领导选举,此后,系统所有的变更都经过Leader。
在Raft中有2个选举相关的超时时间设置:
- 选举超时:Followers节点成为Candidate的等待时间,也即超过该时间,就会改变状态。150~300 ms随机值
- 超过该时间的节点A成为Candidate,发起选举
- 投自己一票
- 向其他节点请求选票
- 如果其他节点在此轮,没有投票,则将票投给A
- 从节点重置超时时间
- 一旦A获取多数选票,升级为:Leader
- A开始向其他节点发送,*追加条目(Append Entries)*消息
- 心跳超时:
- 个人理解就是心跳间隔
需要超过半数的选票可以保证只有一个leader。
假如在某一轮投票中,出现多个节点获得相同的票数,则需要进行加时赛(Split Vote)
日志复制(Log Replication):
- 对系统的每一次变更,都在节点上增加一条记录。
- 此时没有提交,所以实际不会更新节点的值。
- 将日志复制到Followers节点。跟随下一次心跳报文。
- 等待多数从节点已经完成日志同步并汇报结果,此时节点提交写入操作。
- 返回客户端,写入成功状态
- 将提交结果通知从节点。从节点提交。
- 此时集群数据一致性。