fastleaderelection演算法通過非同步的通訊方式來收集其它節點的選票,同時在分析選票時又根據投票者的當前狀態來作不同的處理,以加快leader的選舉程序。
每個在zookeeper伺服器啟動先讀取當前儲存在磁碟的資料,zookeeper中的每份資料都有乙個對應的id值,這個值是依次遞增的;換言之,越新的資料,對應的id值就越大。
在讀取資料完畢之後,每個zookeeper伺服器傳送自己選舉的leader,這個協議中包含了以下幾部分的資料:
1)、所選舉leader的id(就是配置檔案中寫好的每個伺服器的id) ,在初始階段,每台伺服器的這個值都是自己伺服器的id,也就是它們都選舉自己為leader。
2)、伺服器最大資料的id,這個值大的伺服器,說明存放了更新的資料。
3)、邏輯時鐘的值,這個值從0開始遞增,每次選舉對應乙個值,也就是說:如果在同一次選舉中,那麼這個值應該是一致的,邏輯時鐘值越大,說明這一次選舉leader的程序更新。
4)、本機在當前選舉過程中的狀態,有以下幾種:looking,following,observing,leading
每台伺服器將自己伺服器的以上資料傳送到集群中的其他伺服器之後,同樣的也需要接收來自其他伺服器的資料,它將做以下的處理:
a、如果所接收資料伺服器的狀態還是在選舉階段(looking 狀態),那麼首先判斷邏輯時鐘值,又分為以下三種情況:
a) 如果傳送過來的邏輯時鐘大於目前的邏輯時鐘,那麼說明這是更新的一次選舉,此時需要更新一下本機的邏輯時鐘值,**如下:
if (n.epoch > logicalclock) {
logicalclock = n.epoch;
recvset.clear();
if(totalorderpredicate(n.leader, n.zxid,getinitid(), getinitlastloggedzxid()))
updateproposal(n.leader, n.zxid);
else
updateproposal(getinitid(),getinitlastloggedzxid());
sendnotifications();
其中的totalorderpredicate函式就是根據傳送過來的封包中的leader id,資料id來與本機儲存的相應資料進行判斷的函式(首先看資料id,資料id大者勝出;其次再判斷leader id,leader id大者勝出),返回true則呼叫updateproposal函式更新資料。
b) 傳送過來資料的邏輯時鐘小於本機的邏輯時鐘
說明對方在乙個相對較早的選舉程序中,這裡只需要將本機的資料廣播出去
c) 兩邊的邏輯時鐘相同,此時也只是呼叫totalorderpredicate函式判斷是否需要更新本機的資料,將最新的選舉結果廣播出去
b、如果所接收伺服器不在選舉狀態,也就是在following或者leading狀態
a) 如果邏輯時鐘相同,將該資料儲存到recvset,如果所接收伺服器宣稱自己是leader,那麼將判斷是不是有半數以上的伺服器選舉它,如果是則設定選舉狀態退出選舉過程
b) 否則這是一條與當前邏輯時鐘不符合的訊息,那麼說明在另乙個選舉過程中已經有了選舉結果,於是將該選舉結果加入到outofelection集合中,再根據outofelection來判斷是否可以結束選舉,如果可以也是儲存邏輯時鐘,設定選舉狀態,退出選舉過程
以乙個簡單的例子來說明整個選舉的過程.
假設有五颱伺服器組成的zookeeper集群,它們的id從1-5,同時它們都是最新啟動的,也就是沒有歷史資料,在存放資料量這一點上,都是一樣的.假設這些伺服器依序啟動,來看看會發生什麼
1) 伺服器1啟動,此時只有它一台伺服器啟動了,它發出去的報沒有任何響應,所以它的選舉狀態一直是looking狀態
2) 伺服器2啟動,它與最開始啟動的伺服器1進行通訊,互相交換自己的選舉結果,由於兩者都沒有歷史資料,所以id值較大的伺服器2勝出,但是由於沒有達到超過半數以上的伺服器都同意選舉它(這個例子中的半數以上是3),所以伺服器1,2還是繼續保持looking狀態.
3) 伺服器3啟動,根據前面的理論分析,伺服器3成為伺服器1,2,3中的老大,而與上面不同的是,此時有三颱伺服器選舉了它,所以它成為了這次選舉的leader.
4) 伺服器4啟動,根據前面的分析,理論上伺服器4應該是伺服器1,2,3,4中最大的,但是由於前面已經有半數以上的伺服器選舉了伺服器3,所以它只能接收當小弟的命了.
5) 伺服器5啟動,同4一樣,當小弟
Zookeeper 選舉機制
選舉訊息內容 fastleaderelection 選舉演算法介紹 伺服器id 編號。比如有三颱伺服器,編號分別是1,2,3。編號越大在選擇演算法中的權重越大。資料id。伺服器中存放的最大資料id。值越大說明資料越新,在選舉演算法中資料越新權重越大。邏輯時鐘,用來判斷多個投票是否在同一輪選舉週期中,...
zookeeper選舉機制
在分布式系統中選主最直接或者傳統的方法是直接選定集群的乙個節點為 leader,其它的節點為 follower,這樣引入的乙個問題是如果 leader節點掛掉,整個集群就掛掉了。所以我們需要一種自動選主演算法,如果 leader節點掛掉,則從 follower節點中選出乙個主節點。選舉階段 lead...
Zookeeper集群選舉機制
zookeeper預設的演算法是fastleaderelection,採用投票數大於半數則勝出的邏輯。選舉依據 伺服器id 比如有3臺伺服器,編號分別為 1,2,3。編號越大,在選舉演算法中的權重越大。選舉狀態 looking,競選狀態。following,隨從狀態。同步leader狀態,參與投票。...