ETCD 原始碼學習 Raft 協議選舉過程(六)

2021-10-10 17:04:51 字數 2175 閱讀 3341

在 etcd 原始碼學習過程,不會講解太多的原始碼知識,只講解相關的實現機制,需要關注原始碼細節的朋友可以自行根據文章中的提示,找到相關原始碼進行學習

1.follower 節點擊舉計數器超時,觸發 msghup 訊息, follower 節點接收此訊息時,會發起一輪選舉。

2.當 leader 節點擊舉計數器超時,觸發 msgcheckquorum 訊息,且當前節點經過檢查之後,發現當前節點不能維持 leader 狀態,leader 會切換為 follower 等待選舉超時。

3. 當 leader 節點正常停止時,會觸發 msgtransferleader 訊息,並且當前 leader 會根據一定規則選擇乙個合適的 follower 作為下乙個 leader。leader 節點收到 msgtransferleader 後會立即傳送 msgtimeoutnow 訊息給下一任 leader 節點,節點收到訊息之後會立即發起一輪新選舉。

1.選舉觸發

// raft/raft.go

func (r *raft) step(m pb.message) error else

} else

....

} ...

return nil

}

2.選舉處理函式

// raft/raft.go  選舉函式

func (r *raft) campaign(t campaigntype) else

//判斷當前節點把錶投給自己之後,是否得到半數以上的投票

if _, _, res := r.poll(r.id, voterespmsgtype(votemsg), true); res == quorum.votewon else

return

} ...

for _, id := range ids )

}}

3.candidate訊息處理

func stepcandidate(r *raft, m pb.message) error  else 

switch m.type else

case quorum.votelost:

r.becomefollower(r.term, none)

} ...

} return nil

}

4.選舉過程包括兩個部分,預選舉和正式選舉。

(1) 預選舉 

如果開啟了預選舉模式(prevote),那麼會首先進行一輪預選舉,該過程的的主要目的是確定是否有足夠多的節點能參與選舉(n/2+1)。

首先當前節點會切換為 預選舉狀態 (precandidate),然後當前節點擊票投給自己並判斷此時是否有足夠多的節點能參與選舉,如果可以,開始正式選舉。

如果還沒有足夠多的節點能參與選舉,傳送 msgprevote 訊息給所有節點。並且等待其他節點的響應 (stepcandidate 處理響應訊息)。

當接收到其他節點的響應訊息(msgprevoteresp)後, 統計節點票數,如果有足夠多的節點能參與選舉則發起正式選舉,否則切換回 follower 狀態。

(2) 正式選舉, 與預選舉的過程相似區別在於:

傳送的選舉和響應訊息型別為 ms**ote 和 ms**oteresp。

當收到足夠多節點投票之後,要麼切換回 follower, 要麼切換回 leader。 

// raft/raft.go

func (r *raft) step(m pb.message) error )

} else )

} ...

} return nil

}

(1) 當前節點的 term>候選節點的 term,拒絕。

(2) 當前節點的 term《候選節點的 term,同意

(3) 當前節點的 term=候選節點的 term。則對比 index

如果當前節點 index > 候選節點 index, 拒絕,

否則,同意

msghup

msgcheckquorum

msgtransferleader

msgtimeoutnow

msgprevote

msgprevoteresp

ms**ote

ms**oteresp

ps:歡迎糾正

ETCD 原始碼學習 Raft 協議介紹(二)

raft協議是分布式一致性協議的一種,所以在了解raft協議之前,我們首先要知道一致性協議的作用。1.一致性協議用於解決分布式環境下多副本之間資料一致性的問題的。2.主要包括兩個部分,一是 leader 選舉,二是日誌同步。3.一致性協議主要包括paxos zab raft及 gossip 等 le...

ETCD 原始碼學習 lease 二

在 etcd 原始碼學習過程,不會講解太多的原始碼知識,只講解相關的實現機制,需要關注原始碼細節的朋友可以自行根據文章中的提示,找到相關原始碼進行學習。本文主要介紹 lessor 如果發現過期鍵,server 如何處理過期鍵的過程。lessor goroutine func le lessor ru...

ETCD 原始碼學習 簡述(一)

前段時間認真學習了 etcd 原始碼實現,往後的一段時間,會陸陸續續的寫一些學習記錄。本章主要介紹 etcd 的主要幾個組成部分。ectd主要包括以下幾個部分 儲存包括兩部分組成,記憶體和磁碟。index 鍵值索引 mvcc 多版本控制 kv 原始鍵值對 mvcc 多版本控制 snaphot 資料快...