下面詳細解釋一下這個流程:大數據
首先給出幾個名詞定義:
(1)Serverid:在配置server時,給定的服務器的標示id。
(2)Zxid:服務器在運行時產生的數據id,zxid越大,表示數據越新。
(3)Epoch:選舉的輪數,即邏輯時鐘。隨着選舉的輪數++
(4)Server狀態:LOOKING,FOLLOWING,OBSERVING,LEADING
步驟:
1、 Server剛啓動(宕機恢復或者剛啓動)準備加入集羣,此時讀取自身的zxid等信息。
2、 全部Server加入集羣時都會推薦本身爲leader,而後將(leader id 、 zixd 、 epoch)做爲廣播信息,廣播到集羣中全部的服務器(Server)。而後等待集羣中的服務器返回信息。
3、 收到集羣中其餘服務器返回的信息,此時要分爲兩類:該服務器處於looking狀態,或者其餘狀態。
(1) 服務器處於looking狀態
首先判斷邏輯時鐘 Epoch:
a) 若是接收到Epoch大於本身目前的邏輯時鐘(說明本身所保存的邏輯時鐘落伍了)。更新本機邏輯時鐘Epoch,同時 Clear其餘服務發送來的選舉數據(這些數據已經OUT了)。而後判斷是否須要更新當前本身的選舉狀況(一開始選擇的leader id 是本身)
判斷規則rules judging:保存的zxid最大值和leader Serverid來進行判斷的。先看數據zxid,數據zxid大者勝出;其次再判斷leaderServerid, leader Serverid大者勝出;而後再將自身最新的選舉結果(也就是上面提到的三種數據(leader Serverid,Zxid,Epoch)廣播給其餘server)
b) 若是接收到的Epoch小於目前的邏輯時鐘。說明對方處於一個比較OUT的選舉輪數,這時只須要將本身的 (leader Serverid,Zxid,Epoch)發送給他便可。
c) 若是接收到的Epoch等於目前的邏輯時鐘。再根據a)中的判斷規則,將自身的最新選舉結果廣播給其餘 server。
同時Server還要處理2種狀況:
a) 若是Server接收到了其餘全部服務器的選舉信息,那麼則根據這些選舉信息肯定本身的狀態(Following,Leading),結束Looking,退出選舉。
b) 即便沒有收到全部服務器的選舉信息,也能夠判斷一下根據以上過程以後最新的選舉leader是否是獲得了超過半數以上服務器的支持,若是是則嘗試接受最新數據,假若沒有最新的數據到來,說明你們都已經默認了這個結果,一樣也設置角色退出選舉過程。
(2) 服務器處於其餘狀態(Following, Leading)
a) 若是邏輯時鐘Epoch相同,將該數據保存到recvset,若是所接收服務器宣稱本身是leader,那麼將判斷是否是有半數以上的服務器選舉它,若是是則設置選舉狀態退出選舉過程
b) 不然這是一條與當前邏輯時鐘不符合的消息,那麼說明在另外一個選舉過程當中已經有了選舉結果,因而將該選舉結果加入到outofelection集合中,再根據outofelection來判斷是否能夠結束選舉,若是能夠也是保存邏輯時鐘,設置選舉狀態,退出選舉過程。
以上就是FAST選舉過程。