選舉訊息內容
fastleaderelection 選舉演算法介紹
伺服器id/編號。比如有三颱伺服器,編號分別是1,2,3。編號越大在選擇演算法中的權重越大。
資料id。伺服器中存放的最大資料id。值越大說明資料越新,在選舉演算法中資料越新權重越大。
邏輯時鐘,用來判斷多個投票是否在同一輪選舉週期中,該值在服務端是乙個自增序列,每次進入新一輪的投票後,都會對該值進行加1操作。
在投票完成後,需要將投票資訊傳送給集群中的所有伺服器,它包含如下內容。
fastleaderelection是標準的fast paxos演算法的實現
預設是採用投票數大於半數則勝出的邏輯。
目前有5臺伺服器,每台伺服器均沒有資料,它們的編號分別是1,2,3,4,5,按編號依次啟動,它們的選擇舉過程如下:
一、 首先開始選舉階段,每個server讀取自身的zxid。
二、 傳送投票資訊
首先,每個server第一輪都會投票給自己。
投票資訊包含 :所選舉leader的serverid,zxid,epoch。epoch會隨著選舉輪數的增加而遞增。
三、 接收投票資訊
如果伺服器b接收到伺服器a的資料(伺服器a處於選舉狀態(looking 狀態)
首先,判斷邏輯時鐘值:
如果傳送過來的邏輯時鐘epoch大於目前的邏輯時鐘。首先,更新本邏輯時鐘epoch,同時清空本輪邏輯時鐘收集到的來自其他server的選舉資料。然後,判斷是否需要更新當前自己的選舉leader serverid。判斷規則:儲存的zxid最大值和leader serverid來進行判斷的。先看資料zxid,資料zxid大者勝出;其次再判斷leader serverid,leader serverid大者勝出;然後再將自身最新的選舉結果(也就是上面提到的三種資料(leader serverid,zxid,epoch)廣播給其他server)
如果傳送過來的邏輯時鐘epoch小於目前的邏輯時鐘。說明對方server在乙個相對較早的epoch中,這裡只需要將本機的三種資料(leader serverid,zxid,epoch)傳送過去就行。
如果傳送過來的邏輯時鐘epoch等於目前的邏輯時鐘。再根據上述判斷規則來選舉leader ,然後再將自身最新的選舉結果(也就是上面提到的三種資料(leader serverid,zxid,epoch)廣播給其他server)。
其次,判斷伺服器是不是已經收集到了所有伺服器的選舉狀態:若是,根據選舉結果設定自己的角色(following還是leader),退出選舉過程就是了。
最後,若沒有收到沒有收集到所有伺服器的選舉狀態:也可以判斷一下根據以上過程之後最新的選舉leader是不是得到了超過半數以上伺服器的支援,如果是,那麼嘗試在200ms內接收一下資料,如果沒有新的資料到來,說明大家都已經預設了這個結果,同樣也設定角色退出選舉過程。
如果所接收伺服器a處在其它狀態(following或者leading)。
邏輯時鐘epoch等於目前的邏輯時鐘,將該資料儲存到recvset。此時server已經處於leading狀態,說明此時這個server已經投票選出結果。若此時這個接收伺服器宣稱自己是leader, 那麼將判斷是不是有半數以上的伺服器選舉它,如果是則設定選舉狀態退出選舉過程。
否則這是一條與當前邏輯時鐘不符合的訊息,那麼說明在另乙個選舉過程中已經有了選舉結果,於是將該選舉結果加入到outofelection集合中,再根據outofelection來判斷是否可以結束選舉,如果可以也是儲存邏輯時鐘,設定選舉狀態,退出選舉過程。
參考文章:
zookeeper選舉機制
fastleaderelection演算法通過非同步的通訊方式來收集其它節點的選票,同時在分析選票時又根據投票者的當前狀態來作不同的處理,以加快leader的選舉程序。每個在zookeeper伺服器啟動先讀取當前儲存在磁碟的資料,zookeeper中的每份資料都有乙個對應的id值,這個值是依次遞增的...
zookeeper選舉機制
在分布式系統中選主最直接或者傳統的方法是直接選定集群的乙個節點為 leader,其它的節點為 follower,這樣引入的乙個問題是如果 leader節點掛掉,整個集群就掛掉了。所以我們需要一種自動選主演算法,如果 leader節點掛掉,則從 follower節點中選出乙個主節點。選舉階段 lead...
Zookeeper集群選舉機制
zookeeper預設的演算法是fastleaderelection,採用投票數大於半數則勝出的邏輯。選舉依據 伺服器id 比如有3臺伺服器,編號分別為 1,2,3。編號越大,在選舉演算法中的權重越大。選舉狀態 looking,競選狀態。following,隨從狀態。同步leader狀態,參與投票。...