Zookeeper是⼀個開源的分佈式協調服務,其設計⽬標是將那些複雜的且容易出錯的分佈式⼀致性服務封裝起來,構成⼀個⾼效可靠的原語集,並以⼀些簡單的接⼝提供給⽤戶使⽤。node
zookeeper是⼀個典型的分佈式數據⼀致性的解決⽅案,分佈式應⽤程序能夠基於它實現諸如數據訂閱/發佈、負載均衡、命名服務、集羣管理、分佈式鎖和分佈式隊列等功能。安全
Zookeeper
中引入了了 Leader
、 Follower
、 Observer
三種⻆⾊。 Leader
服務器爲客戶端提供讀和寫服務,除 Leader
外,其餘機器包括 Follower
和 Observer
都能提供讀服務。惟⼀的區別在於 Observer
不參與 Leader
選舉過程, 不參與寫操做的過半寫成功策略,所以 Observer
能夠在不影響寫性能的狀況下提高集羣的性能。服務器
指客戶端會話, ⼀個客戶端鏈接是指客戶端和服務端之間的⼀個TCP⻓鏈接session
ZooKeeper將全部數據存儲在內存中,數據模型是⼀棵樹 ( ZNode Tree
),由斜槓( /
)進⾏分割的路徑,就是⼀個 Znode
,例如 /app/path1
。每一個 ZNode
上都 會保存⾃⼰的數據內容,同時還會保存⼀系列屬性信息。數據結構
Zookeeper
會爲每一個 Znode
維護 ⼀個叫做 Stat
的數據結構, Stat
記錄了這個 ZNode
的三個數據版本,分別是 version
(當前 ZNode
的版 本)、 cversion
(當前 ZNode
⼦節點的版本)、 aversion
(當前 ZNode
的 ACL
版本)。app
Wathcer(事件監聽器),是Zookeeper中⼀個很重要的特性,Zookeeper容許⽤戶在指定節點上註冊 ⼀些Watcher,而且在⼀些特定事件觸發的時候,Zookeeper服務端會將事件通知到感興趣的客戶端, 該機制是Zookeeper實現分佈式協調服務的重要特性負載均衡
Zookeeper採⽤ACL(Access Control Lists)策略來進⾏權限控制,其定義了以下五種權限:分佈式
其中須要注意的是,
CREATE
和DELETE
這兩種權限都是針對⼦節點的權限控制性能
Leader服務器是Zookeeper集羣工做的核心,主要工做有如下兩個:編碼
ollower服務器是Zookeeper集羣狀態中的跟隨者,其主要⼯做有如下三個:
處理客戶端⾮事務性請求(讀取數據),轉發事務請求給Leader服務器。
參與事務請求Proposal的投票。
參與Leader選舉投票。
Observer是ZooKeeper⾃3.3.0版本開始引⼊的⼀個全新的服務器⻆⾊。從字⾯意思看,該服務器充當 了⼀個觀察者的⻆⾊——其觀察ZooKeeper集羣的最新狀態變化並將這些狀態變動同步過來。
Observer服務器在⼯做原理上和Follower基本是⼀致的,對於⾮事務請求,均可以進⾏獨⽴的處理,⽽ 對於事務請求,則會轉發給Leader服務器進⾏處理。 和Follower惟⼀的區別在於,Observer不參與任何形式的投票 ,包括事務請求Proposal的投票和Leader選舉投票。簡單地講,Observer服務器只提供 ⾮事務服務,一般⽤於在不影響集羣事務處理能⼒的前提下提高集羣的⾮事務處理能⼒。
Zookeeper
中全部信息都被保存在一個個數據節點上,這些節點被稱爲 Znode
。 Znode
是 Zookeeper
中最小的存儲單元,在 Znode
上又能夠掛 Znode
,這樣一層一層下去就造成了 Znode 樹,稱爲 Znode Tree
。
持久節點: 是Zookeeper中最常⻅的⼀種節點類型,所謂持久節點,就是指節點被建立後會⼀直存在務器,直到刪除操做主動清除。
持久順序節點: 就是有順序的持久節點,節點特性和持久節點是⼀樣的,只是額外特性表如今順序上。 順序特性實質是在建立節點的時候,會在節點名後⾯加上⼀個數字後綴,來表示其順序。
臨時節點: 就是會被⾃動清理掉的節點,它的⽣命週期和客戶端會話綁在⼀起,客戶端會話結束,節點會被刪除掉。與持久性節點不一樣的是,臨時節點不能建立⼦節點。
臨時順序節點: 就是有順序的臨時節點,和持久順序節點相同,在其建立的時候會在名字後⾯加上數字後綴。
整個 ZNode 節點內容包括兩部分:節點數據內容和節點狀態信息。圖中【持久節點順序】 是數據內容,其餘的屬於狀態信息。
Zookeeper使⽤Watcher機制實現分佈式數據的發佈/訂閱功能。⼀個典型的發佈/訂閱模型系統定義了⼀種 ⼀對多的訂閱關係,可以讓多個訂閱者同時監聽某⼀個主題對象,當這個主題對象⾃身狀態變化時,會通知全部訂閱者,使它們可以作出相應的處理。
Zookeeper中引入了Watcher機制實現這種分佈式的通知功能。Zookeeper容許客戶端向服務端註冊一個Watcher監聽,當服務端的一些指定事件觸發了這個Watcher,那麼會向客戶端發佈一個事件通知來實現分佈式的通知功能。
Zookeeper
的 Watcher
機制主要包括客戶端線程、客戶端WatcherManager、Zookeeper服務器三部分。
具體⼯做流程爲:
Zookeeper
服務器註冊的,同時會將 Watcher
對象存儲在客戶端的 WatcherManager
當中。Zookeeper
服務器觸發 Watcher
事件後,會向客戶端發送通知。WatcherManager
中取出對應的 Watcher
對象來執⾏回調邏輯。從三個⽅⾯來理解ACL機制:權限模式(Scheme)、受權對象(ID)、權限 (Permission),一般使⽤"scheme: id : permission"來標識⼀個有效的ACL信息。
IP:經過IP地址粒度來進⾏權限控制,如"ip:192.168.0.110"表示權限控制針對該IP地址, 同時IP模式能夠⽀持按照⽹段⽅式進⾏配置,如 "ip:192.168.0.1/24" 表示針對 192.168.0.*
這個⽹段進⾏權限控制。
Digest:是最常⽤的權限控制模式,要更符合咱們對權限控制的認識,其使 ⽤"username:password"形式的權限標識來進⾏權限配置,便於區分不一樣應⽤來進⾏權限控制。當咱們經過「username:password」形式配置了權限標識後,Zookeeper會前後對其進⾏SHA-1加密 和BASE64編碼。
World:是⼀種最開放的權限控制模式,這種權限控制⽅式⼏乎沒有任何做⽤,數據節點的訪問權限 對全部⽤戶開放,即全部⽤戶均可以在不進⾏任何權限校驗的狀況下操做ZooKeeper上的數據。 另外,World模式也能夠看做是⼀種特殊的Digest模式,它只有⼀個權限標識,即「 world:anyone
」。
Super:顧名思義就是超級⽤戶的意思,也是⼀種特殊的Digest模式。在Super模式下,超級 ⽤戶能夠對任意ZooKeeper上的數據節點進⾏任何操做。
受權對象:ID
權限模 式 | 受權對象 |
---|---|
IP | 一般是⼀個IP地址或IP段:例如:192.168.10.110 或192.168.10.1/24 |
Digest | ⾃定義,一般是username:BASE64(SHA-1(username:password))例如: zm:sdfndsllndlksfn7c= |
Digest | 只有⼀個ID :anyone |
Super | 超級⽤戶 |
權限就是指那些經過權限檢查後能夠被容許執⾏的操做。在ZooKeeper中,全部對數據的操做權限分爲 如下五⼤類: