1. Raft 的 leader election 中 term、election timeout、majority vote 如何起作用
请详细说明 Raft 协议中领导者选举(leader election)的完整流程,包括 term(任期)、election timeout(选举超时)和 majority vote(多数派投票)分别如何工作?
- term 的概念与作用(任期单调递增,作为逻辑时钟)
- election timeout 的随机化如何避免选票分裂
- majority vote 与少数派不选新的关系
Raft 将时间划分为一个个递增的 term(任期),每个 term 内最多只有一个 leader。Follower 若在 election timeout(随机 150~300ms)内未收到 leader 的心跳或 AppendEntries,就转换为 Candidate 并发起选举:term+1,给自己投票,向其他节点发送 RequestVote。每个节点每 term 最多投一票(先到先得),获得多数派(>N/2)投票的 Candidate 即成为 leader。leader 周期性发送心跳维持权威。若多个 Candidate 同时竞选导致选票分裂,则本 term 无 leader,各候选者等待随机的 election timeout 后再次发起更高 term 的选举,直至某候选者获得多数派。
随机化 election timeout 是 Raft 的关键设计,它让不同节点在不同时刻超时,从而极大概率只有一人率先发起选举并获得多数派,避免"选票分裂"导致的活锁。多数派投票保证任何时刻最多只有一个 leader(因为两个多数派必然相交,不可能同时有两人获得多数派),这为后续的日志安全与状态机安全奠定基础。
class RaftNode:
def begin_election(self):
self.term += 1
self.voted_for = self.id
self.role = "candidate"
votes = 1
for peer in self.peers:
granted = self.request_vote(peer, self.term, self.last_log_index, self.last_log_term)
if granted:
votes += 1
if votes > len(self.peers) // 2:
self.role = "leader"
return True
return False