精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

成人精品动漫| 色网站在线免费观看| 99久久久久久中文字幕一区| 日韩三级在线观看| 男人揉女人奶房视频60分| 黄色av网址在线免费观看| 久久精品国产色蜜蜜麻豆| 欧美人与性动交| xxxxx在线观看| 欧美片网站免费| 91激情五月电影| youjizz.com在线观看| 天天干天天做天天操| 日韩电影一区二区三区| 97免费中文视频在线观看| 伊人影院综合网| 加勒比视频一区| 91精品国产综合久久国产大片| 777777av| 手机在线免费观看av| 久久久国产精品午夜一区ai换脸| 91视频国产一区| 亚洲欧美另类在线视频| 在线 亚洲欧美在线综合一区| 一区二区在线视频播放| 一级欧美一级日韩片| www一区二区三区| 在线精品亚洲一区二区不卡| 国产曰肥老太婆无遮挡| 日本蜜桃在线观看| 久久久91精品国产一区二区三区| 国产伦精品一区二区三区视频孕妇| 一级片视频免费| 日本午夜一本久久久综合| 韩日精品中文字幕| 免费在线一区二区三区| 99视频精品全部免费在线视频| 亚洲精品在线视频| 精品人妻伦一二三区久| 2023国产精华国产精品| 91精品国产免费| 久久久精品高清| 国产成人精品一区二区三区在线| 欧美色视频日本版| 婷婷五月综合缴情在线视频| 欧美寡妇性猛交xxx免费| 亚洲欧洲一区二区在线播放| 日韩亚洲视频在线| 国产午夜精品一区理论片| 99re8在线精品视频免费播放| 99精彩视频| 精品区在线观看| 国产成人自拍高清视频在线免费播放| 亚洲一区二区三区视频播放| 91九色蝌蚪91por成人| 人人精品人人爱| 国产精品亚洲片夜色在线| 国产精品午夜一区二区| 秋霞成人午夜伦在线观看| 国产999精品久久久影片官网| www.毛片.com| 日韩av不卡在线观看| 国产精品高清在线观看| 国产精品国产精品国产| 久久精品国产亚洲高清剧情介绍 | 伊人中文字幕在线观看 | 亚洲精品日韩一| 国产911在线观看| 曰本三级在线| 午夜欧美在线一二页| 99视频在线免费播放| 亚洲三级欧美| 在线视频欧美精品| 在线黄色免费看| 久久视频免费| 亚洲精品电影网| 国产sm调教视频| 在线看片不卡| 青青草成人在线| 亚洲天堂aaa| 国产精品一区二区视频| 久久精品日产第一区二区三区| 久久国产精品高清一区二区三区| 国产精品剧情在线亚洲| 欧美另类videosbestsex日本| 精品日韩av| 欧美伊人久久大香线蕉综合69| www.成年人| 久久九九热re6这里有精品| 国产亚洲视频中文字幕视频| 男人的午夜天堂| 日韩午夜激情| 国产欧美一区二区| 好男人www在线视频| 久久久电影一区二区三区| 最新欧美日韩亚洲| av影院在线免费观看| 欧美性大战xxxxx久久久| 又色又爽又黄18网站| 欧美精品一区二区三区中文字幕| 久久国产精品久久国产精品| 天天操天天操天天操天天| 精品一区二区三区欧美| 成人资源av| aaa日本高清在线播放免费观看| 樱桃国产成人精品视频| 久久黄色免费看| av不卡一区二区| 久久精品国产96久久久香蕉| 在线观看免费国产视频| 国产一区二区免费在线| 欧美视频1区| av老司机在线观看| 欧美精品aⅴ在线视频| 国产福利短视频| 欧美日韩国产亚洲一区| 国产精品久久久久久搜索| 男人天堂手机在线观看| 亚洲欧洲一区二区三区| 欧美精品aaaa| 婷婷精品视频| 久久久久久一区二区三区 | 午夜精品久久久久久久久久蜜桃| 日韩一区二区三区在线观看| 亚洲图片另类小说| 99riav1国产精品视频| 91国产在线免费观看| 1pondo在线播放免费| 色天使色偷偷av一区二区| 成人在线电影网站| 国产真实久久| 99se婷婷在线视频观看| 国产福利视频在线观看| 欧美日韩久久一区二区| 五月婷六月丁香| 久久亚洲电影| 欧美亚州在线观看| 韩国成人动漫| 亚洲欧美国产视频| 亚洲 欧美 日韩 综合| 成人av在线播放网站| 久久久久久久香蕉| 日韩中文字幕在线一区| 大胆人体色综合| 国产色综合视频| 亚洲色图视频网| 一级黄色高清视频| 欧美在线二区| 99国精产品一二二线| 久色国产在线| 欧美精品一区二区蜜臀亚洲| 久久机热这里只有精品| 盗摄精品av一区二区三区| 2022中文字幕| 国产精品久久久久久久久久白浆 | 成人免费三级在线| 男女私大尺度视频| 女同一区二区三区| 欧美与黑人午夜性猛交久久久| 天天操天天干天天干| 疯狂蹂躏欧美一区二区精品| 新91视频在线观看| 日韩av电影天堂| 午夜啪啪福利视频| 波多野结衣在线一区二区 | 久久网站最新地址| 日本va中文字幕| 99精品国产一区二区三区| 成人在线激情视频| 美女网站视频在线| 日韩精品999| 中国a一片一级一片| 中文字幕一区在线观看视频| 丰满少妇中文字幕| 99国产精品自拍| 亚洲成人蜜桃| 视频免费一区二区| 日本sm极度另类视频| 18视频免费网址在线观看| 欧美精品免费视频| 国产无遮挡又黄又爽又色| 久久久三级国产网站| 在线观看国产一级片| 欧美午夜久久| 日本黄网免费一区二区精品| 国产电影一区二区| 26uuu久久噜噜噜噜| 丝袜美腿美女被狂躁在线观看| 日韩一区二区影院| 国产亚洲欧美日韩高清| 一区二区三区精品| 亚洲欧美视频在线播放| 国产呦精品一区二区三区网站| 国产69精品久久久久久久| 日韩欧美视频在线播放| caoporn国产精品免费公开| 中老年在线免费视频| 久久影院模特热| 嫩草精品影院| 欧美成人一级视频| 一区二区视频在线免费观看| 亚洲一区二区三区四区在线| 91精品国自产在线| youjizz久久| 中文字幕 欧美日韩| 香蕉久久夜色精品| 国产免费xxx| sdde在线播放一区二区| 国偷自产av一区二区三区小尤奈| 日韩美香港a一级毛片| 57pao成人国产永久免费| 在线中文字幕第一页| 色婷婷成人综合| 日本天堂在线| 亚洲成人久久一区| 99精品免费观看| 欧美亚洲一区二区三区四区| 一级片中文字幕| 亚洲精品亚洲人成人网在线播放| 国产又粗又猛又爽又黄的视频四季 | 久蕉依人在线视频| 亚洲成人aaa| 国产免费一区二区三区免费视频| 在线一区二区三区四区五区 | 日韩国产高清影视| 777精品久无码人妻蜜桃| 亚洲欧美文学| 国产精品无码乱伦| 久久中文字幕av| 欧美一区亚洲二区| 伊人成综合网yiren22| 国产精品美女诱惑| 99国产精品免费网站| 亚洲va欧美va国产综合剧情| 四虎地址8848精品| 国产精品中文久久久久久久| 亚洲mmav| 国产精品久久久久久久久| 成人啊v在线| 国产精品白嫩美女在线观看| 欧美成人黑人| 日韩美女av在线免费观看| 二区三区不卡| 国产成人aa精品一区在线播放| www.精品| 国产成人精品av在线| 日韩av福利| 国产精品久久77777| www.久久.com| 国产欧美 在线欧美| 国产一区高清| 91久久精品美女高潮| 国产麻豆精品| 高清av免费一区中文字幕| 国产精品毛片视频| 精品一区久久久久久| 亚洲资源网站| 亚洲春色综合另类校园电影| 久久国产影院| 9191国产视频| 亚洲欧洲一区二区天堂久久| 免费欧美一级视频| 免费久久99精品国产自在现线| 激情婷婷综合网| 久久99精品一区二区三区三区| 午夜诱惑痒痒网| 国产宾馆实践打屁股91| 久久福利小视频| 欧美国产禁国产网站cc| 永久久久久久久| 午夜精品福利久久久| 亚洲成熟少妇视频在线观看| 欧美性生活久久| av中文字幕在线免费观看| 精品国产凹凸成av人导航| 亚洲av片一区二区三区| 在线观看视频99| 人人澡人人添人人爽一区二区| 91国自产精品中文字幕亚洲| 国产成人精品123区免费视频| 亚洲一区制服诱惑| 欧美aaaaa级| 自拍偷拍一区二区三区| 国产综合亚洲精品一区二| 啊啊啊一区二区| 国产在线一区观看| 国产熟妇搡bbbb搡bbbb| 中文字幕亚洲精品在线观看| 日本熟妇一区二区| 欧美性色欧美a在线播放| av一级黄色片| 亚洲人午夜色婷婷| 亚洲欧美成人影院| 国产精品第二页| 大型av综合网站| 日韩欧美一区二区三区四区五区| 欧美日韩亚洲一区三区| 欧美 日韩 国产 激情| 成人激情午夜影院| 黄色激情小视频| 精品久久久久久久久久| 在线观看免费黄色小视频| 亚洲国产精品资源| 黄网站在线播放| 国产精品久久91| 欧美毛片免费观看| 欧美美女黄色网| 欧美aaaaa成人免费观看视频| 制服丝袜在线第一页| 国产精品久久国产精麻豆99网站| 在线观看精品国产| 欧美一级生活片| 色网站在线看| 日本sm极度另类视频| 国产一区丝袜| 黄色小视频大全| 青青草国产成人99久久| 午夜av免费看| 亚洲成人av电影| 国产女人18毛片水18精| 在线视频欧美性高潮| 一区二区电影免费观看| 韩国精品一区二区三区六区色诱| 亚洲情侣在线| 四季av一区二区三区| 久久久国产精品麻豆| 久久久久久91亚洲精品中文字幕| 日韩女优视频免费观看| 91亚洲天堂| 成人乱色短篇合集| 欧美gayvideo| 美女少妇一区二区| 国产精品网站导航| 日本精品入口免费视频| 亚洲天堂av女优| 神马久久资源| 欧美一级爱爱| 老司机午夜精品视频| 亚洲天堂资源在线| 欧美日韩国产综合新一区| 日韩一区二区三区不卡| 欧美激情视频在线观看| 欧美日本三级| www.日本三级| 国产69精品久久777的优势| 中文字幕影音先锋| 精品国产伦一区二区三区观看方式 | 久久蜜桃av一区二区天堂 | 鲁鲁狠狠狠7777一区二区| 日韩午夜精品| 欧美成人午夜精品免费| 日韩欧美a级成人黄色| 欧洲亚洲在线| 日韩av电影国产| 欧美在线色图| 国产欧美激情视频| 亚洲精品中文字幕乱码三区| 亚洲欧美强伦一区二区| 91精品国产一区| 国产欧美亚洲精品a| 欧美成年人视频在线观看| 亚洲人成小说网站色在线| 亚洲av无码乱码国产精品久久| 欧美激情区在线播放| 另类在线视频| www.四虎成人| 国产精品成人一区二区艾草| www男人的天堂| 51精品在线观看| 欧美久久综合网| 中文字幕在线视频一区二区三区| 一区二区三区免费| 天堂成人在线| 国产精品稀缺呦系列在线| 综合精品一区| 亚洲中文字幕一区| 欧美亚州韩日在线看免费版国语版| 秋霞成人影院| 国产精品一区二区三区免费| 久久永久免费| 国产这里有精品| 亚洲精品在线看| 久久影院一区二区三区| 成人在线观看你懂的| 国产无遮挡一区二区三区毛片日本| 一本色道久久综合无码人妻| 久久久久久综合网天天| 精品在线播放| 欧美熟妇另类久久久久久多毛| 天天综合日日夜夜精品| 天堂а√在线资源在线| 久久99欧美| 国内精品伊人久久久久影院对白| 日韩美女黄色片| 日韩中文在线视频| 欧美亚洲大陆| 日韩欧美中文视频| 91久久精品一区二区| 免费在线观看av电影| 亚洲欧美国产精品桃花|