ETCD 使用 Raft 算法來實現(xiàn)分布式一致性,其選舉機(jī)制是 Raft 的核心部分。Raft 通過選舉選出一個領(lǐng)導(dǎo)者(Leader),領(lǐng)導(dǎo)者負(fù)責(zé)處理所有客戶端請求并管理日志復(fù)制。以下是 ETCD 的選舉機(jī)制,分別針對首次選舉和變更選舉進(jìn)行說明。
1. 首次選舉
當(dāng) ETCD 集群剛啟動時,所有節(jié)點(diǎn)都處于 Follower 狀態(tài),此時集群中沒有領(lǐng)導(dǎo)者。首次選舉的過程如下:
-
Follower 等待超時:
- 每個 Follower 會啟動一個隨機(jī)的選舉超時計時器(Election Timeout),通常為 150ms 到 300ms。
- 如果 Follower 在超時時間內(nèi)沒有收到來自 Leader 的心跳(Heartbeat),它會認(rèn)為集群中沒有 Leader,并開始選舉。
-
轉(zhuǎn)換為 Candidate:
- Follower 轉(zhuǎn)換為 Candidate 狀態(tài),并增加自己的任期號(Term)。
- 它向集群中的其他節(jié)點(diǎn)發(fā)送 RequestVote RPC 請求,請求投票。
-
投票規(guī)則:
- 每個節(jié)點(diǎn)在同一任期內(nèi)只能投一次票,且遵循“先到先得”的原則。
- Candidate 需要獲得集群中大多數(shù)節(jié)點(diǎn)(超過半數(shù))的投票才能當(dāng)選為 Leader。
-
選舉結(jié)果:
- 如果 Candidate 獲得大多數(shù)投票,它將成為 Leader,并開始向其他節(jié)點(diǎn)發(fā)送心跳以維持領(lǐng)導(dǎo)地位。
- 如果 Candidate 沒有獲得大多數(shù)投票(例如,出現(xiàn)平票),它會等待選舉超時后重新發(fā)起選舉。
-
Leader 開始工作:
- Leader 開始接收客戶端請求,并將日志復(fù)制到其他 Follower 節(jié)點(diǎn)。
2. 變更選舉
變更選舉發(fā)生在 Leader 失效或網(wǎng)絡(luò)分區(qū)等情況下,集群需要重新選舉新的 Leader。過程如下:
-
Leader 失效:
- 如果 Leader 崩潰或網(wǎng)絡(luò)分區(qū)導(dǎo)致 Follower 無法收到 Leader 的心跳,F(xiàn)ollower 會等待選舉超時。
-
Follower 轉(zhuǎn)換為 Candidate:
- 和首次選舉類似,F(xiàn)ollower 會轉(zhuǎn)換為 Candidate,增加任期號,并向其他節(jié)點(diǎn)發(fā)送 RequestVote RPC。
-
投票與選舉:
- 其他節(jié)點(diǎn)會根據(jù) Candidate 的日志完整性(Log Completeness)決定是否投票。
- Raft 要求 Leader 必須擁有最新的日志,因此只有日志較新的 Candidate 才能獲得投票。
-
新 Leader 產(chǎn)生:
- 如果 Candidate 獲得大多數(shù)投票,它將成為新的 Leader。
- 新 Leader 會立即發(fā)送心跳,阻止其他節(jié)點(diǎn)發(fā)起新的選舉。
-
日志同步:
- 新 Leader 會將自己的日志同步給其他 Follower,確保集群狀態(tài)一致。
選舉的關(guān)鍵點(diǎn)
-
任期號(Term):
- 每次選舉都會增加任期號,用于區(qū)分不同的選舉周期。
- 節(jié)點(diǎn)會拒絕來自舊任期的請求,確保只有最新任期的 Leader 有效。
-
日志完整性:
- Candidate 必須擁有最新的日志才能獲得投票,這保證了數(shù)據(jù)的一致性。
-
大多數(shù)原則:
- Leader 必須獲得大多數(shù)節(jié)點(diǎn)的支持,確保集群中只有一個合法的 Leader。
-
隨機(jī)選舉超時:
- 隨機(jī)超時機(jī)制減少了多個 Candidate 同時發(fā)起選舉的可能性,避免選舉沖突。
總結(jié)
- 首次選舉:集群啟動時,F(xiàn)ollower 等待超時后發(fā)起選舉,獲得大多數(shù)投票的 Candidate 成為 Leader。
- 變更選舉:當(dāng) Leader 失效時,F(xiàn)ollower 重新發(fā)起選舉,確保集群快速恢復(fù)并選出新的 Leader。
- Raft 的選舉機(jī)制通過任期號、日志完整性和大多數(shù)原則,保證了 ETCD 集群的高可用性和數(shù)據(jù)一致性。
舉個例子
我們可以用一個班級選班長的例子來形象地說明 ETCD 的選舉過程。假設(shè)班級里有若干名學(xué)生,他們要選出一名班長(Leader),而選舉規(guī)則和 Raft 算法的選舉機(jī)制非常相似。
場景設(shè)定
- 班級:一個分布式系統(tǒng)(ETCD 集群)。
- 學(xué)生:集群中的節(jié)點(diǎn)(Follower、Candidate、Leader)。
- 班長:Leader,負(fù)責(zé)管理班級事務(wù)。
-
選舉規(guī)則:
- 每個學(xué)生可以投票,但只能投一次。
- 必須獲得超過半數(shù)的投票才能當(dāng)選班長。
- 如果選舉失?。ū热缙狡保?,就重新選舉。
1. 首次選舉(班級剛成立,沒有班長)
-
初始狀態(tài):
- 班級剛成立,所有學(xué)生都是普通學(xué)生(Follower),沒有班長。
- 每個學(xué)生都在等待,看是否有人主動站出來競選班長。
-
等待超時:
- 每個學(xué)生都有一個隨機(jī)的“耐心時間”(Election Timeout),比如 1 分鐘到 3 分鐘。
- 如果在這個時間內(nèi)沒有聽到班長的消息(比如班長沒有發(fā)通知),就會有人覺得自己可以當(dāng)班長。
-
有人站出來競選:
- 一個學(xué)生(Candidate)站出來說:“我要當(dāng)班長,請大家支持我!”(發(fā)送 RequestVote RPC)。
- 他還會告訴大家:“這是第 1 屆選舉!”(Term = 1)。
-
投票:
- 其他學(xué)生根據(jù)他的表現(xiàn)(比如他是不是靠譜,是不是最新的消息都知道)決定是否投票。
- 如果這個學(xué)生獲得了超過半數(shù)的支持,他就成為班長(Leader)。
-
班長開始工作:
- 班長開始管理班級事務(wù),比如收發(fā)作業(yè)、組織活動(處理客戶端請求)。
- 他還會定期給其他學(xué)生發(fā)通知(心跳),告訴大家:“我還在,班級一切正常!”
2. 變更選舉(班長突然請假了)
-
班長失效:
- 有一天,班長突然請假了(Leader 崩潰或網(wǎng)絡(luò)分區(qū))。
- 其他學(xué)生收不到班長的通知,開始覺得不對勁。
-
等待超時:
- 學(xué)生們又開始等待,看班長會不會回來。
- 如果等待時間到了還沒消息,就會有人站出來競選新班長。
-
新的競選者:
- 一個學(xué)生(Candidate)站出來說:“班長請假了,我要競選新班長,這是第 2 屆選舉!”(Term = 2)。
- 他還會告訴大家:“我知道班長之前做的所有事情!”(日志完整性)。
-
投票:
- 其他學(xué)生根據(jù)他的表現(xiàn)和知道的班級事務(wù)決定是否支持他。
- 如果他獲得了超過半數(shù)的支持,他就成為新班長。
-
新班長上任:
- 新班長開始管理班級,并確保所有學(xué)生都知道最新的班級事務(wù)(日志同步)。
- 他也會定期發(fā)通知,防止其他學(xué)生再發(fā)起選舉。
關(guān)鍵點(diǎn)總結(jié)
- 超過半數(shù)支持:班長必須得到大多數(shù)學(xué)生的支持,確保只有一個合法的班長。
- 隨機(jī)等待時間:每個學(xué)生的耐心時間不同,避免同時有太多人競選。
- 日志完整性:競選者必須知道班級的最新事務(wù),才能獲得支持。
- 任期號:每次選舉都有一個屆數(shù)(Term),確保大家知道這是最新的選舉。
通過這個例子,可以很直觀地理解 ETCD 的選舉機(jī)制:無論是首次選舉還是變更選舉,都是通過投票、超時和大多數(shù)原則來選出一個合法的 Leader,確保系統(tǒng)的高可用性和一致性。