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