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