前面介紹了ZooKeeper的一些基本特性吆倦,ZooKeeper入門,也安裝運行了一個簡單的ZooKeeper的例子眉枕。這此主要介紹ZooKeeper內(nèi)部的一些工作方式理論部分。
主要涉及以下:
- ZooKeeper服務(wù)的架構(gòu)
- ZooKeeper的數(shù)據(jù)模型
- ZooKeeper的節(jié)點特性
- ZooKeeper的訪問控制
- Watcher(監(jiān)聽器)
ZooKeeper服務(wù)概覽
ZooKeeper是一個復(fù)制式的分布式應(yīng)用近上,有點像DNS服務(wù)或一些中心化的服務(wù)丽猬。
這是官網(wǎng)給的ZooKeeper服務(wù)圖,所有組成ZooKeeper服務(wù)的服務(wù)器都相互知曉胀瞪,它們維護了一個內(nèi)存狀態(tài)的鏡像针余,也包含事務(wù)日志,持久存儲的快照等凄诞。只要半數(shù)以上的的服務(wù)器是可用的圆雁,ZooKeeper服務(wù)就是可用的。
順便提一下ZooKeeper的設(shè)計目標(biāo)(Design Goals)
- 簡單
- 復(fù)制式的 所有節(jié)點相互復(fù)制狀態(tài)
- 有序的帆谍,所有的事務(wù)都有時間戳
- 快速 在讀大于寫的時候...
ZooKeeper在讀數(shù)據(jù)的時候可以直接從當(dāng)前節(jié)點讀取數(shù)據(jù)伪朽,在寫數(shù)據(jù)的時候需要將寫請求轉(zhuǎn)發(fā)到Leader節(jié)點上。
ZooKeeper數(shù)據(jù)模型
ZooKeeper的各個服務(wù)器節(jié)點共同維護一個可以注冊數(shù)據(jù)的層級結(jié)構(gòu)汛蝙,類似于Unix的文件系統(tǒng)烈涮。數(shù)據(jù)注冊的位置也稱為znode
。
注意:
- 數(shù)據(jù)節(jié)點一般以字節(jié)形式存儲窖剑,節(jié)點存儲的數(shù)據(jù)大小最大不超過1MB跃脊。協(xié)作的數(shù)據(jù)一般不會太大。最好讓數(shù)據(jù)遠(yuǎn)小于1MB會好些苛吱。
- ZooKeeper無法識別相對路徑酪术。 znode的路徑必須是絕對路徑
- 每個Znode除了存儲數(shù)據(jù)以外,還有維護一些狀態(tài)信息。
Znode 特性
Znode類型
ZooKeeper主要有兩種節(jié)點類型绘雁,也可以說是三種橡疼。持久節(jié)點,臨時節(jié)點庐舟。第三個是順序節(jié)點欣除,順序節(jié)點也可以說是剛才那兩種節(jié)點。 持久節(jié)點和順序節(jié)點都可以是順序節(jié)點挪略。
注意節(jié)點的類型是在創(chuàng)建的時候就設(shè)置好的历帚。
- 持久節(jié)點。ZooKeeper中最常見的一種節(jié)點類型杠娱,創(chuàng)建之后一直存在服務(wù)器上挽牢,知道有刪除操作來主動清楚這個節(jié)點
- 臨時節(jié)點,與客戶端會話綁定在一起摊求。 客戶端會話失效禽拔,節(jié)點自動清理。(網(wǎng)絡(luò)突然壞掉不算會話失效)
- 順序節(jié)點室叉,在節(jié)點創(chuàng)建的時候睹栖,ZooKeeper自動給節(jié)點名分配一個序列號。例如/path/to/znode-0000000001茧痕,一般是10位數(shù)字野来,序號之外的位以0填充。
節(jié)點狀態(tài)
每一個Znode都有對應(yīng)的stat結(jié)構(gòu)踪旷,和文件系統(tǒng)類似梁只。stat狀態(tài)主要包含下面的信息:
- cZxid. 節(jié)點被創(chuàng)建時候的事務(wù)ID
- mZxid 節(jié)點最后一次被修改時候的事務(wù)ID
- pZxid 該節(jié)點的子節(jié)點最后一次被修改時的事務(wù)ID。子節(jié)點刪除或添加才會影響pZxid
- ctime 節(jié)點被創(chuàng)建的時間
- mtime 節(jié)點被修改的世界
- dataVersion 這個節(jié)點數(shù)據(jù)改變的次數(shù)
- cversion 子節(jié)點被改變的次數(shù)
- aclVersion 節(jié)點的ACL(訪問控制列表被改變的次數(shù))
- ephemeralOwner 創(chuàng)建該臨時節(jié)點的 session ID埃脏。如果是持久節(jié)點搪锣,設(shè)置為0
- dataLength 數(shù)據(jù)內(nèi)容長度
- numChildren 當(dāng)前節(jié)點子節(jié)點的個數(shù)
可以使用ls2
和stat
命令查看ZooKeeper節(jié)點下的信息。
ZooKeeper的訪問控制(ACL)
ZooKeeper的數(shù)據(jù)模型提供了ACL來控制znode節(jié)點的訪問彩掐。如果一個客戶端符合ACL控制构舟,那么就可以對其進行訪問,否則將無法操作堵幽。
Zookeeper支持可配置的認(rèn)證機制狗超。它利用一個三元組來定義客戶端的訪問權(quán)限:
(scheme:expression, perms) 。其中:
- Schema 代表權(quán)限控制模式朴下,分別為
- World 任何人
- Auth 不需要ID
- Digest 用戶名和密碼方式的認(rèn)證
- IP Address IP地址方式的認(rèn)證
- perms(權(quán)限)努咐,ZooKeeper支持如下權(quán)限
- CREATE: 創(chuàng)建子節(jié)點
- READ: 獲取子節(jié)點與自身節(jié)點的數(shù)據(jù)信息
- WRITE:在Znode節(jié)點上寫數(shù)據(jù)
- DELETE:刪除子節(jié)點
- ADMIN:設(shè)置ACL權(quán)限
貼上如下圖,在下次使用ZooKeeper的時候更明白殴胧,這次我們主要說明一些ZooKeeper理論方面的知識渗稍,具體編程的實現(xiàn)下次再說佩迟。
權(quán)限模式和授權(quán)對象的關(guān)系:
- IP: 通常是IP地址或是IP端,例如"192.168.1.2"或"192.168.1.1/24"
- Degist: 自定義竿屹,通常是"username:BASE64(SHA-1(username:password))"
- World:只有一個ID报强,“anyone”
- Super: 與Degist模式一致
注意:
- Znode的Acl只是針對某個節(jié)點,不會作用到它的子節(jié)點上
- 任何連接到ZooKeeper的客戶端都可以使用exist操作拱燃,exist是不需要權(quán)限的秉溉。
ZooKeeper的Watcher
ZooKeeper中引入了Watcher機制來實現(xiàn)分布式通知功能,ZooKeeper允許客戶端像服務(wù)端注冊一個Watcher監(jiān)聽碗誉,當(dāng)服務(wù)端的一些指定事件觸發(fā)了這個Watcher召嘶,那么就會向指定客戶端發(fā)送一個事件通知來實現(xiàn)分布式的通知功能。
有如下的Watcher事件類型可能出現(xiàn):
- NodeChildrenChanged: zNode的子節(jié)點創(chuàng)建或刪除的時候
- NodeCreated: 新的Znode節(jié)點被創(chuàng)建的時候
- NodeDataChanged: Znode節(jié)點的數(shù)據(jù)改變了的時候
- NodeDeleted: Znode節(jié)點被刪除的時候哮缺。
關(guān)于Watcher內(nèi)部實現(xiàn)機制弄跌,下次可以通過分析其源碼進行更詳細(xì)的說明
最后
這次主要介紹了一些ZooKeeper內(nèi)部的基本概念,理論部分較多蝴蜓,若無理論的基礎(chǔ)實施接下來的操作也不太方便碟绑。
接下來我會寫下:
- ZooKeeper 客戶端編程
- ZooKeeper Watcher監(jiān)聽器原理分析
參考
- 《從Paxos到ZooKeeper-分布式一致性原理與實踐》
- 《Apache ZooKeeper Essential》
- ZooKeeper Overview