1瞧省、Zookeeper定義
Zookeeper是一種分布式協(xié)調(diào)服務。所謂分布式協(xié)調(diào)服務就是在分布式系統(tǒng)中共享配置遵倦、協(xié)調(diào)鎖資源,提供命名服務官撼。
2梧躺、Zookeeper的數(shù)據(jù)結(jié)構(gòu)
Zookeeper的數(shù)據(jù)模型和數(shù)據(jù)結(jié)構(gòu)當中的樹類似,很像文件系統(tǒng)的目錄傲绣。Zookeeper的數(shù)據(jù)存儲也是基于節(jié)點掠哥,這種節(jié)點叫做Znode。Znode的引用方式是路徑引用秃诵,類似于文件路徑:/動物/人
- data:Znode存儲的數(shù)據(jù)信息嗤练。
- ACL:Znode的訪問權(quán)限榛了,即哪些人/IP可以訪問本節(jié)點。
- stat:包含Znode的各種元數(shù)據(jù)煞抬,如事務ID霜大、版本號、時間戳等革答。
- child:當前節(jié)點的子節(jié)點引用战坤,類似于二叉樹的左孩子右孩子。
3残拐、Zookeeper的基本操作和事件通知
常見的API:
create 創(chuàng)建節(jié)點
delete 刪除節(jié)點
exists 判斷節(jié)點是否存在
getData 獲取一個節(jié)點的數(shù)據(jù)
getChildren 獲取節(jié)點下的所有節(jié)點
Zookeeper客戶端在請求讀操作的時候途茫,可以選擇是否設置Watch。Watch理解成是注冊在特定Znode上的觸發(fā)器溪食。當這個Znode發(fā)生改變囊卜,即調(diào)用了create、delete错沃、setData方法時栅组,會觸發(fā)Znode上注冊的對應事件,請求Watch的客戶端會接收到異步通知枢析。
具體交互過程:
1玉掸、客戶端調(diào)用getData方法,watch參數(shù)是true醒叁。服務端接到請求司浪,返回節(jié)點數(shù)據(jù)泊业。并且在對應的哈希表里插入被Watch的Znode路徑,以及Watcher數(shù)組断傲。
2脱吱、當被Watch的Znode已刪除,服務端會查找哈希表认罩,根據(jù)key找到該Znode對應的所有Watcher,異步通知客戶端续捂,并且刪除哈希表中對應的Key-Value垦垂。
4、集群角色
- Leader:負責寫服務
- Follower:直接為客戶端提供服務牙瓢,參與投票劫拗,同時與Leader進行數(shù)據(jù)交換(同步)
- Observer:為客戶端提供服務,但不參與投票矾克,同時與Leader進行數(shù)據(jù)交換(同步)
客戶端的一個事務請求页慷,需要半數(shù)服務器投票通過后才能通知leader commit;leader會發(fā)起一個提案胁附,要求follower投票酒繁。
5、Zookeeper集群
為了防止單機故障控妻,Zookeeper可以維護一個集群州袒。Zookeeper Service集群時一主多從結(jié)構(gòu)。
更新數(shù)據(jù)時弓候,先更新到主節(jié)點(節(jié)點指服務器郎哭,而不是Znode),再同步到從節(jié)點菇存。
讀取數(shù)據(jù)時夸研,直接讀取任意從節(jié)點。
6依鸥、ZAB協(xié)議
為保證主從節(jié)點的數(shù)據(jù)一致性亥至,Zookeeper采用了ZAB協(xié)議,這種協(xié)議非常類似于一致性算法Paxos和Raft毕籽。
ZAB即Zookeeper Atomic Broadcast抬闯,有效解決了Zookeeper集群崩潰恢復以及主從同步數(shù)據(jù)的問題。
Zab協(xié)議既不是強一致性关筒,也不是弱一致性溶握,而是處于兩者之間的單調(diào)一致性。它依靠事務ID和版本號蒸播,保證了數(shù)據(jù)的更新和讀取是有序的睡榆。
ZAB協(xié)議所的三種節(jié)點狀態(tài):
1)Looking:選舉狀態(tài)
2)Following:Follower節(jié)點(從節(jié)點)所處的狀態(tài)
3)Leading:Leader節(jié)點(主節(jié)點)所處狀態(tài)
7萍肆、選舉算法
三種算法:leaderElection/AuthFastLeaderElection/FastLeaderElection
8、ZAB崩潰恢復的三個階段
1)Leader election
3)Discovery
4)Synchronization
9胀屿、Broadcast
Zookeeper常規(guī)情況下更新數(shù)據(jù)的時候塘揣,由Leader廣播到所有Follower。其過程如下:
1)客戶端發(fā)出寫入數(shù)據(jù)請求給任意Follower
2)Follower把寫入數(shù)據(jù)請求轉(zhuǎn)發(fā)給Leader
3)Leader采用二階段提交方式宿崭,先發(fā)送Propose廣播給Follower亲铡。
4)Follower接到Propose消息,寫入日志成功后葡兑,返回ACK消息給Leader
5)Leader接到半數(shù)以上ACK消息奖蔓,返回成功給客戶端,并且廣播Commit請求給Follower讹堤。
10吆鹤、應用場景
- 分布式鎖
利用Zookeeper的臨時有序節(jié)點,可以輕松實現(xiàn)分布式鎖洲守。 - 服務注冊與發(fā)現(xiàn)
利用Znode和Watcher(Watch的客戶端)可以實現(xiàn)分布式服務的注冊與發(fā)現(xiàn)疑务。dubbo框架就是用它來充當注冊中心的。 - 共享配置和狀態(tài)信息
Redis的分布式解決方案Codis梗醇,就利用了Zookeeper來存放數(shù)據(jù)路由表和codis-proxy節(jié)點的元信息知允。同時codis-config發(fā)起的命令都會通過ZooKeeper同步到各個存活的codis-proxy。此外Kafka婴削、HBase廊镜、Hadoop也都依靠Zookeeper同步節(jié)點信息,實現(xiàn)高可用唉俗。
原文鏈接:https://blog.csdn.net/qq_26545305/article/details/87946879