直接回答:节点三态(follower/candidate/leader):follower 在选举超时(150~300ms 随机化)内没收到 leader 心跳就变 candidate,任期+1、投自己一票、并发拉票;拿到多数派(N/2+1)选票即就任 leader,立刻发心跳确立权威。随机超时让各节点超时时刻错开,大幅压低“同时竞选、选票瓜分”的概率,瓜分则本轮作废、再随机等待重选——期望一两轮内出 leader。

展开解析:关键规则逐条:任期(term)是逻辑时钟——每个 RPC 带 term,看到更大 term 立刻退回 follower,旧 leader 网络恢复后自知退位,这是防脑裂的核心;投票限制——每任期每节点只投一票,且只投给“日志至少和我一样新”的候选者(比较 lastLogTerm 与 lastLogIndex),保证被选出的 leader 包含全部已提交日志,这是安全性(safety)的关键而非只是活性;随机化的数学直觉——若超时固定,网络分区恢复后所有 follower 同时超时同时竞选,选票永远瓜分死锁;随机化把冲突概率压到指数衰减。工程细节:心跳间隔必须远小于选举超时下限(典型 10~50ms vs 150~300ms),否则无谓选举;网络抖动下 prevote 扩展——候选者先探测自己是否可能拿到多数再正式发起,防孤立节点不停自增 term 搅局;leader 就任后不能立刻提交前任期的日志(靠任期推进提交当前任期空日志解决,这是 Raft 论文里最微妙的坑)。面试常考反例:两个节点集群挂一个就永远选不出(多数派不可达),所以共识集群必须奇数。

追问方向:为什么日志不够新的候选者不能当选?选举超时设太长/太短各有什么后果?

(约 500 字)