Zookeeper 的集羣選舉機制(一)

Zookeeper默認的算法是FastLeaderElection, 採用投票數大於半數則勝出的邏輯。
    選舉依據:

        服務器ID:

                比如有3臺服務器, 編號分別爲 1, 2, 3。

                編號越大,在選舉算法中的權重越大。

        選舉狀態:

                LOOKING,競選狀態。

                FOLLOWING,隨從狀態。同步leader狀態,參與投票。

                OBSERVING,觀察狀態,同步leader狀態,不參與任何投票。

                LEADING,領導者狀態。

        數據ID:

                服務器中存放的最新數據的version,值越大說明數據版本越新,在選舉算法中的權重越大。

        邏輯時鐘:

                也可以叫投票的次數,同一輪投票過程中的邏輯時鐘是相同的,每投完一次票這個數值都會增加,

                然後與接收到的其他服務器返回的投票信息中的數值相比,根據值不同做出不同的判斷。

       集羣選舉類型:全新集羣選舉與非全新集羣選舉。

          全新集羣選舉:假設現在有5臺服務器均沒有數據,它們的編號分別是1,2,3,4,5,按編號依次啓動。過程如下:

            1. 服務器 1 啓動,給自己投票,然後發投票信息給其他服務器,由於其他服務器沒有啓動,所以它收不到反饋信息,但是由於投票還沒有到達半數(服務器 1 怎麼知道一共有多少臺服務器參與選舉呢, 那是因爲在zk配置文件中配置了集羣信息,所有配置了3888端口的服務器均會參與投票,假設這5臺都參與投票,則超過半數應爲至少3臺服務器參與投票。),所以服務器 1 的狀態一直處於 LOOKING。

            2. 服務器 2 啓動, 給自己投票,然後與其他服務投票信息交換結果, 由於服務器 2 的編號大於服務器 1, 所以服務器 2 勝出,但是由於投票仍未到達半數,所以服務器 2 同樣處於 LOOKING 狀態。

            3. 服務器 3 啓動, 給自己投票,然後與其他服務投票信息交換結果, 由於服務器 3 的編號大於服務器 2,1,所以服務器 3勝出, 並且此時投票數正好大於半數, 所以選舉結束,服務器 3 處於LEADING 狀態, 服務器 1, 服務器 2 處於 FOLLOWING 狀態。

            4. 服務器 4 啓動, 給自己投票, 同時與之前的服務器 1 ,2,3交換信息,儘管服務器 4 的編號最大,但之前服務器 3 已經勝出,所以服務器 4 只能處於 FOLLOWING 狀態。

            5. 服務器 5 啓動, 同上。FOLLOWING狀態。

            6.整個zookeeper集羣啓動以後,領導者就使用2888端口向從屬機開始通信。

         非全新集羣選舉:對於運行正常的zookeeper集羣,中途有機器down掉,需要重新選舉時,選舉過程就需要加入數據ID、服務器ID、和邏輯時鐘。

        這樣選舉就變成:

            1.邏輯時鐘小的選舉結果被忽略,重新投票;(除去選舉次數不完整的服務器)

            2.統一邏輯時鐘後,數據id大的勝出;(選出數據最新的服務器)

            3.數據id相同的情況下,服務器id大的勝出。(數據相同的情況下, 選擇服務器id最大,即權重最大的服務器)
 

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