Zab系列1 核心概念

Zab系列博客

Raft Vs Zab
http://www.itdecent.cn/p/24307e7ca9da
Zab系列1 核心概念
http://www.itdecent.cn/p/76e5dba31ea4
Zab系列2 角色和存儲(chǔ)
http://www.itdecent.cn/p/d80f9250ffd1
Zab系列3 選舉
http://www.itdecent.cn/p/0d2390c242f6
Zab系列4 zookeeper特性
http://www.itdecent.cn/p/08b62ca1fe4e
Zab系列5 選舉恢復(fù)(源碼分析)
http://www.itdecent.cn/p/b6acd99921b7
Zab系列6 zk單機(jī)版工作原理
http://www.itdecent.cn/p/ed45982b18b4
Zab系列7 集群工作原理Leader篇
http://www.itdecent.cn/p/59240c36ba1b
Zab系列8 集群工作原理Follower篇
http://www.itdecent.cn/p/8d7c7f1b2838

名詞解釋

  • electionEpoch:每執(zhí)行一次leader選舉,electionEpoch就會(huì)自增,用來標(biāo)記leader選舉的輪次。(相當(dāng)于Raft系統(tǒng)中的term)

  • peerEpoch:每次leader選舉完成之后,會(huì)把leader最終的electionEpoch賦值到peerEpoch。其實(shí)和electionEpoch是2個(gè)不同的值,比如在選舉期間,該Node的peerEpoch不會(huì)變,而且lastCommitZxid里面的高32位也不會(huì)變,但是electionEpoch會(huì)自增1

  • zxid:事務(wù)請(qǐng)求的唯一標(biāo)記,由leader服務(wù)器負(fù)責(zé)進(jìn)行分配。由2部分構(gòu)成,高32位是上述的peerEpoch,低32位是請(qǐng)求的計(jì)數(shù),每次都從0開始。所以由zxid我們就可以知道該請(qǐng)求是哪個(gè)輪次的,并且是該輪次的第幾個(gè)請(qǐng)求。
    (zxid和Raft系統(tǒng)中的 logTerm、logIndex,不完全一樣,zxid的peerEpoch和term是一個(gè)概念,但是低32位不是logIndex,低32位是從0開始遞增的一個(gè)計(jì)數(shù)器。)

  • lastProcessedZxid:最后一次commit的事務(wù)請(qǐng)求的zxid
    (選舉的時(shí)候,誰的zxid大,誰就更有機(jī)會(huì)成為leader)
    (同步數(shù)據(jù)的時(shí)候,leader給follower同步數(shù)據(jù)的時(shí)候,可以根據(jù)zxid來確定要補(bǔ)上哪些數(shù)據(jù))

  • committedLog:LinkedList<Proposal>,ZooKeeper會(huì)保存最近一段時(shí)間內(nèi)執(zhí)行的事務(wù)請(qǐng)求議案,個(gè)數(shù)限制默認(rèn)為500個(gè)議案。上述committedLog就是用來保存議案的列表,上述maxCommittedLog表示最大議案的zxid,minCommittedLog表示committedLog中最小議案的zxid。

  • outstandingProposals(待confirm):ConcurrentMap<Long, Proposal>Leader擁有的屬性,每當(dāng)提出一個(gè)議案,都會(huì)將該議案存放至outstandingProposals,一旦議案被過半認(rèn)同了,就要提交該議案,則從outstandingProposals中刪除該議案

  • toBeApplied(待apply):ConcurrentLinkedQueue<Proposal> ,Leader擁有的屬性,每當(dāng)準(zhǔn)備提交一個(gè)議案,就會(huì)將該議案存放至該列表中,一旦議案應(yīng)用到ZooKeeper的內(nèi)存樹中了,然后就可以將該議案從toBeApplied中刪除

Notification

數(shù)據(jù)結(jié)構(gòu)

  • sid 表示這個(gè)消息是誰發(fā)過來了,也就是投票人
  • leader 表示投票獲得者的 sid(myid)
  • state:following(表示sid投票給leader,但是sid仍然沒有產(chǎn)生leader)、leading(表示 sid 認(rèn)為 leader機(jī)器 滿足了leading條件)
    int version;
    //Proposed leader
    long leader;
    long zxid;
    long electionEpoch;
    //current state of sender
    QuorumPeer.ServerState state;
    //Address of sender
    long sid;
    QuorumVerifier qv;
    long peerEpoch;
  • 可能是某個(gè)Node更新了自己的投票結(jié)果,廣播給別人的Notification
  • 可能是某個(gè)Node廣播自己已經(jīng)找到了新leader,那么state=leading
  • 最后都會(huì)被更新進(jìn)recvset里面:
recvset.put(n.sid, new Vote(n.leader, n.zxid, n.electionEpoch, n.peerEpoch));

recvset

HashMap<Long, Vote> 用于收集LOOKING、FOLLOWING、LEADING狀態(tài)下的server的投票
注意了,不僅僅是Looking狀態(tài)下的投票,還有FOLLOWING、LEADING狀態(tài)下的server的投票

Map<Long, Vote> recvset = new HashMap<Long, Vote>();
recvset.put(n.sid, new Vote(n.leader, n.zxid, n.electionEpoch, n.peerEpoch));
  • key代表是 Notification.Sender.sid,標(biāo)志著這個(gè)消息是哪個(gè)節(jié)點(diǎn)的最新投票數(shù)據(jù)

  • recvset 歸檔set,key是vote發(fā)起方的ID,value是該發(fā)起方的最新的Vote值,因?yàn)樗蠳ode的Vote值都是越來越新,節(jié)點(diǎn)只會(huì)投票給比自己當(dāng)下最新的數(shù)據(jù)還新的節(jié)點(diǎn)投贊成票

  • recvset用于記錄當(dāng)前服務(wù)器在本輪次的Leader選舉中收到的所有外部投票(按照服務(wù)隊(duì)的SID區(qū)別,如{(1, vote1), (2, vote2)...})

  • recvset 當(dāng)收到投票廣播消息時(shí),如果自己的任期小于約票的任期,就會(huì)清空recvset,因?yàn)槔系膔ecvset已經(jīng)過期了,現(xiàn)在要PK新任期的選舉投票了

outofelection

HashMap<Long, Vote>,用于收集FOLLOWING、LEADING狀態(tài)下的server的投票(能夠收集到這種狀態(tài)下的投票,說明leader選舉已經(jīng)完成)
比如A節(jié)點(diǎn)統(tǒng)計(jì)投票,發(fā)現(xiàn)B節(jié)點(diǎn)在A節(jié)點(diǎn)上的投票滿足半數(shù),那么A進(jìn)入follower狀態(tài),廣播一個(gè)消息 sid=A,state=leading,leader=leaderID
比如A節(jié)點(diǎn)統(tǒng)計(jì)投票,發(fā)現(xiàn)A節(jié)點(diǎn)在A節(jié)點(diǎn)上的投票滿足半數(shù),那么A進(jìn)入leading狀態(tài),廣播一個(gè)消息 sid=A,state=leading,leader=sid
因?yàn)楣?jié)點(diǎn)的投票結(jié)束消息,理論上不會(huì)重復(fù)投票,一個(gè)節(jié)點(diǎn)確認(rèn)了leader之后,就會(huì)進(jìn)入following狀態(tài)。采用hashmap的數(shù)據(jù)結(jié)構(gòu)為了實(shí)現(xiàn)快速的,根據(jù)sid找到投票獲得者信息的方式,而不叫outofelectionSet,因?yàn)椴恍枰^濾。

參考

ZooKeeper的一致性算法賞析
https://my.oschina.net/pingpangkuangmo/blog/778927?spm=a2c4e.11153940.blogcont62901.11.12c62ee5vwzG6o

輔助
http://www.itdecent.cn/p/357ca7c3b2af

zookeeper官網(wǎng)說明
https://zookeeper.apache.org/doc/r3.5.4-beta/zookeeperOver.html

zookeeper官網(wǎng)說明中文翻譯版
https://blog.csdn.net/lisuo1234/article/details/55826380

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文將從系統(tǒng)模型、序列化與協(xié)議、客戶端工作原理、會(huì)話、服務(wù)端工作原理以及數(shù)據(jù)存儲(chǔ)等方面來揭示ZooKeeper的技...
    端木軒閱讀 3,908評(píng)論 0 42
  • 一、前言 前面學(xué)習(xí)了Zookeeper服務(wù)端的相關(guān)細(xì)節(jié),其中對(duì)于集群?jiǎn)?dòng)而言,很重要的一部分就是Leader選舉,...
    阿斯蒂芬2閱讀 17,728評(píng)論 4 19
  • 【轉(zhuǎn)自】http://www.cnblogs.com/leesf456/p/6107600.html 一、前言 前...
    lxqfirst閱讀 895評(píng)論 0 0
  • 一、zookeeper 初始化: 在Zookeeper啟動(dòng)期間,首先會(huì)進(jìn)行數(shù)據(jù)初始化工作,用于將存儲(chǔ)在磁盤上的數(shù)據(jù)...
    se7en5閱讀 824評(píng)論 0 0
  • Zookeeper--Zookeeper是什么博客借鑒http://www.cnblogs.com/yuyijq/...
    Albert陳凱閱讀 6,178評(píng)論 1 36

友情鏈接更多精彩內(nèi)容