滚动重启流程
核心原则只有一条:多数派必须始终保持存活。 3 个节点时一次只能下线 1 个, 5 个节点时最多可以下线 2 个。
- 先逐台重启跟随者(非 leader 节点),一次一台 —— leader 全程持续提供 服务。在转到下一台之前,先确认已重启的节点通过对端日志复制/ 快照追赶上了进度。
- 最后,下线 leader。 其余节点检测到心跳丢失,会在 0.5-1 秒内选出 新 leader。这段窗口期内的客户端请求会收到
E no_leader,但官方客户端 会透明地重试,因此应用只会感受到短暂的延迟。 - 重新启动旧 leader —— 它会以 follower 身份重新加入并追赶进度(不会自动 夺回 leader 身份)。
只要多数派保持存活,锁状态在整个过程中都会被保留 —— 重启期间被授予或释放 的锁同样要经过提交,因此不会丢失任何东西。
流程(3 节点)
领导者
跟随者 1
跟随者 2
① 重启跟随者 1 —— leader 持续提供服务
通过日志复制/快照追赶进度
② 追赶完成后,重启跟随者 2
通过日志复制追赶进度
③ 最后重启 leader
Vote → 0.5-1 秒内选出新 leader
旧 leader 以 follower 身份重新加入并追赶进度
共识 RPC(Raft)
在 leader 下线的短暂窗口期内,客户端可能会收到 E no_leader,但官方客户端 会透明地重试,因此应用只会看到一次短暂的延迟。