精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官問我zookeeper選舉過程,我當場給他講了源碼

系統 Linux
本文主要是基于 zookeeper 3.8.0 講解, 主要是通過源碼的維度來分析 zookeeper 選舉過程 對于 zookeeper 的源碼編譯大家可以參考:編譯運行Zookeeper源碼.

[[390827]]

集群概述

zookeper 在生產環境中通常都是通過集群方式來部署的,以保證高可用, 下面是 zookeeper 官網給出的一個集群部署結構圖:


從上圖可以得出, zookeeper server 的每個節點都和主節點保持通訊的,每個節點上面都存儲有數據和日志的備份,只有當大多數節點可用集群才是可用的。本文主要是基于 zookeeper 3.8.0 講解, 主要是通過源碼的維度來分析 zookeeper 選舉過程 對于 zookeeper 的源碼編譯大家可以參考:編譯運行Zookeeper源碼

集群節點狀態

集群節點狀態定義在 QuorumPeer#ServerState 枚舉,主要是包含 LOOKING、FOLLOWING、LEADING、OBSERVING 四個狀態, 下面是定義的代碼和說明

  1. public enum ServerState { 
  2.     // 尋找leader狀態。當服務器處于該狀態時,它會認為當- 前集群中沒有leader,因此需要進入leader選舉狀態。 
  3.     LOOKING, 
  4.     // 跟隨者狀態。表明當前服務器角色是 follower。 
  5.     FOLLOWING,   
  6.     // 領導者狀態。表明當前服務器角色是 leader。 
  7.     LEADING, 
  8.     // 觀察者狀態。表明當前服務器角色是 observer。 
  9.     OBSERVING 

Leader 選舉過程

啟動和初始化

QuorumPeerMain 是 zookeeper 的啟動類, 通過 main 方法啟動

  1. // 不展示非核心代碼 
  2. public static void main(String[] args) { 
  3.     QuorumPeerMain main = new QuorumPeerMain(); 
  4.     main.initializeAndRun(args); 
  5. protected void initializeAndRun(String[] args) throws ConfigException, IOException, AdminServerException { 
  6.     // 集群模式啟動 
  7.     if (args.length == 1 && config.isDistributed()) { 
  8.         runFromConfig(config); 
  9.     } else { 
  10.     } 
  11. public void runFromConfig(QuorumPeerConfig config) throws IOException, AdminServerException { 
  12.     // quorumPeer 啟動 
  13.  quorumPeer.start(); 

QuorumPeer 是一個線程實例類,當調用 start 方法過后會致性 QuorumPeer#run() 方法, 進行集群狀態的判斷最終進入是否執行選舉或者同步集群節點數據信息等一系列的操作,下面是核心代碼:

  1. @Override 
  2. public void run() { 
  3.     try { 
  4.         while (running) { 
  5.             switch (getPeerState()) { 
  6.                 case LOOKING: 
  7.                     // 投票給自己 
  8.                     setCurrentVote(makeLEStrategy().lookForLeader()); 
  9.                     break; 
  10.                 case OBSERVING: 
  11.                     setObserver(makeObserver(logFactory)); 
  12.                     observer.observeLeader(); 
  13.                     break; 
  14.                 case FOLLOWING: 
  15.                     setFollower(makeFollower(logFactory)); 
  16.                     follower.followLeader(); 
  17.                     break; 
  18.                 case LEADING: 
  19.                     setLeader(makeLeader(logFactory)); 
  20.                     leader.lead(); 
  21.                     setLeader(null); 
  22.                     break; 
  23.             } 
  24.         } 
  25.     } finally { 
  26.     } 

進行選舉

FastLeaderElection 是選舉的核心類 ,在這個類里面有對投票和選票的處理過程

  1. public Vote lookForLeader() throws InterruptedException { 
  2.     // 創建一個當前選舉周期的投票箱 
  3.     Map<Long, Vote> recvset = new HashMap<Long, Vote>(); 
  4.     // 創建一個投票箱。這個投票箱和recvset 不一樣。 
  5.     // 存儲當前集群中如果已經存在Leader了的投票 
  6.     Map<Long, Vote> outofelection = new HashMap<Long, Vote>(); 
  7.     int notTimeout = minNotificationInterval; 
  8.     synchronized (this) { 
  9.         // 遞增本地選舉周期 
  10.         logicalclock.incrementAndGet(); 
  11.         // 為自己投票 
  12.         updateProposal(getInitId(), getInitLastLoggedZxid(), getPeerEpoch()); 
  13.     } 
  14.     // 廣播投票 
  15.     sendNotifications(); 
  16.     SyncedLearnerTracker voteSet = null
  17.     // 如果當前服務器的狀態為Looking,和stop參數為false,那么進行選舉 
  18.     while ((self.getPeerState() == ServerState.LOOKING) && (!stop)) { 
  19.         if (n.electionEpoch > logicalclock.get()) { 
  20.             logicalclock.set(n.electionEpoch); 
  21.             recvset.clear(); 
  22.             // totalOrderPredicate 投票 PK 
  23.             if (totalOrderPredicate(n.leader, n.zxid, n.peerEpoch, getInitId(), getInitLastLoggedZxid(), getPeerEpoch())) { 
  24.                 updateProposal(n.leader, n.zxid, n.peerEpoch); 
  25.             } else { 
  26.                 updateProposal(getInitId(), getInitLastLoggedZxid(), getPeerEpoch()); 
  27.             } 
  28.             sendNotifications(); 
  29.         } else if (totalOrderPredicate(n.leader, n.zxid, n.peerEpoch, proposedLeader, proposedZxid, proposedEpoch)) { 
  30.             updateProposal(n.leader, n.zxid, n.peerEpoch); 
  31.             sendNotifications(); 
  32.         } 
  33.         // 監聽通信層接收的投票 
  34.         Notification n = recvqueue.poll(notTimeout, TimeUnit.MILLISECONDS); 
  35.         // 放入投票箱 
  36.         recvset.put(n.sid, new Vote(n.leader, n.zxid, n.electionEpoch, n.peerEpoch)); 
  37.         // 過半邏輯 
  38.         voteSet = getVoteTracker(recvset, new Vote(proposedLeader, proposedZxid, logicalclock.get(), proposedEpoch)); 
  39.     } 

totalOrderPredicate 主要是選票 PK 的邏輯,我們再來看看代碼:

  1. protected boolean totalOrderPredicate(long newId, long newZxid, long newEpoch, long curId, long curZxid, long curEpoch) { 
  2.     if (self.getQuorumVerifier().getWeight(newId) == 0) { 
  3.         return false
  4.     } 
  5.     return ((newEpoch > curEpoch) 
  6.             || ((newEpoch == curEpoch) 
  7.                 && ((newZxid > curZxid) 
  8.                     || ((newZxid == curZxid) 
  9.                         && (newId > curId))))); 

選舉過程是這個樣子的 ,其實官方也給出了注釋:

  1. 先比較選舉的屆數,屆數高的說明是最新一屆,勝出
  2. 再比較zxid,也就是看誰的數據最新,最新的勝出
  3. 最后比較serverid,這是配置文件指定的,節點id大者勝出 選舉完成后通過 sendNotifications(); 通知其他的節點。

過程總結

前面我粗略的講解 zookeeper 從啟動過程在到選舉,選舉結果同步的,以及如何進行投票的選舉結果確認過程,但是 zookeeper 作為一個高性能、高可靠的分布式協調中間件,在很多設計的細節也是非常的優秀的。

投票過程

通常情況下,在投票的過程中 zxid 越大越有可能成為 leader 主要是由于 zxid 越大該節點的數據越多,這樣的話就可以減少數據的同步過程中節點事務的撤銷和日志文件同步的比較過程,以提升性能。下面是 5 個 zookeeper 節點選舉的過程。


注: (sid, zxid), 當前場景為 server1 ,server2 出現故障 , server3 的 zxid = 9 , server4 和 server5 的 zxid 為 8. 進行兩輪選舉,最終選出 sever3 為 leader 節點

多層網絡架構

在前面的分析過程中我省略了 Zookeeper 節點之間通訊的 NIO 操作, 這部分簡單來講 zookeeper 將他們劃分為傳輸層和業務層。通過 SendWorker、RecvWorker 處理網絡層數據包, WorkerSender 和 WorkerReceiver 處理業務層的數據。


這里會涉及到多線程操作,zookeeper 在源碼中也給出了大量的日志信息,對于初學者有一定的難度,對此大家可以參考下面的 Zookeeper 選舉源碼流程 這部分的流程圖來輔助分析。

Leader 選舉源碼流程

結合上面的梳理,我對 zookeeper 啟動和選舉的流程做了一個比較詳細的梳理。大家可以結合 zookeeper 源碼來理解。

參考文檔

  1. apache zookeeper 官網
  2. Zookeeper的領導者選舉機制解析
  3. 理解Zookeeper的Leader選舉過程

 

責任編輯:姜華 來源: 運維開發故事
相關推薦

2021-12-02 08:19:06

MVCC面試數據庫

2013-12-25 09:33:07

生成樹STP選舉

2022-04-10 18:10:24

CURD鏈表

2021-12-06 08:30:49

SpringSpring Bean面試題

2021-05-20 08:54:16

Go面向對象

2020-04-16 08:22:11

HTTPS加解密協議

2010-08-23 15:06:52

發問

2022-05-24 08:03:28

InnoDBMySQL數據

2020-12-01 11:50:49

數據庫Redis面試

2022-10-08 00:08:00

apiESFacebook

2021-06-03 08:55:54

分布式事務ACID

2020-11-12 18:20:28

接口數據分布式

2019-04-15 14:40:46

消息隊列Java編程

2022-10-17 00:04:30

索引SQL訂單

2020-12-03 07:39:50

HashMap底層數據

2023-01-03 18:06:42

高并發架構

2021-11-24 10:10:32

axios前端攔截器

2022-04-19 07:31:28

事務隔離機制數據庫

2020-08-10 07:58:18

異步編程調用

2021-05-19 08:17:35

秒殺場景高并發
點贊
收藏

51CTO技術棧公眾號

日本国产欧美一区二区三区| 欧美亚洲综合久久| 欧美一区二区三区白人| 国产精品9999| www.日本久久| 国产午夜久久久| 日韩中文在线| 狠狠色香婷婷久久亚洲精品| 欧洲国产精品| 国产天堂av在线| 免费成人动漫| 麻豆国产一区二区| 日韩精品久久久久| 九九视频精品在线观看| 中文字幕乱码视频| 91精品久久久久久久久久不卡| 欧美一级国产精品| 国产v片免费观看| 在线观看你懂的网站| 欧美aaaaaaaaaaaa| 欧美日韩午夜激情| 日本免费高清一区二区| av小说天堂网| 天堂av在线一区| 精品久久国产97色综合| 99精品一区二区三区的区别| 久久久久久久久精| 蜜桃在线一区| 中文字幕日韩一区| 国产日韩在线视频| 国产又粗又硬视频| 国产私拍福利精品视频二区| 亚洲同性同志一二三专区| 国产精品日韩欧美一区二区| 黑人巨大精品一区二区在线| 欧美一性一交| 欧美一区在线视频| 黄色片在线免费| 1234区中文字幕在线观看| 国产精品一区二区久久精品爱涩| 2019中文字幕在线| 欧美做受喷浆在线观看| 韩国成人在线| 一本色道久久综合狠狠躁的推荐| 在线观看av的网址| 在线观看国产小视频| 亚洲人成网站77777在线观看 | 五月激情五月婷婷| 久久www人成免费看片中文| 国产精品三级在线观看| 国产精品久久久久久婷婷天堂| 精品视频久久久久| 天天影视综合| 欧美老肥妇做.爰bbww| 欧美在线播放一区| 深夜福利在线看| 成人精品视频一区二区三区尤物| 91久久精品国产91性色| 26uuu成人网| 日韩精品一卡| 国产一区二区日韩精品欧美精品| 草草影院第一页| 国产成人精品亚洲线观看| 欧美一级在线免费| 红桃视频一区二区三区免费| 97久久精品一区二区三区的观看方式 | 欧美日韩国产在线| 国产伦精品一区二区三区四区视频_ | 四虎884aa成人精品| 精品久久视频| 尤物tv国产一区| 一级黄色录像在线观看| 美女写真久久影院| 在线精品观看国产| 国产 porn| 日本欧美一区| 7777精品伊人久久久大香线蕉超级流畅 | 日本国产在线| 久久精品视频网| 欧美日韩一区在线视频| 亚洲欧美另类在线视频| 噜噜噜91成人网| 一本大道亚洲视频| 国产传媒在线看| 国产精品7m凸凹视频分类| 久久久999精品| 登山的目的在线| 一区二区三区国产精华| 精品国产一区二区国模嫣然| wwwww在线观看| 欧美日韩精品免费观看视欧美高清免费大片 | 欧美一区=区| 精品国产拍在线观看| 一区二区三区影视| 欧美日韩国产色综合一二三四| 欧美激情视频在线| 日本熟妇乱子伦xxxx| 亚洲视频二区| 精品国产一区二区三区久久| 四虎884aa成人精品| 狠狠噜噜久久| 夜夜嗨av一区二区三区免费区| 成人免费视频入口| 欧美黄色免费| 欧洲精品毛片网站| 国语对白做受69按摩| 狠狠色综合播放一区二区| 91原创国产| 日韩欧美亚洲系列| 成人欧美一区二区三区小说| 中文精品一区二区三区| 天天躁日日躁狠狠躁喷水| 奇米色777欧美一区二区| 91在线视频精品| 你懂的视频在线| 一区二区视频在线| 日韩av播放器| 风间由美一区二区av101| 亚洲日本成人网| 欧美一区二区三区爽爽爽| 国产成人澳门| 中文字幕亚洲图片| 欧美丰满少妇人妻精品| 日韩欧美精品一区| 午夜精品www| 国产又大又长又粗| 久久久精品免费网站| 黄网站色视频免费观看| 欧美特大特白屁股xxxx| 日韩三级高清在线| 成年人视频软件| 亚洲激情专区| 成人在线视频网站| 国产三级电影在线观看| 亚洲一区二区三区视频在线| 99热这里只有精品在线播放| 国偷自产av一区二区三区| 色偷偷av一区二区三区| 亚洲不卡视频在线观看| 成人在线综合网| 在线不卡日本| gogo亚洲高清大胆美女人体| 日韩久久精品一区| 日韩在线视频免费看| 亚洲美女啪啪| 不卡视频一区二区三区| 国产区在线观看| 国产精品免费视频一区| 日韩二区三区在线观看| 国模视频一区二区| 国产精品国产精品国产专区| 国产色产综合产在线视频| 九色在线视频观看| 大陆精大陆国产国语精品| 欧美激情国产高清| 亚洲爆乳无码一区二区三区| 亚洲免费在线看| 欧美一级视频在线| 日本一区二区免费高清| 国产精品久久久久av免费| 全色精品综合影院| 精品美女国产在线| 在线观看免费视频国产| 欧美一区二区三区久久精品茉莉花| 日本精品久久电影| 亚洲av成人精品毛片| www国产精品av| 秋霞无码一区二区| 日韩成人av在线资源| 中国人与牲禽动交精品| 一本色道久久综合亚洲| 中文字幕亚洲一区二区va在线| 视频在线观看免费高清| 亚洲va欧美va人人爽成人影院| 久久五月天色综合| 九九精品视频免费| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美激情一区二区视频| 欧美片第1页综合| 99精品国产高清在线观看| 欧美高清另类hdvideosexjaⅴ| 精品久久人人做人人爽| 日韩欧美中文字幕一区二区| 久久久蜜臀国产一区二区| 国产精品igao| 自拍偷拍欧美专区| 91精品国产高清久久久久久91裸体 | 日韩精品电影一区二区三区| 蜜臀av在线播放一区二区三区| 亚洲免费视频网站| 在线观看17c| 麻豆一区在线| 57pao精品| 国产中文在线| 4438成人网| 久久一级免费视频| 国产高清不卡一区| 噜噜噜久久亚洲精品国产品麻豆| 欧美日韩在线二区| 国产精品久久久久久超碰| 午夜在线小视频| 亚洲激情中文1区| 韩国三级视频在线观看| 性色一区二区| 手机看片日韩国产| 北条麻妃一区二区三区在线| 91爱视频在线| 日本网站在线免费观看视频| 这里只有精品电影| 国产成人在线免费观看视频| 国产精品人人做人人爽人人添| 搡的我好爽在线观看免费视频| 国产精品久久久久9999高清| 久久综合九色综合久99| 欧美另类中文字幕| 热久久这里只有| 污片视频在线免费观看| 亚洲日韩中文字幕在线播放| 午夜精品久久久久久久爽| 色婷婷久久综合| 久久久夜色精品| 国产精品午夜电影| 欧美一区二区三区精品| 欧美图片自拍偷拍| 日韩av中文字幕一区二区三区 | 你懂得在线网址| 日韩欧美电影一区| 最近中文字幕在线观看| 五月天网站亚洲| 欧美日韩在线观看免费| 国产精品区一区二区三区| 影音先锋资源av| 日韩精品乱码av一区二区| 东北少妇不带套对白| 亚洲欧美综合| 国产又大又长又粗又黄| 水蜜桃精品av一区二区| 日韩在线第一区| 亚洲区小说区图片区qvod| 久久久久久久久久久久久久一区| 成人高潮视频| 国产伦一区二区三区色一情| 精品国产18久久久久久二百| 91久久久久久久久久| 欧美成a人片免费观看久久五月天| 国产成+人+综合+亚洲欧洲| 在线天堂资源| 国产成人欧美在线观看| 国产另类xxxxhd高清| 国产脚交av在线一区二区| 欧美性xxx| 国产精品久久久久久久久久新婚| 成人在线免费| 久久夜色精品亚洲噜噜国产mv| 国产高清一区在线观看| 中文字幕日韩欧美在线| 老司机午夜在线| 久久中文久久字幕| av在线app| 国产69精品久久久| 性欧美又大又长又硬| 青草热久免费精品视频| 播放一区二区| 91亚洲精品一区二区| 一区二区三区在线资源| 国产美女精品久久久| 亚洲婷婷伊人| 亚洲国产精品视频一区| 91精品1区| 免费看黄在线看| 久久精品人人做人人爽电影蜜月| 日韩一级理论片| 国产精品一区在线| 污污污www精品国产网站| 久久久久国产一区二区三区四区| 日韩黄色中文字幕| 夜夜精品浪潮av一区二区三区| 日韩av片在线播放| 欧美一a一片一级一片| jizz中国女人| 亚洲美女性视频| 黄色的网站在线观看| 性视频1819p久久| 97成人超碰| 国产91aaa| 国产亚洲一区二区三区啪 | 网友自拍一区| 亚洲啪啪av| 亚洲区一区二| 91亚洲免费视频| 成人黄色a**站在线观看| 一级片视频免费看| www.欧美日韩国产在线| 日韩女同一区二区三区| 亚洲一区二区三区爽爽爽爽爽| 天干夜夜爽爽日日日日| 欧美视频二区36p| 国产亚洲欧美久久久久| 色综合天天综合给合国产| 国产日韩精品suv| 97在线精品| 亚洲美女搞黄| aa亚洲婷婷| 一起草最新网址| 国产精品网站一区| 91午夜视频在线观看| 91精品国产综合久久久蜜臀图片| 五月婷婷丁香六月| 久久成人人人人精品欧| 国产美女久久| 欧美久久久久久一卡四| 国产精品黄色| 欧美激情第一区| 欧美国产欧美综合| 日本午夜视频在线观看| 欧美不卡一区二区三区| 日本在线www| 国产精品久久久av久久久| 狼人精品一区二区三区在线| 懂色av粉嫩av蜜臀av| 蜜桃久久av一区| 日韩一级av毛片| 精品二区三区线观看| 亚洲精品视频网| 超薄丝袜一区二区| 国产精品99久久久久久董美香| 久久久久久久久久久久久久久久av| 欧美日本不卡| 原创真实夫妻啪啪av| 亚洲日韩欧美一区二区在线| 最新在线中文字幕| 亚洲一区第一页| 日韩成人影音| 日韩精品一线二线三线| 噜噜噜91成人网| 精品欧美一区二区久久久| 色综合天天综合网天天狠天天| 神马久久精品| 97久久久免费福利网址| 国产精品成人自拍| 和岳每晚弄的高潮嗷嗷叫视频 | 欲求不满的岳中文字幕| 亚洲一区二区三区四区不卡| 亚洲精品久久久久avwww潮水 | 久久成人国产精品| 噜噜噜在线视频| 国产激情综合| caoporen国产精品| 黑人一区二区三区四区五区| 韩国三级在线播放| 青青草97国产精品免费观看| 疯狂揉花蒂控制高潮h| 午夜精品久久久久久久蜜桃app| 理论片中文字幕| 韩日欧美一区二区| 欧美日韩一区二区三区不卡视频| 热99这里只有精品| 91麻豆国产在线观看| 亚洲第一网站在线观看| 中文字幕亚洲欧美| 91精品在线免费视频| 亚洲乱码日产精品bd在线观看| 高清不卡一区二区| 成人午夜淫片100集| 亚洲欧洲在线观看| 欧美视频精品| 国产欧美久久久久| 久久这里只有精品首页| 久操视频在线免费观看| 日韩中文字幕在线| 日本综合精品一区| 少妇人妻在线视频| 欧美国产在线观看| 国产无遮挡又黄又爽在线观看| 亚洲精品一区二区三区香蕉| 中文字幕成在线观看| 色一情一乱一伦一区二区三区丨| 久久国产精品区| 亚洲一区二区三区蜜桃| 欧美视频自拍偷拍| 色呦呦网站在线观看| 久久大片网站| 久久精品国产亚洲高清剧情介绍 | 国产欧美一区二区色老头| 91av在线免费| 欧美日韩精品电影| 美女网站视频在线| 色之综合天天综合色天天棕色| 国产精品一区二区在线播放 | 亚洲国产高清高潮精品美女| free欧美| 日韩精品久久一区二区| 国产亚洲欧美中文| 亚洲国产精品一| 国产精品久久久久久久久久三级| 欧美a级在线| 538精品视频| 日韩av在线免费观看| 偷拍自拍亚洲| 亚洲精美视频|