raft pre vote 中多個 candidate 相遇後如何選舉?

時間 2021-06-02 19:09:03

1樓:無名

這個場景跟各個節點超過electiontimeout以後觸發選舉場景很像吧? 如果多個節點都同時競爭,就很難選出leader。也就是常說的活鎖。

最後都是通過隨機化 electiontimeout來降低活鎖的概率,達到工程上可接受的程度。

2樓:RejudgeX

我理解這裡沒有任何問題吧

首先引入pre-vote只是想解決網路分割槽的節點不能隨意提公升term的問題(也就是從而能將正常leader step down)

題主應該是想問的是:這種機制對正常節點擊主(而非網路分割槽節點)的影響。

首先正常情況下乙個節點觸發了選主,而且他不是網路分割槽節點,肯定是因為Leader掛了; 這個時候就滿足了pre-vote兩個條件中的第乙個:節點長時間沒有收到leader的lease心跳; 現在只剩第二個條件日誌新舊; 這一點跟非pre-vote下的選主一樣的機制(term相同比較index就行),所以pre-vote情況下,老主step down,還是能正常的選出新主

至於選票分割影響raft協議的liveness,還是用random timeout就能解決

3樓:satanson

比較搓, 直接能夠想到的解法是, 應答preVote請求的peer要過了minimum election timeout之後才能同意, 所以平票或者沒有拿到多數票, 發起preVote的peer可以在這個時間上加乙個隨機回退時間, 等待過後, 再次preVote. 隨機回退時間至少得大於一次選主的時間, 2個RTT吧(一次preVote請求, 一次requestVote請求). 比如採用隨機數*10*RTT.

C 怎麼讀取ini中的多個相同的section和key值,然後儲存到乙個陣列裡?

首先,ini格式要求Section不能同名,同一Section下的Key也不能同名。可以採用加數字的方式命名Section和Key,比如Case0 Case1 Case2 等等。回到問題,使用下面的INI解析庫 C 實現 可以很容易解決 markliPRC portini An INI file p...

C語言 GCC 如何編譯多個檔案?

陸明非 隨便編譯,只要把函式的宣告在main裡面包含就行 通過include標頭檔案或者自己extern declare 這個和編譯順序 或者鏈結順序 沒任何關係。唯一有可能有關係的是這些函式都是同名且不是強型別,鏈結器會按照順序 抑或隨機 選乙個。但這種應該不是你的情況。 Watcher 杭州 說...

C 函式模板在 hpp中定義和實現,當有多個檔案包含該標頭檔案時編譯出現重複定義的問題,該如何解決?

任黑 你這情況至少可以肯定不是開源的庫。誰寫的,把ta打一遍。既然不能編譯,那肯定是類外的函式了,因為類內的都是內聯的。採用Single file library的寫法 這裡寫函式宣告 ifdef IMPLEMENTATION 這裡寫函式實現 endif 然後僅在包含該檔案的乙個cpp中,在包含該檔...