1. 程式人生 > >zookeeper leader選舉機制

zookeeper leader選舉機制

最近看了下zookeeper的原始碼,先整理下leader選舉機制

先看幾個關鍵資料結構和函式

服務可能處於的狀態,從名字應該很好理解

public enum ServerState {
  LOOKING, FOLLOWING, LEADING, OBSERVING;
}

選票引數,還有Notification,引數也都差不多

複製程式碼
    static public class ToSend {
        long leader;                      //leader id
        long zxid;                         //選票的zxid
        long electionEpoch;                //投票輪數
        QuorumPeer.ServerState state;      //狀態
        long sid;                           //投票人id
        long peerEpoch;                    //選票的epoch
    }
複製程式碼

選票的比較邏輯也很簡單,依次比較幾個關鍵欄位

    protected boolean totalOrderPredicate(long newId, long newZxid, long newEpoch, long curId, long curZxid, long curEpoch) {
        ...
        return ((newEpoch > curEpoch) || 
                ((newEpoch == curEpoch) &&
                ((newZxid > curZxid) || ((newZxid == curZxid) && (newId > curId)))));
    }

選舉流程

1. 發起投票:

  首先投票給自己,然後給所有Acceptor;

2. 等待ack

  先判斷自身狀態

    1)如果自身狀態不是LOOKING:

      說明已經有多數派通過選舉結果,直接將選舉結果通知給來源方;

    2)如果自身狀態是LOOKING:

      檢查投票者狀態:

        2.1)如果選票是LOOKING發起的,說明當前正在選舉,需要收集選票,檢查選舉條件:

          首先檢查選票輪數:
            如果小於自身投票的輪數,說明收到的選票過期,忽略;
            如果大於自身投票的輪數,說明自己已經out:
              清空選票箱,根據優先順序更新自己的選票,然後notify;
            如果等於自身投票的輪數,投票有效:
              根據優先順序更新自己的選票,然後notify;

          將選票投入選票箱;

          檢查最新選票是否可以通過:

            不滿足通過條件:
              繼續等待新的選票:
            滿足通過條件:
              接收新選票,看能否收到優先順序更高的選票:
                如果有優先順序高的選票,繼續迴圈;
                否則投票結束,更新狀態。
        2.2)如果選票是FOLLOWING、LEADING發起的,說明已有多數派通過選舉,此時只需確認是否滿足多數派:

          檢查選票是否滿足多數派:

            2.2.1)滿足選票終結。
            2.2.2)繼續迴圈等待

程式碼流程還算清晰,再來考慮下實際投票中可能情況,以上邏輯能否滿足:

1. 一臺宕機重啟的機器加入已有環境

  此時肯定有一個多數派接收選票時進入狀態1),這個多數派會將當前選舉結果返回,這些選票的處理流程都會進入2.2,當所有選票收到時,2.2.1滿足,選舉結束

2. 一臺機器加入正在投票中的環境

  如果當前機器的,如果所有server都會接受優先順序最高的投票,投票會逐漸收斂,最高優先順序最高的選票當選,選舉結束;

3. 當叢集中多數機器宕機重啟

  存活的服務發現不滿足多數派,改變狀態為LOOKING,投票輪數+1, 然後重新開始投票,此時會進入上面情況2。

以上,只要有超過半數的機器存活,經過投票,收斂後,最終會完成投票。

相關推薦

zookeeper leader選舉機制

最近看了下zookeeper的原始碼,先整理下leader選舉機制 先看幾個關鍵資料結構和函式 服務可能處於的狀態,從名字應該很好理解 public enum ServerState {   LOOKING, FOLLOWING, LEADING, OBSERVING; } 選票引數,還有Notifi

ZookeeperLeader選舉機制示例

本文介紹下zookeeper中leader選舉機制的基本用法和關鍵知識點。 一、 選項設定 提到Leader選舉,先需要重點介紹下建立znode時的Flag選項。 ZOO_EPHEMERAL ZOO_EPHEMERAL,用來標記當建立這個znode的節點和Zookeepe

leader 選舉機制

pic ati lower quorum leader asp class nal 共享 from: http://www.jasongj.com/2015/01/02/Kafka%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90/ 一種非常常用的選舉

zookeeper選舉機制(比較清晰)

一、前言   前面學習了Zookeeper服務端的相關細節,其中對於叢集啟動而言,很重要的一部分就是Leader選舉,接著就開始深入學習Leader選舉。 二、Leader選舉   2.1 Leader選舉概述   Leader選舉是保證分散式資料一致性的關鍵所在。當Zookeepe

ZooKeeper叢集選舉機制和叢集搭建

簡介: Zookeeperr是一個 開源 的分散式應用程式協調伺服器是Hadoop的重要元件 ZooKeeper是一個 分散式的開放原始碼分散式應用程式協調伺服器,它是一個為分散式應用提供一致性服務的軟體,提供功能包括:配置維護、域名服務、分散式同步、叢集管理等。 功能: &nbs

Zookeeper leader選舉

讓我們分析如何在ZooKeeper集合中選舉leader節點。考慮一個叢集中有N個節點。leader選舉的過程如下: 所有節點建立具有相同路徑 /app/leader_election/guid_ 的順序、臨時節點。 ZooKeeper集合將附加10位序列號到路徑,建

zookeeper選舉機制及客戶端命令列

選舉機制 首先給自己一票 注意事項 只要有半數以上的節點存活就能正常工作 如何保證半數以上的存活? 配置zk叢集要配置奇樹臺 偶數個跟奇數個叢集的宕機容忍度相同,所以偶數個屬於浪費資源 zookeeper客戶端命令列 1、啟動客戶端 zkCli.sh 2、檢視幫

zookeeper leader 選舉演算法

http://www.cnblogs.com/leesf456/p/6107600.html 一、前言   前面學習了Zookeeper服務端的相關細節,其中對於叢集啟動而言,很重要的一部分就是Leader選舉,接著就開始深入學習Leader選舉。 二、Leader選舉

Zookeeper選舉機制

半數機制: 叢集中半數以上機器存活,叢集可用。所以zookeeper適合裝在奇數臺機器上。 Zookeeper雖然在配置檔案中並沒有指定master和slave。但是,zookeeper工作時,是有一個

Zookeeper-Zookeeper leader選舉

在上一篇文章中我們大致瀏覽了zookeeper的啟動過程,並且提到在Zookeeper的啟動過程中leader選舉是非常重要而且最複雜的一個環節。那麼什麼是leader選舉呢?zookeeper為什麼需要leader選舉呢?zookeeper的leader選舉的過程又是什麼樣子的?本文的目的就是解決這三個問題

Zookeeper -- leader選舉

        Zookeeper的核心是源自廣播,實現這個機制的協議是Zab協議。Zab協議有兩種模式,分別是恢復模式和廣播模式。當伺服器啟動或者領導者崩潰後,Zab就進入了恢復模式,當領導者被選舉出來,且大多數Server完成了和leader的狀態同步以後,恢復模式就結

ZooKeeper選舉機制,你瞭解多少?

![](https://img2020.cnblogs.com/blog/759200/202103/759200-20210310161133991-1371384793.png) 本文作者:HelloGitHub-老荀 Hi,這裡是 HelloGitHub 推出的 HelloZooKeeper 系列,

zookeeper curator學習(配合spring boot模擬leader選舉

round 一段時間 .cn cti -s col tid void sco 基礎知識:http://www.cnblogs.com/LiZhiW/p/4930486.html 項目路徑:https://gitee.com/zhangjunqing/spring-boo

8.8.ZooKeeper 原理和選舉機制

TE 宋體 per 機制 CA tro 通過 family 沒有 1.ZooKeeper原理   Zookeeper雖然在配置文件中並沒有指定master和slave但是,zookeeper工作時,是有一個節點為leader,其他則為follower,Leader是通 過內

Zookeeper詳解(七):Zookeeper集群啟動過程和Leader選舉

文件 信息 accep upm ron factory 通信 pan actor Zookeeper集群啟動過程預啟動統一由QuorumPeerMain作為啟動類讀取zoo.cfg配置文件創建並啟動歷史文件清理器DatadirCleanupManager判斷當前是集群模式還

【轉】Zookeeper學習---zookeeper 選舉機制介紹

erp change 交換 內容 數值 所有 ase 一輪 eval 【原文】https://www.toutiao.com/i6593162565872779784/ zookeeper集群 配置多個實例共同構成一個集群對外提供服務以達到水平擴展的目的,每個服務器上的數據

ZooKeeper 選舉機制

keep owin 正常的 需要 分別是 領導者 反饋 election 數據 ookeeper 默認的算法是 FastLeaderElection,采用投票數大於半數則勝出的邏輯。6.1 . 概念服務器 ID比如有三臺服務器,編號分別是 1,2,3。編號越大在選擇算法中的

zookeeper叢集的選舉機制

 Zookeeper預設的演算法是FastLeaderElection, 採用投票數大於半數則勝出的邏輯。     選舉依據:         伺服器ID: &n

zookeeper 半數可用/選舉機制

1.半數可用機制,半數可用指的是zk叢集中一半以上的機器正常時叢集才能正常工作 已經啟動了hadoop002(follower),hadoop003(leader) 下面停止hadoop002   在hadoop003上檢視zk狀態發現已經不能提供服務,因為2的半數以上至少是2,1不滿足條件

Zookeeper 原始碼(五)Leader 選舉

Zookeeper 原始碼(五)Leader 選舉 前面學習了 Zookeeper 服務端的相關細節,其中對於叢集啟動而言,很重要的一部分就是 Leader 選舉,接著就開始深入學習 Leader 選舉。 一、選舉規則 Leader 選舉是保證分散式資料一致性的關鍵所在。當 Zookeeper 叢集中的