从动图来理解 Raft 协议关键概念
节点状态FollowerCandidateLeaderLearner领导选举(Leader Selection)节点的初始状态为 Follower。选举超时(Election Timeout)当处于 Follower 状态的节点没有收到 Leader 节点的心跳时,会开启计时,经过 Election
节点状态
- 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 做了操作,当网络隔离取消后,会以多数派的数据为准。