一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 理解zookeeper選舉機(jī)制

理解zookeeper選舉機(jī)制

2020-08-15 17:40min.jiang Java教程

本文主要介紹了zookeeper選舉機(jī)制的相關(guān)知識,具有很好的參考價值,下面跟著小編一起來看下吧

zookeeper集群

配置多個實(shí)例共同構(gòu)成一個集群對外提供服務(wù)以達(dá)到水平擴(kuò)展的目的,每個服務(wù)器上的數(shù)據(jù)是相同的,每一個服務(wù)器均可以對外提供讀和寫的服務(wù),這點(diǎn)和redis是相同的,即對客戶端來講每個服務(wù)器都是平等的。

理解zookeeper選舉機(jī)制

這篇主要分析leader的選擇機(jī)制,zookeeper提供了三種方式:

  • leaderelection
  • authfastleaderelection
  • fastleaderelection

默認(rèn)的算法是fastleaderelection,所以這篇主要分析它的選舉機(jī)制。

選擇機(jī)制中的概念

服務(wù)器id

比如有三臺服務(wù)器,編號分別是1,2,3。

編號越大在選擇算法中的權(quán)重越大。

數(shù)據(jù)id

服務(wù)器中存放的最大數(shù)據(jù)id.

值越大說明數(shù)據(jù)越新,在選舉算法中數(shù)據(jù)越新權(quán)重越大。

邏輯時鐘

或者叫投票的次數(shù),同一輪投票過程中的邏輯時鐘值是相同的。每投完一次票這個數(shù)據(jù)就會增加,然后與接收到的其它服務(wù)器返回的投票信息中的數(shù)值相比,根據(jù)不同的值做出不同的判斷。

選舉狀態(tài)

  • looking,競選狀態(tài)。
  • following,隨從狀態(tài),同步leader狀態(tài),參與投票。
  • observing,觀察狀態(tài),同步leader狀態(tài),不參與投票。
  • leading,領(lǐng)導(dǎo)者狀態(tài)。

選舉消息內(nèi)容

在投票完成后,需要將投票信息發(fā)送給集群中的所有服務(wù)器,它包含如下內(nèi)容。

  • 服務(wù)器id
  • 數(shù)據(jù)id
  • 邏輯時鐘
  • 選舉狀態(tài)

選舉流程圖

因?yàn)槊總€服務(wù)器都是獨(dú)立的,在啟動時均從初始狀態(tài)開始參與選舉,下面是簡易流程圖。

理解zookeeper選舉機(jī)制

選舉狀態(tài)圖

描述leader選擇過程中的狀態(tài)變化,這是假設(shè)全部實(shí)例中均沒有數(shù)據(jù),假設(shè)服務(wù)器啟動順序分別為:a,b,c。

理解zookeeper選舉機(jī)制

源碼分析

quorumpeer

主要看這個類,只有l(wèi)ooking狀態(tài)才會去執(zhí)行選舉算法。每個服務(wù)器在啟動時都會選擇自己做為領(lǐng)導(dǎo),然后將投票信息發(fā)送出去,循環(huán)一直到選舉出領(lǐng)導(dǎo)為止。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public void run() {
  //.......
  try {
   while (running) {
    switch (getpeerstate()) {
    case looking:
     if (boolean.getboolean("readonlymode.enabled")) {
      //...
      try {
       //投票給自己...
       setcurrentvote(makelestrategy().lookforleader());
      } catch (exception e) {
       //...
      } finally {
       //...
      }
     } else {
      try {
       //...
       setcurrentvote(makelestrategy().lookforleader());
      } catch (exception e) {
       //...
      }     
     }
     break;
    case observing:
     //...
     break;
    case following:
     //...
     break;
    case leading:
     //...
     break;
    }
   }
  } finally {
   //...
  }
 }

fastleaderelection

它是zookeeper默認(rèn)提供的選舉算法,核心方法如下:具體的可以與本文上面的流程圖對照。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
public vote lookforleader() throws interruptedexception {
  //...
  try {
   hashmap<long, vote> recvset = new hashmap<long, vote>();
 
   hashmap<long, vote> outofelection = new hashmap<long, vote>();
   int nottimeout = finalizewait;
   synchronized(this){
    //給自己投票
    logicalclock.incrementandget();
    updateproposal(getinitid(), getinitlastloggedzxid(), getpeerepoch());
   }
   //將投票信息發(fā)送給集群中的每個服務(wù)器
   sendnotifications();
   //循環(huán),如果是競選狀態(tài)一直到選舉出結(jié)果
   while ((self.getpeerstate() == serverstate.looking) &&
     (!stop)){
    notification n = recvqueue.poll(nottimeout,
      timeunit.milliseconds);
    //沒有收到投票信息
    if(n == null){
     if(manager.havedelivered()){
      sendnotifications();
     } else {
      manager.connectall();
     }
     //...
    }
    //收到投票信息
    else if (self.getcurrentandnextconfigvoters().contains(n.sid)) {
     switch (n.state) {
     case looking:
      // 判斷投票是否過時,如果過時就清除之前已經(jīng)接收到的信息     
      if (n.electionepoch > logicalclock.get()) {
       logicalclock.set(n.electionepoch);
       recvset.clear();
       //更新投票信息
       if(totalorderpredicate(n.leader, n.zxid, n.peerepoch,
         getinitid(), getinitlastloggedzxid(), getpeerepoch())) {
        updateproposal(n.leader, n.zxid, n.peerepoch);
       } else {
        updateproposal(getinitid(),
          getinitlastloggedzxid(),
          getpeerepoch());
       }
       //發(fā)送投票信息
       sendnotifications();
      } else if (n.electionepoch < logicalclock.get()) {
       //忽略
       break;
      } else if (totalorderpredicate(n.leader, n.zxid, n.peerepoch,
        proposedleader, proposedzxid, proposedepoch)) {
       //更新投票信息
       updateproposal(n.leader, n.zxid, n.peerepoch);
       sendnotifications();
      }    
      recvset.put(n.sid, new vote(n.leader, n.zxid, n.electionepoch, n.peerepoch));
      //判斷是否投票結(jié)束
      if (termpredicate(recvset,
        new vote(proposedleader, proposedzxid,
logicalclock.get(), proposedepoch))) {
       // verify if there is any change in the proposed leader
       while((n = recvqueue.poll(finalizewait,
         timeunit.milliseconds)) != null){
        if(totalorderpredicate(n.leader, n.zxid, n.peerepoch,
          proposedleader, proposedzxid, proposedepoch)){
         recvqueue.put(n);
         break;
        }
       }
       if (n == null) {
        self.setpeerstate((proposedleader == self.getid()) ?
 serverstate.leading: learningstate());
        vote endvote = new vote(proposedleader,
proposedzxid, proposedepoch);
        leaveinstance(endvote);
        return endvote;
       }
      }
      break;
     case observing:
      //忽略
      break;
     case following:
     case leading:
      //如果是同一輪投票
      if(n.electionepoch == logicalclock.get()){
       recvset.put(n.sid, new vote(n.leader, n.zxid, n.electionepoch, n.peerepoch));
       //判斷是否投票結(jié)束
       if(termpredicate(recvset, new vote(n.leader,
           n.zxid, n.electionepoch, n.peerepoch, n.state))
           && checkleader(outofelection, n.leader, n.electionepoch)) {
        self.setpeerstate((n.leader == self.getid()) ?
serverstate.leading: learningstate());
        vote endvote = new vote(n.leader, n.zxid, n.peerepoch);
        leaveinstance(endvote);
        return endvote;
       }
      }
      //記錄投票已經(jīng)完成
      outofelection.put(n.sid, new vote(n.leader,
        ignorevalue, ignorevalue, n.peerepoch, n.state));
      if (termpredicate(outofelection, new vote(n.leader,
        ignorevalue, ignorevalue, n.peerepoch, n.state))
        && checkleader(outofelection, n.leader, ignorevalue)) {
       synchronized(this){
        logicalclock.set(n.electionepoch);
        self.setpeerstate((n.leader == self.getid()) ?
serverstate.leading: learningstate());
       }
       vote endvote = new vote(n.leader, n.zxid, n.peerepoch);
       leaveinstance(endvote);
       return endvote;
      }
      break;
     default:
      //忽略
      break;
     }
    } else {
     log.warn("ignoring notification from non-cluster member " + n.sid);
    }
   }
   return null;
  } finally {
   //...
  }
 }

判斷是否已經(jīng)勝出

默認(rèn)是采用投票數(shù)大于半數(shù)則勝出的邏輯。

選舉流程簡述

目前有5臺服務(wù)器,每臺服務(wù)器均沒有數(shù)據(jù),它們的編號分別是1,2,3,4,5,按編號依次啟動,它們的選擇舉過程如下:

  • 服務(wù)器1啟動,給自己投票,然后發(fā)投票信息,由于其它機(jī)器還沒有啟動所以它收不到反饋信息,服務(wù)器1的狀態(tài)一直屬于looking。
  • 服務(wù)器2啟動,給自己投票,同時與之前啟動的服務(wù)器1交換結(jié)果,由于服務(wù)器2的編號大所以服務(wù)器2勝出,但此時投票數(shù)沒有大于半數(shù),所以兩個服務(wù)器的狀態(tài)依然是looking。
  • 服務(wù)器3啟動,給自己投票,同時與之前啟動的服務(wù)器1,2交換信息,由于服務(wù)器3的編號最大所以服務(wù)器3勝出,此時投票數(shù)正好大于半數(shù),所以服務(wù)器3成為領(lǐng)導(dǎo)者,服務(wù)器1,2成為小弟。
  • 服務(wù)器4啟動,給自己投票,同時與之前啟動的服務(wù)器1,2,3交換信息,盡管服務(wù)器4的編號大,但之前服務(wù)器3已經(jīng)勝出,所以服務(wù)器4只能成為小弟。
  • 服務(wù)器5啟動,后面的邏輯同服務(wù)器4成為小弟。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持服務(wù)器之家!

原文鏈接:http://www.cnblogs.com/ASPNET2008/p/6421571.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女视频在线观看视频 | 国产精品区一区二区免费 | 欧美午夜视频一区二区三区 | 亚洲天堂中文字幕 | 九九精品视频在线免费观看 | 三级伦理影院 | 日本五级床片全都免费播放 | japan日韩xxxx69hd| 粉嫩极品国产在线观看免费 | 99爱在线观看精品视频 | 狠狠撸在线播放 | 成人男女网免费 | 侮辱丰满美丽的人妻 | 精品国产在天天线在线麻豆 | 国内体内she精视频免费 | 亚洲va欧美va国产综合久久 | 国产精品suv | 俺去俺来也www色官网免费的 | 国产精品久久亚洲一区二区 | 亚洲一级特黄特黄的大片 | 欧美一级二级片 | 亚洲第一免费播放区 | 亚洲麻豆精品 | 加勒比一本大道香蕉在线视频 | 亚洲骚图 | 亚洲国产精品牛在线 | 女同久久另类99精品国产 | 国产成人刺激视频在线观看 | 精品牛牛影视久久精品 | 精品国产免费第一区二区 | 亚洲欧美专区精品伊人久久 | 99国产精品| 日韩一区在线播放 | 蜜月aⅴ免费一区二区三区 蜜桃影像传媒推广 | 99精品偷自拍 | 91香蕉国产在线观看人员 | 国产精品日韩在线观看 | 微拍秒拍99福利精品小视频 | 四虎新网站| 北岛玲在线视频 | 色五月天天 |