分布式基础——Raft算法
介绍
Raft 是一个非拜占庭的一致性算法,即所有通信是正确的而非伪造的。N 个结点的情况下(N为奇数)可以最多容忍 (N−1)/2(N−1)/2 个结点故障。
内容
角色
-
Flower(追随者)
-
Candidate(候选人)
-
Leader(领导人)
RPCs(操作)
- RequestVoter(请求投票):请求投票,使自己成为Leader
- AppendEntries(追加日志):Leader向其他人同步日志或者发送心跳,保证自己的领导地位
流程
- 各个节点等待心跳请求
- 迟迟等不到心跳请求,s1向自己投了一票,并进行拉票
- 其他节点投票,选举leader,成为追随者
- s1成为leader后,会周期发送心跳请求给其他节点
- s1挂了后会重新进行拉票选举leader
- s1重启,会自动成为追随者
写入
- 当有写入的请求时,leader优先添加数据,但还未提交数据
- 下一次心跳,同步日志到其他节点,也是添加了,但还未提交
- 其他节点响应leader的添加请求,leader提交日志
- 下一个心跳后,其他节点接收到leader的提交请求都会提交
总结
Raft 用来做日志同步, Leader 负责复制日志,超过半数就可以提交。然后用了诸多限制(Election Safety、Leader Append-Only、Log Matching、Leader Completeness、State Machine Safety)保证了日志的正确性和一致性。