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
協議裏的競選開始的超時時間,比如這裏會進行本地RaftPeer
的localTerm
的設置,讀本地文件/xxx/meta.properties
的Term值,作爲任期,其實就是一個狀態標記,越大說明狀態越新。然後會開啓兩個任務,一個是選舉,500
毫秒一次,一個是心跳,5
秒一次。
MasterElection
選舉需要有ready
的標記激活,這個就是爲什麼要等初始化好了纔會進行選舉。
HeartBeat
心跳也一樣。
現在知道了在開始選舉之前要做哪些事情了吧,下面就開始選舉吧。
好了,今天就到這裏了,希望對學習理解有幫助,大神看見勿噴,僅爲自己的學習理解,能力有限,請多包涵。