成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官問(wèn)我zookeeper選舉過(guò)程,我當(dāng)場(chǎng)給他講了源碼

系統(tǒng) Linux
本文主要是基于 zookeeper 3.8.0 講解, 主要是通過(guò)源碼的維度來(lái)分析 zookeeper 選舉過(guò)程 對(duì)于 zookeeper 的源碼編譯大家可以參考:編譯運(yùn)行Zookeeper源碼.

[[390827]]

集群概述

zookeper 在生產(chǎn)環(huán)境中通常都是通過(guò)集群方式來(lái)部署的,以保證高可用, 下面是 zookeeper 官網(wǎng)給出的一個(gè)集群部署結(jié)構(gòu)圖:


從上圖可以得出, zookeeper server 的每個(gè)節(jié)點(diǎn)都和主節(jié)點(diǎn)保持通訊的,每個(gè)節(jié)點(diǎn)上面都存儲(chǔ)有數(shù)據(jù)和日志的備份,只有當(dāng)大多數(shù)節(jié)點(diǎn)可用集群才是可用的。本文主要是基于 zookeeper 3.8.0 講解, 主要是通過(guò)源碼的維度來(lái)分析 zookeeper 選舉過(guò)程 對(duì)于 zookeeper 的源碼編譯大家可以參考:編譯運(yùn)行Zookeeper源碼

集群節(jié)點(diǎn)狀態(tài)

集群節(jié)點(diǎn)狀態(tài)定義在 QuorumPeer#ServerState 枚舉,主要是包含 LOOKING、FOLLOWING、LEADING、OBSERVING 四個(gè)狀態(tài), 下面是定義的代碼和說(shuō)明

  1. public enum ServerState { 
  2.     // 尋找leader狀態(tài)。當(dāng)服務(wù)器處于該狀態(tài)時(shí),它會(huì)認(rèn)為當(dāng)- 前集群中沒(méi)有l(wèi)eader,因此需要進(jìn)入leader選舉狀態(tài)。 
  3.     LOOKING, 
  4.     // 跟隨者狀態(tài)。表明當(dāng)前服務(wù)器角色是 follower。 
  5.     FOLLOWING,   
  6.     // 領(lǐng)導(dǎo)者狀態(tài)。表明當(dāng)前服務(wù)器角色是 leader。 
  7.     LEADING, 
  8.     // 觀察者狀態(tài)。表明當(dāng)前服務(wù)器角色是 observer。 
  9.     OBSERVING 

Leader 選舉過(guò)程

啟動(dòng)和初始化

QuorumPeerMain 是 zookeeper 的啟動(dòng)類, 通過(guò) main 方法啟動(dòng)

  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.     // 集群模式啟動(dòng) 
  7.     if (args.length == 1 && config.isDistributed()) { 
  8.         runFromConfig(config); 
  9.     } else { 
  10.     } 
  11. public void runFromConfig(QuorumPeerConfig config) throws IOException, AdminServerException { 
  12.     // quorumPeer 啟動(dòng) 
  13.  quorumPeer.start(); 

QuorumPeer 是一個(gè)線程實(shí)例類,當(dāng)調(diào)用 start 方法過(guò)后會(huì)致性 QuorumPeer#run() 方法, 進(jìn)行集群狀態(tài)的判斷最終進(jìn)入是否執(zhí)行選舉或者同步集群節(jié)點(diǎn)數(shù)據(jù)信息等一系列的操作,下面是核心代碼:

  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.     } 

進(jìn)行選舉

FastLeaderElection 是選舉的核心類 ,在這個(gè)類里面有對(duì)投票和選票的處理過(guò)程

  1. public Vote lookForLeader() throws InterruptedException { 
  2.     // 創(chuàng)建一個(gè)當(dāng)前選舉周期的投票箱 
  3.     Map<Long, Vote> recvset = new HashMap<Long, Vote>(); 
  4.     // 創(chuàng)建一個(gè)投票箱。這個(gè)投票箱和recvset 不一樣。 
  5.     // 存儲(chǔ)當(dāng)前集群中如果已經(jīng)存在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.     // 如果當(dāng)前服務(wù)器的狀態(tài)為L(zhǎng)ooking,和stop參數(shù)為false,那么進(jìn)行選舉 
  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.         // 監(jiān)聽(tīng)通信層接收的投票 
  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.         // 過(guò)半邏輯 
  38.         voteSet = getVoteTracker(recvset, new Vote(proposedLeader, proposedZxid, logicalclock.get(), proposedEpoch)); 
  39.     } 

totalOrderPredicate 主要是選票 PK 的邏輯,我們?cè)賮?lái)看看代碼:

  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))))); 

選舉過(guò)程是這個(gè)樣子的 ,其實(shí)官方也給出了注釋:

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

過(guò)程總結(jié)

前面我粗略的講解 zookeeper 從啟動(dòng)過(guò)程在到選舉,選舉結(jié)果同步的,以及如何進(jìn)行投票的選舉結(jié)果確認(rèn)過(guò)程,但是 zookeeper 作為一個(gè)高性能、高可靠的分布式協(xié)調(diào)中間件,在很多設(shè)計(jì)的細(xì)節(jié)也是非常的優(yōu)秀的。

投票過(guò)程

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


注: (sid, zxid), 當(dāng)前場(chǎng)景為 server1 ,server2 出現(xiàn)故障 , server3 的 zxid = 9 , server4 和 server5 的 zxid 為 8. 進(jìn)行兩輪選舉,最終選出 sever3 為 leader 節(jié)點(diǎn)

多層網(wǎng)絡(luò)架構(gòu)

在前面的分析過(guò)程中我省略了 Zookeeper 節(jié)點(diǎn)之間通訊的 NIO 操作, 這部分簡(jiǎn)單來(lái)講 zookeeper 將他們劃分為傳輸層和業(yè)務(wù)層。通過(guò) SendWorker、RecvWorker 處理網(wǎng)絡(luò)層數(shù)據(jù)包, WorkerSender 和 WorkerReceiver 處理業(yè)務(wù)層的數(shù)據(jù)。


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

Leader 選舉源碼流程

結(jié)合上面的梳理,我對(duì) zookeeper 啟動(dòng)和選舉的流程做了一個(gè)比較詳細(xì)的梳理。大家可以結(jié)合 zookeeper 源碼來(lái)理解。

參考文檔

  1. apache zookeeper 官網(wǎng)
  2. Zookeeper的領(lǐng)導(dǎo)者選舉機(jī)制解析
  3. 理解Zookeeper的Leader選舉過(guò)程

 

責(zé)任編輯:姜華 來(lái)源: 運(yùn)維開(kāi)發(fā)故事
相關(guān)推薦

2021-12-02 08:19:06

MVCC面試數(shù)據(jù)庫(kù)

2013-12-25 09:33:07

生成樹(shù)STP選舉

2022-04-10 18:10:24

CURD鏈表

2021-12-06 08:30:49

SpringSpring Bean面試題

2020-04-16 08:22:11

HTTPS加解密協(xié)議

2021-05-20 08:54:16

Go面向對(duì)象

2010-08-23 15:06:52

發(fā)問(wèn)

2022-05-24 08:03:28

InnoDBMySQL數(shù)據(jù)

2020-12-01 11:50:49

數(shù)據(jù)庫(kù)Redis面試

2022-10-08 00:08:00

apiESFacebook

2021-06-03 08:55:54

分布式事務(wù)ACID

2020-11-12 18:20:28

接口數(shù)據(jù)分布式

2019-04-15 14:40:46

消息隊(duì)列Java編程

2022-10-17 00:04:30

索引SQL訂單

2020-12-03 07:39:50

HashMap底層數(shù)據(jù)

2023-01-03 18:06:42

高并發(fā)架構(gòu)

2021-11-24 10:10:32

axios前端攔截器

2022-04-19 07:31:28

事務(wù)隔離機(jī)制數(shù)據(jù)庫(kù)

2020-08-10 07:58:18

異步編程調(diào)用

2021-05-08 07:53:33

面試線程池系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 精品无码久久久久久国产 | 最新中文字幕第一页视频 | 一区二区三区国产 | 国产精品不卡 | 欧美日韩第一页 | 国产精品永久免费视频 | 一a一片一级一片啪啪 | 亚洲精品www| 久久久久国产精品一区二区 | 欧美高清视频 | 免费的日批视频 | 欧美一区二区在线观看视频 | 在线精品一区二区三区 | 999久久久久久久久6666 | 欧美精品网 | 日韩欧美国产成人一区二区 | 日韩在线中文字幕 | 五月婷婷丁香婷婷 | 国产馆 | 在线黄色影院 | 99久久免费精品国产男女高不卡 | 有码一区| 日韩中文字幕在线观看 | 黄视频免费 | 一区二区三区欧美在线 | 亚洲综合国产 | 久久亚洲一区 | 天堂网色 | 久久精品国产久精国产 | 婷婷色国产偷v国产偷v小说 | 美女天天干天天操 | 久久99网| 欧美黄色小视频 | 欧美人妇做爰xxxⅹ性高电影 | 高清成人免费视频 | 国产精品毛片av一区 | 久久伊人操 | 国产福利91精品一区二区三区 | 337p日本欧洲亚洲大胆 | 91啪影院 | 久久精品久久精品久久精品 |