Spring Cloud 2.2.2 源碼之六十五nacos的raft選舉初始化流程

選舉初始化流程

在這裏插入圖片描述

raft選舉原理

具體的raft算法原理百度下好了,很多,總的來說就是一個相對公平的能達到共識的相對好理解的一個選舉算法。那麼結合nacos來說下他思想是怎麼體現的。具體的算法理解可以看看這個小動畫
,可以幫助理解,比干的文字和圖片都來的好。

何時開始選舉

我們先來搞清楚什麼時候會開始選舉,先看下nacos初始化服務器列表的步驟。

ServerListManager的init

首先是ServerListManager的初始化方法,會開啓間隔5秒的ServerListUpdater任務和間隔2秒的ServerStatusReporter任務:
在這裏插入圖片描述
在這裏插入圖片描述

ServerListUpdater

這個任務裏先會從本地的集羣配置表裏獲取集羣信息:
在這裏插入圖片描述
然後和老的服務器信息做對比,發現有改變後就進行通知:
在這裏插入圖片描述
主要就是進行監聽器的遍歷,然後把新的服務器信息傳遞過去。
在這裏插入圖片描述

ServerStatusReporter

檢查服務器狀態,有改變的話會通知:
在這裏插入圖片描述

不過此時還沒有監聽器呢,那麼監聽器什麼時候有,有哪些呢,我們來看看RaftPeerSet,他是跟選舉相關的。

RaftPeerSet

首先他會等ServerListManager先實例化,然後他實現了監聽器接口,就是上面那個。
在這裏插入圖片描述
在初始化的時候添加到ServerListManager的監聽器裏的。因爲ServerListUpdater將會
在這裏插入圖片描述

onChangeServerList

收到通知後,會更新自身的集羣結點信息peers,然後設置ready的標記,表示可以進行選舉了,這個什麼鬼標記,這個還要看另外一個RaftCore的任務。
在這裏插入圖片描述

RaftCore

他也是老套路,初始化的時候進行一些設置,創建RaftPeer,設置相應的隨機任期時間0-15秒和心跳超時時間0-5秒,其實就是raft協議裏的競選開始的超時時間,比如這裏會進行本地RaftPeerlocalTerm的設置,讀本地文件/xxx/meta.properties的Term值,作爲任期,其實就是一個狀態標記,越大說明狀態越新。然後會開啓兩個任務,一個是選舉,500毫秒一次,一個是心跳,5秒一次。
在這裏插入圖片描述

MasterElection

選舉需要有ready的標記激活,這個就是爲什麼要等初始化好了纔會進行選舉。
在這裏插入圖片描述

HeartBeat

心跳也一樣。
在這裏插入圖片描述

現在知道了在開始選舉之前要做哪些事情了吧,下面就開始選舉吧。
好了,今天就到這裏了,希望對學習理解有幫助,大神看見勿噴,僅爲自己的學習理解,能力有限,請多包涵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章