ZooKeeper 基本概念:特点、数据模型、节点特性、Watcher、ACL
文章目錄
- 什么是ZooKeeper?
- 特點(diǎn)
- 設(shè)計(jì)目標(biāo)
- 應(yīng)用場景
- 系統(tǒng)模型
- 數(shù)據(jù)模型
- 節(jié)點(diǎn)特性
- 節(jié)點(diǎn)類型
- 節(jié)點(diǎn)狀態(tài)
- 版本
- Watcher
- ACL
- 權(quán)限模式:Scheme
- 權(quán)限對象:ID
- 權(quán)限:Permission
- Session
什么是ZooKeeper?
ZooKeeper是一個開源的分布式協(xié)調(diào)服務(wù),由知名互聯(lián)網(wǎng)公司雅虎創(chuàng)建,是Google Chubby的開源實(shí)現(xiàn)。它的設(shè)計(jì)目標(biāo)是將那些復(fù)雜且容易出錯的分布式一致性服務(wù)封裝起來,構(gòu)成一個高效可靠的原語集,并以一系列簡單易用的接口提供給用戶使用。
原語: 操作系統(tǒng)或計(jì)算機(jī)網(wǎng)絡(luò)用語范疇。是由若干條指令組成的,用于完成一定功能的一個過程。具有不可分割性·即原語的執(zhí)行必須是連續(xù)的,在執(zhí)行過程中不允許被中斷。
特點(diǎn)
ZooKeeper可以保證如下分布式一致性特性:
- 順序一致性:從同一客戶端發(fā)起的事務(wù)請求,最終將會嚴(yán)格地按照順序被應(yīng)用到 ZooKeeper 中去。
- 原子性:所有事務(wù)請求的處理結(jié)果在整個集群中所有機(jī)器上的應(yīng)用情況是一致的,也就是說,要么整個集群中所有的機(jī)器都成功應(yīng)用了某一個事務(wù),要么都沒有應(yīng)用。
- 單一視圖:無論客戶端連到哪一個 ZooKeeper 服務(wù)器上,其看到的服務(wù)端數(shù)據(jù)模型都是一致的。
- 可靠性:一旦一次更改請求被應(yīng)用,更改的結(jié)果就會被持久化,直到被下一次更改覆蓋。
- 實(shí)時性:ZooKeeper保證在一定時間段內(nèi),客戶端最終一定能夠從服務(wù)端上讀取到最新的數(shù)據(jù)狀態(tài)。
設(shè)計(jì)目標(biāo)
ZooKeeper致力于實(shí)現(xiàn)一個高性能、高可用,具有嚴(yán)格順序訪問控制能力(主要是寫操作的嚴(yán)格順序性)的分布式協(xié)調(diào)服務(wù)。高性能使得ZooKeeper能夠應(yīng)用于那些對系統(tǒng)吞吐有明確要求的大型分布式系統(tǒng),高可用使得分布式的單點(diǎn)問題得到了很好的解決,而嚴(yán)格的順序訪問控制使得客戶端能夠基于ZooKeeper實(shí)現(xiàn)一些復(fù)雜的同步原語。
針對以上需求,ZooKeeper的四個設(shè)計(jì)目標(biāo)如下:
應(yīng)用場景
ZooKeeper是一個典型的分布式數(shù)據(jù)一致性的解決方案,通常用于以下這些場景:
- 數(shù)據(jù)發(fā)布/訂閱
- 負(fù)載均衡
- 命名服務(wù)
- 分布式協(xié)調(diào)/通知
- 集群管理
- Master選舉
- 分布式鎖
- 分布式隊(duì)列
系統(tǒng)模型
數(shù)據(jù)模型
ZooKeeper數(shù)據(jù)存儲的結(jié)構(gòu)與標(biāo)準(zhǔn)的Unix文件系統(tǒng)非常類似,但是并沒有引入傳統(tǒng)文件系統(tǒng)中目錄和文件等概念,而是使用了其特有的數(shù)據(jù)節(jié)點(diǎn)的概念,我們稱之為ZNode。Znode是zookeeper中的最小數(shù)據(jù)單元,每個Znode上都可以保存數(shù)據(jù),同時還可以掛載子節(jié)點(diǎn),形成一個樹形化命名空間。
如上下圖,Znode的節(jié)點(diǎn)路徑標(biāo)識方式和Unix文件系統(tǒng)路徑非常相似,都是由一系列使用斜杠(/)進(jìn)行分割的路徑表示,最上層的根結(jié)點(diǎn)以/代表,并且每個Znode都有一個唯一的路徑標(biāo)識。
ZooKeeper數(shù)據(jù)模型??注意:ZooKeeper 主要是用來協(xié)調(diào)服務(wù)的,而不是用來存儲業(yè)務(wù)數(shù)據(jù)的,所以不要放比較大的數(shù)據(jù)在 znode 上,ZooKeeper 給出的上限是每個結(jié)點(diǎn)的數(shù)據(jù)大小最大是 1M。
節(jié)點(diǎn)特性
節(jié)點(diǎn)類型
在ZooKeeper中,Znode節(jié)點(diǎn)類型分為持久節(jié)點(diǎn)(PERSISTENT)、臨時節(jié)點(diǎn)(EPHEMERAL)、**順序節(jié)點(diǎn)(SEQUENTIAL)**三大類,通過組合使用,可以生成以下四種組合型節(jié)點(diǎn)類型:
- 持久節(jié)點(diǎn):該數(shù)據(jù)節(jié)點(diǎn)被創(chuàng)建后,就會一直存在于ZooKeeper的服務(wù)器上,直到有刪除操作來主動清除這個節(jié)點(diǎn)。
- 持久順序節(jié)點(diǎn):基本特性與持久節(jié)點(diǎn)一致,額外的特性是順序性,即一個父節(jié)點(diǎn)可以為其子節(jié)點(diǎn)維護(hù)一個創(chuàng)建的先后順序 ,這個順序體現(xiàn)在節(jié)點(diǎn)名稱上,是節(jié)點(diǎn)名稱后自動添加一個由 10 位數(shù)字組成的數(shù)字串,從 0 開始計(jì)數(shù),上限是整型最大值。
- 臨時節(jié)點(diǎn):臨時節(jié)點(diǎn)的生命周期與客戶端的會話綁定在一起,如果客戶端會話失效,則這個節(jié)點(diǎn)就會自動被清理掉。同時,臨時節(jié)點(diǎn)不能創(chuàng)建子節(jié)點(diǎn),它只能作為葉子節(jié)點(diǎn)使用。
- 臨時順序節(jié)點(diǎn):基本特性與臨時節(jié)點(diǎn)一致,額外的特性是順序性。
節(jié)點(diǎn)狀態(tài)
每個數(shù)據(jù)節(jié)點(diǎn)除了存儲數(shù)據(jù)內(nèi)容之外,還存儲了數(shù)據(jù)節(jié)點(diǎn)本身的一些狀態(tài)信息(如子節(jié)點(diǎn)數(shù)量、事務(wù)id、版本信息等),這些狀態(tài)信息由Stat這個類來維護(hù)。
- czxid:Created ZXID,該數(shù)據(jù)節(jié)點(diǎn)被創(chuàng)建時的事務(wù)ID。
- mzxid:Modified ZXID,節(jié)點(diǎn)最后一次被更新時的事務(wù)ID。
- ctime:Created Time,該節(jié)點(diǎn)被創(chuàng)建的時間。
- mtime: Modified Time,該節(jié)點(diǎn)最后一次被修改的時間。
- version:節(jié)點(diǎn)的版本號。
- cversion:子節(jié)點(diǎn)的版本號。
- aversion:節(jié)點(diǎn)的 ACL 版本號。
- ephemeralOwner:創(chuàng)建該節(jié)點(diǎn)的會話的sessionID ,如果該節(jié)點(diǎn)為持久節(jié)點(diǎn),該值為0。
- dataLength:節(jié)點(diǎn)數(shù)據(jù)內(nèi)容的長度。
- numChildre:該節(jié)點(diǎn)的子節(jié)點(diǎn)個數(shù),如果為臨時節(jié)點(diǎn)為0。
- pzxid:該節(jié)點(diǎn)子節(jié)點(diǎn)列表最后一次被修改時的事務(wù)ID,注意是子節(jié)點(diǎn)的列表 ,不是內(nèi)容。
版本
ZooKeeper中為節(jié)點(diǎn)引入了版本的概念,每個數(shù)據(jù)節(jié)點(diǎn)都具有三種類型的版本信息,對數(shù)據(jù)節(jié)點(diǎn)的任何更新操作都會引起版本號的變化。
- dataVersion:當(dāng)前Znode節(jié)點(diǎn)數(shù)據(jù)內(nèi)容版本號
- cversion:當(dāng)前Znode節(jié)點(diǎn)的子節(jié)點(diǎn)版本號。
- aclVersion:當(dāng)前Znode的ACL變更版本號。
為了解決那些數(shù)據(jù)更新競爭激烈的場景,ZooKeeper借助版本號機(jī)制來實(shí)現(xiàn)樂觀并發(fā)控制。
Watcher
Watcher(事件監(jiān)聽器),是ZooKeeper中的一個很重要的特性。ZooKeeper允許客戶端在指定節(jié)點(diǎn)上注冊一些 Watcher,并且在一些特定事件觸發(fā)的時候,ZooKeeper服務(wù)端會將事件通知到感興趣的客戶端上去,該機(jī)制是 ZooKeeper 實(shí)現(xiàn)分布式協(xié)調(diào)服務(wù)的重要特性。
Watcher從注冊到通知全流程從上圖中我們可以看到,ZooKeeper的Watcher機(jī)制主要包括客戶端線程、客戶端WatchManager、ZooKeeper服務(wù)器三個部分。工作流程如下:
ACL
ZooKeeper提供了一套完善的ACL(Access Control Lists)權(quán)限控制機(jī)制來保障數(shù)據(jù)的安全,類似于Unix/Linux中的UGO權(quán)限控制機(jī)制。
ACL機(jī)制由以下三部分組成,我們通常使用scheme:id:permission來標(biāo)識一個有效的ACL信息。
- 權(quán)限模式(Scheme)
- 授權(quán)對象(ID)
- 權(quán)限(Permission)
權(quán)限模式:Scheme
權(quán)限模式是用來確定權(quán)限驗(yàn)證過程中使用的校驗(yàn)策略。在ZooKeeper中最常用的就是以下四種權(quán)限模式
- IP:IP模式通過IP地址粒度來進(jìn)行權(quán)限控制。
- Digest:Digest是最常用的權(quán)限控制模式,其以類似于username:password形式的權(quán)限標(biāo)識來進(jìn)行權(quán)限配置,便于區(qū)分不同應(yīng)用來進(jìn)行權(quán)限控制。當(dāng)我們配置了權(quán)限標(biāo)識后,為了保證安全,ZooKeeper會分別使用SHA-1算法和BASE64編碼進(jìn)行處理,將其混淆為無法辨識的字符串。
- World:World是最開放的權(quán)限控制模式,是一種特殊的Digest模式。在該模式下數(shù)據(jù)節(jié)點(diǎn)的訪問權(quán)限對所有用戶開放,即所有用戶都可以在不進(jìn)行任何數(shù)據(jù)校驗(yàn)的情況下操作ZooKeeper上的數(shù)據(jù)。權(quán)限標(biāo)識為world:anyone
- Super:Super模式即超級用戶模式,是一種特殊的Digest模式。在該模式下超級用戶可以對任意ZooKeeper上的數(shù)據(jù)節(jié)點(diǎn)進(jìn)行任何操作。
權(quán)限對象:ID
授權(quán)對象指的是權(quán)限賦予的用戶或一個指定實(shí)體,例如IP地址或是機(jī)器等。在不同的權(quán)限關(guān)系下,授權(quán)對象是不同的,對應(yīng)關(guān)系如下圖:
- IP:通常是一個IP地址或者一個IP網(wǎng)段,如192.168.0.110或192.168.0.1/24
- Digest:Digest是最常用的權(quán)限控制模式,其以類似于username:password形式的權(quán)限標(biāo)識來進(jìn)行權(quán)限配置,便于區(qū)分不同應(yīng)用來進(jìn)行權(quán)限控制。當(dāng)我們配置了權(quán)限標(biāo)識后,為了保證安全,ZooKeeper會分別使用SHA-1算法和BASE64編碼進(jìn)行處理,將其混淆為無法辨識的字符串。
- World:只有一個ID:anyone
- Super:與Digest模式一致。
權(quán)限:Permission
權(quán)限就是指那些通過權(quán)限檢查后可以被允許執(zhí)行的操作。在ZooKeeper中,所有對數(shù)據(jù)的操作權(quán)限分為以下五大類:
- CREATE:數(shù)據(jù)節(jié)點(diǎn)的創(chuàng)建權(quán)限,允許授權(quán)對象在該數(shù)據(jù)節(jié)點(diǎn)下創(chuàng)建子節(jié)點(diǎn)。
- DELETE:數(shù)據(jù)節(jié)點(diǎn)的刪除權(quán)限,允許授權(quán)對象刪除該數(shù)據(jù)節(jié)點(diǎn)的子節(jié)點(diǎn)。
- READ:數(shù)據(jù)節(jié)點(diǎn)的讀取權(quán)限,允許授權(quán)對象訪問該數(shù)據(jù)節(jié)點(diǎn)并讀取其數(shù)據(jù)內(nèi)容或子節(jié)點(diǎn)列表等。
- WRITE:數(shù)據(jù)節(jié)點(diǎn)的更新權(quán)限,允許授權(quán)對象對該數(shù)據(jù)節(jié)點(diǎn)進(jìn)行更新操作。
- ADMIN:數(shù)據(jù)節(jié)點(diǎn)的管理權(quán)限,允許授權(quán)對象在該數(shù)據(jù)節(jié)點(diǎn)進(jìn)行ACL相關(guān)的設(shè)置操作。
Session
Session(會話) 可以看作是ZooKeeper服務(wù)器與客戶端的之間的一個TCP長連接,通過這個連接,客戶端能夠通過心跳檢測與服務(wù)器保持有效的會話,也能夠向ZooKeeper服務(wù)器發(fā)送請求并接受響應(yīng),同時還能夠通過該連接接收來自服務(wù)器的Watcher事件通知。
Session有一個屬性叫做:sessionTimeout ,sessionTimeout 代表會話的超時時間。當(dāng)由于服務(wù)器壓力太大、網(wǎng)絡(luò)故障或是客戶端主動斷開連接等各種原因?qū)е驴蛻舳诉B接斷開時,只要在sessionTimeout規(guī)定的時間內(nèi)能夠重新連接上集群中任意一臺服務(wù)器,那么之前創(chuàng)建的會話仍然有效。
另外在每次客戶端向服務(wù)端發(fā)起會話創(chuàng)建請求時,服務(wù)端都會為其分配一個SessionID,SessionID用來唯一標(biāo)識一個會話,因此ZooKeeper必須保證SessionID的全局唯一性。
總結(jié)
以上是生活随笔為你收集整理的ZooKeeper 基本概念:特点、数据模型、节点特性、Watcher、ACL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高可用系统设计 | 分布式限流策略:计数
- 下一篇: ZooKeeper 集群:集群概念、选举