這么牛逼的ZooKeeper,基本原理你懂嗎?
ZooKeeper 簡(jiǎn)介
ZooKeeper是一個(gè)開(kāi)放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),它包含一個(gè)簡(jiǎn)單的原語(yǔ)集,分布式應(yīng)用程序可以基于它實(shí)現(xiàn)同步服務(wù),配置維護(hù)和命名服務(wù)等。

ZooKeeper 設(shè)計(jì)目的
1.?最終一致性:client不論連接到哪個(gè)Server,展示給它都是同一個(gè)視圖,這是zookeeper最重要的性能。
2.?可靠性:具有簡(jiǎn)單、健壯、良好的性能,如果消息m被到一臺(tái)服務(wù)器接受,那么它將被所有的服務(wù)器接受。
ZooKeeper數(shù)據(jù)模型

Persistent 節(jié)點(diǎn),一旦被創(chuàng)建,便不會(huì)意外丟失,即使服務(wù)器全部重啟也依然存在。每個(gè) Persist 節(jié)點(diǎn)即可包含數(shù)據(jù),也可包含子節(jié)點(diǎn)。
Ephemeral 節(jié)點(diǎn),在創(chuàng)建它的客戶端與服務(wù)器間的 Session 結(jié)束時(shí)自動(dòng)被刪除。服務(wù)器重啟會(huì)導(dǎo)致 Session 結(jié)束,因此 Ephemeral 類型的 znode 此時(shí)也會(huì)自動(dòng)刪除。
Non-sequence 節(jié)點(diǎn),多個(gè)客戶端同時(shí)創(chuàng)建同一 Non-sequence 節(jié)點(diǎn)時(shí),只有一個(gè)可創(chuàng)建成功,其它均失敗。并且創(chuàng)建出的節(jié)點(diǎn)名稱與創(chuàng)建時(shí)指定的節(jié)點(diǎn)名完全一樣。
Sequence 節(jié)點(diǎn),創(chuàng)建出的節(jié)點(diǎn)名在指定的名稱之后帶有10位10進(jìn)制數(shù)的序號(hào)。多個(gè)客戶端創(chuàng)建同一名稱的節(jié)點(diǎn)時(shí),都能創(chuàng)建成功,只是序號(hào)不同。
ZooKeeper Session

ZooKeeper Watch
a watch event is one-time trigger, sent to the client that set the watch, whichoccurs when the data for which the watch was set changes。
(一次性觸發(fā))One-time trigger
(發(fā)送至客戶端)Sent to the client
(被設(shè)置 watch 的數(shù)據(jù))The data for which the watch was set
Consistency Guarantees
ZooKeeper的工作原理
角色:leader,follower,observer 狀態(tài):leading,following,observing,looking
Leader Election
Leader工作流程
恢復(fù)數(shù)據(jù);
維持與follower的心跳,接收f(shuō)ollower請(qǐng)求并判斷follower的請(qǐng)求消息類型;
follower的消息類型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根據(jù)不同的消息類型,進(jìn)行不同的處理。
PING消息是指follower的心跳信息;REQUEST消息是follower發(fā)送的提議信息,包括寫(xiě)請(qǐng)求及同步請(qǐng)求;
ACK消息是follower的對(duì)提議的回復(fù),超過(guò)半數(shù)的follower通過(guò),則commit該提議;
REVALIDATE消息是用來(lái)延長(zhǎng)SESSION有效時(shí)間。
Follower工作流程
向Leader發(fā)送請(qǐng)求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
接收Leader消息并進(jìn)行處理;
接收Client的請(qǐng)求,如果為寫(xiě)請(qǐng)求,發(fā)送給Leader進(jìn)行投票;
返回Client結(jié)果。
PING消息:心跳消息 PROPOSAL消息:Leader發(fā)起的提案,要求Follower投票 COMMIT消息:服務(wù)器端最新一次提案的信息 UPTODATE消息:表明同步完成 REVALIDATE消息:根據(jù)Leader的REVALIDATE結(jié)果,關(guān)閉待revalidate的session還是允許其接受消息 SYNC消息:返回SYNC結(jié)果到客戶端,這個(gè)消息最初由客戶端發(fā)起,用來(lái)強(qiáng)制得到最新的更新。
Zab: Broadcasting State Updates
Leader給所有的follower發(fā)送一個(gè)PROPOSAL消息。 一個(gè)follower接收到這次PROPOSAL消息,寫(xiě)到磁盤,發(fā)送給leader一個(gè)ACK消息,告知已經(jīng)收到。 當(dāng)Leader收到法定人數(shù)(quorum)的follower的ACK時(shí)候,發(fā)送commit消息執(zhí)行。
如果leader以T1和T2的順序廣播,那么所有的Server必須先執(zhí)行T1,再執(zhí)行T2。 如果任意一個(gè)Server以T1、T2的順序commit執(zhí)行,其他所有的Server也必須以T1、T2的順序執(zhí)行。
在新的leader廣播Transaction之前,先前Leader commit的Transaction都會(huì)先執(zhí)行。 在任意時(shí)刻,都不會(huì)有2個(gè)Server同時(shí)有法定人數(shù)(quorum)的支持者。
這里的quorum是一半以上的Server數(shù)目,確切的說(shuō)是有投票權(quán)力的Server(不包括Observer)。
總結(jié)
參考
《ZooKeeper—Distributed Process Coordination》 by FlavioJunqueira and Benjamin Reed
http://zookeeper.apache.org/doc/trunk/zookeeperOver.html
http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/index.html
《ZooKeeper的一致性算法賞析》https://my.oschina.net/pingpangkuangmo/blog/778927
我整理了一份很全的學(xué)習(xí)資料,感興趣的可以微信搜索「猿天地」,回復(fù)關(guān)鍵字 「學(xué)習(xí)資料」獲取我整理好了的 Spring Cloud,Spring Cloud Alibaba,Sharding-JDBC 分庫(kù)分表,任務(wù)調(diào)度框架 XXL-JOB,MongoDB,爬蟲(chóng)等相關(guān)資料。
后臺(tái)回復(fù)?學(xué)習(xí)資料?領(lǐng)取學(xué)習(xí)視頻
如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝
