ZooKeeper 這么牛逼,基本原理你懂嗎?

Java技術(shù)棧
www.javastack.cn
關(guān)注閱讀更多優(yōu)質(zhì)文章
ZooKeeper 簡介
ZooKeeper是一個開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),它包含一個簡單的原語集,分布式應(yīng)用程序可以基于它實現(xiàn)同步服務(wù),配置維護(hù)和命名服務(wù)等。

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

Persistent 節(jié)點,一旦被創(chuàng)建,便不會意外丟失,即使服務(wù)器全部重啟也依然存在。每個 Persist 節(jié)點即可包含數(shù)據(jù),也可包含子節(jié)點。
Ephemeral 節(jié)點,在創(chuàng)建它的客戶端與服務(wù)器間的 Session 結(jié)束時自動被刪除。服務(wù)器重啟會導(dǎo)致 Session 結(jié)束,因此 Ephemeral 類型的 znode 此時也會自動刪除。
Non-sequence 節(jié)點,多個客戶端同時創(chuàng)建同一 Non-sequence 節(jié)點時,只有一個可創(chuàng)建成功,其它勻失敗。并且創(chuàng)建出的節(jié)點名稱與創(chuàng)建時指定的節(jié)點名完全一樣。
Sequence 節(jié)點,創(chuàng)建出的節(jié)點名在指定的名稱之后帶有10位10進(jìn)制數(shù)的序號。多個客戶端創(chuàng)建同一名稱的節(jié)點時,都能創(chuàng)建成功,只是序號不同。
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的心跳,接收follower請求并判斷follower的請求消息類型;
follower的消息類型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根據(jù)不同的消息類型,進(jìn)行不同的處理。
PING消息是指follower的心跳信息;REQUEST消息是follower發(fā)送的提議信息,包括寫請求及同步請求;
ACK消息是follower的對提議的回復(fù),超過半數(shù)的follower通過,則commit該提議;
REVALIDATE消息是用來延長SESSION有效時間。
Follower工作流程
向Leader發(fā)送請求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
接收Leader消息并進(jìn)行處理;
接收Client的請求,如果為寫請求,發(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é)果到客戶端,這個消息最初由客戶端發(fā)起,用來強制得到最新的更新。
Zab: Broadcasting State Updates
Leader給所有的follower發(fā)送一個PROPOSAL消息。 一個follower接收到這次PROPOSAL消息,寫到磁盤,發(fā)送給leader一個ACK消息,告知已經(jīng)收到。 當(dāng)Leader收到法定人數(shù)(quorum)的follower的ACK時候,發(fā)送commit消息執(zhí)行。
如果leader以T1和T2的順序廣播,那么所有的Server必須先執(zhí)行T1,再執(zhí)行T2。 如果任意一個Server以T1、T2的順序commit執(zhí)行,其他所有的Server也必須以T1、T2的順序執(zhí)行。
在新的leader廣播Transaction之前,先前Leader commit的Transaction都會先執(zhí)行。 在任意時刻,都不會有2個Server同時有法定人數(shù)(quorum)的支持者。
這里的quorum是一半以上的Server數(shù)目,確切的說是有投票權(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





關(guān)注Java技術(shù)??锤喔韶?/strong>


