从动图来理解 Raft 协议关键概念
节点状态
- Follower
- Candidate
- Leader
- Learner
领导选举(Leader Selection)
节点的初始状态为 Follower
。
选举超时(Election Timeout)
当处于 Follower 状态的节点没有收到 Leader
节点的心跳时,会开启计时,经过 Election Timeout 后,他们会变成 Candidate
状态。
当节点变成 Candidate
状态后,会开始为自己拉票做 Leader
。当多数人投票给当前节点时,当前节点当选 Leader
。
心跳超时(Heartbeat Timeout)
节点当选 Leader
之后,会周期性地向 Follower
发送心跳包;当 Follower
收到心跳后,会重置自己的 Election Timeout 计时,并向 Leader
发送响应。
当 Leader
处于不可用的状态时,率先结束 Election Timeout 的 Follower
节点,会发起选举投票。
- 得到大多数投票后,当选下个 Term 的
Leader
。
同时存在两个
Follower
在拉票,且双方都不能得到大多数投票时,此次选举作废,并开启下一轮投票。具体情景说明如下:A、B 节点几乎同时发起投票,并且各自为各自投一张票
此时,D 未收到投票请求,发起了自己的投票,并为自己投了一票。
B 为 C 投了一票,此时的得票为 A(1),C(2),D(1),无论谁都不能获取到大多数的投票,因此此次投票作废,等待下次某个幸运的节点发起选举投票。
日志复制(Log Replication)
假设客户端是将修改的请求发送给 Leader
,则修改的流程如下:
- 写入
Leader
的 log 中; - 等待下次 HeartBeat,将修改信息同步给
Follower
; Follower
给Leader
发出确认响应;- 当
Leader
收到大多数Follower
确认的信息后,将修改确认; - 在下次 HeartBeat 时,将修改确认的信息同步给所有
Follower
。
节点出现网络隔离
假设出现网络隔离后,出现两个独立的网络,此时:
- 少数派:只读,修改不能确认,因为得不到大多数
Follower
节点的确认。 - 多数派:能正常读写。
假设两个网络对同一个 key 做了操作,当网络隔离取消后,会以多数派的数据为准。
Reference
从动图来理解 Raft 协议关键概念