Zookeeper簡介

Zookeeper是⼀個開源的分佈式協調服務,其設計⽬標是將那些複雜的且容易出錯的分佈式⼀致性服務封裝起來,構成⼀個⾼效可靠的原語集,並以⼀些簡單的接⼝提供給⽤戶使⽤。node

zookeeper是⼀個典型的分佈式數據⼀致性的解決⽅案,分佈式應⽤程序能夠基於它實現諸如數據訂閱/發佈、負載均衡、命名服務、集羣管理、分佈式鎖和分佈式隊列等功能。安全

zookeeper基本概念

集羣角色

Zookeeper 中引入了了 LeaderFollowerObserver 三種⻆⾊。 Leader 服務器爲客戶端提供讀和寫服務,除 Leader 外,其餘機器包括 FollowerObserver 都能提供讀服務。惟⼀的區別在於 Observer 不參與 Leader 選舉過程, 不參與寫操做的過半寫成功策略,所以 Observer 能夠在不影響寫性能的狀況下提高集羣的性能。服務器

會話(session)

指客戶端會話, ⼀個客戶端鏈接是指客戶端和服務端之間的⼀個TCP⻓鏈接session

數據節點(Znode)

ZooKeeper將全部數據存儲在內存中,數據模型是⼀棵樹 ( ZNode Tree ),由斜槓( / )進⾏分割的路徑,就是⼀個 Znode ,例如 /app/path1 。每一個 ZNode 上都 會保存⾃⼰的數據內容,同時還會保存⼀系列屬性信息。數據結構

版本

Zookeeper 會爲每一個 Znode 維護 ⼀個叫做 Stat 的數據結構, Stat 記錄了這個 ZNode 的三個數據版本,分別是 version (當前 ZNode 的版 本)、 cversion (當前 ZNode ⼦節點的版本)、 aversion (當前 ZNodeACL 版本)。app

事件監聽器(Watcher)

Wathcer(事件監聽器),是Zookeeper中⼀個很重要的特性,Zookeeper容許⽤戶在指定節點上註冊 ⼀些Watcher,而且在⼀些特定事件觸發的時候,Zookeeper服務端會將事件通知到感興趣的客戶端, 該機制是Zookeeper實現分佈式協調服務的重要特性負載均衡

權限控制(ACL)

Zookeeper採⽤ACL(Access Control Lists)策略來進⾏權限控制,其定義了以下五種權限:分佈式

  1. CREATE :建立⼦節點的權限。
  2. READ :獲取節點數據和⼦節點列表的權限。
  3. WRITE :更新節點數據的權限。
  4. DELETE :刪除⼦節點的權限。
  5. ADMIN :設置節點ACL的權限。

其中須要注意的是, CREATEDELETE 這兩種權限都是針對⼦節點的權限控制性能

服務器角色(TODO)

Leader

Leader服務器是Zookeeper集羣工做的核心,主要工做有如下兩個:編碼

  • 事務請求的惟一調度和矗立着,保證集羣事務處理的順序性
  • 集羣內部個服務器的調度者

Follower

ollower服務器是Zookeeper集羣狀態中的跟隨者,其主要⼯做有如下三個:

  1. 處理客戶端⾮事務性請求(讀取數據),轉發事務請求給Leader服務器。

  2. 參與事務請求Proposal的投票。

  3. 參與Leader選舉投票。

Observer

Observer是ZooKeeper⾃3.3.0版本開始引⼊的⼀個全新的服務器⻆⾊。從字⾯意思看,該服務器充當 了⼀個觀察者的⻆⾊——其觀察ZooKeeper集羣的最新狀態變化並將這些狀態變動同步過來。

Observer服務器在⼯做原理上和Follower基本是⼀致的,對於⾮事務請求,均可以進⾏獨⽴的處理,⽽ 對於事務請求,則會轉發給Leader服務器進⾏處理。 和Follower惟⼀的區別在於,Observer不參與任何形式的投票 ,包括事務請求Proposal的投票和Leader選舉投票。簡單地講,Observer服務器只提供 ⾮事務服務,一般⽤於在不影響集羣事務處理能⼒的前提下提高集羣的⾮事務處理能⼒。

Zookeeper數據模型——Znode

Zookeeper 中全部信息都被保存在一個個數據節點上,這些節點被稱爲 ZnodeZnodeZookeeper 中最小的存儲單元,在 Znode 上又能夠掛 Znode ,這樣一層一層下去就造成了 Znode 樹,稱爲 Znode Tree

Znode 的類型

  1. 持久節點: 是Zookeeper中最常⻅的⼀種節點類型,所謂持久節點,就是指節點被建立後會⼀直存在務器,直到刪除操做主動清除。

  2. 持久順序節點: 就是有順序的持久節點,節點特性和持久節點是⼀樣的,只是額外特性表如今順序上。 順序特性實質是在建立節點的時候,會在節點名後⾯加上⼀個數字後綴,來表示其順序。

  3. 臨時節點: 就是會被⾃動清理掉的節點,它的⽣命週期和客戶端會話綁在⼀起,客戶端會話結束,節點會被刪除掉。與持久性節點不一樣的是,臨時節點不能建立⼦節點。

  4. 臨時順序節點: 就是有順序的臨時節點,和持久順序節點相同,在其建立的時候會在名字後⾯加上數字後綴。

Znode的狀態信息

整個 ZNode 節點內容包括兩部分:節點數據內容和節點狀態信息。圖中【持久節點順序】 是數據內容,其餘的屬於狀態信息。

  • cZxid 就是 Create ZXID,表示節點被建立時的事務ID。
  • ctime 就是 Create Time,表示節點建立時間。
  • mZxid 就是 Modified ZXID,表示節點最後⼀次被修改時的事務ID。
  • mtime 就是 Modified Time,表示節點最後⼀次被修改的時間。
  • pZxid 表示該節點的⼦節點列表最後⼀次被修改時的事務 ID。只有⼦節點列表變動纔會更新 pZxid, ⼦節點內容變動不會更新。
  • cversion 表示⼦節點的版本號。
  • dataVersion 表示內容版本號。
  • aclVersion 標識acl版本 ephemeralOwner 表示建立該臨時節點時的會話 sessionID,若是是持久性節點那麼值爲 0
  • dataLength 表示數據⻓度。
  • numChildren 表示直系⼦節點數。

Watcher-數據變動通知

Zookeeper使⽤Watcher機制實現分佈式數據的發佈/訂閱功能。⼀個典型的發佈/訂閱模型系統定義了⼀種 ⼀對多的訂閱關係,可以讓多個訂閱者同時監聽某⼀個主題對象,當這個主題對象⾃身狀態變化時,會通知全部訂閱者,使它們可以作出相應的處理。

Zookeeper中引入了Watcher機制實現這種分佈式的通知功能。Zookeeper容許客戶端向服務端註冊一個Watcher監聽,當服務端的一些指定事件觸發了這個Watcher,那麼會向客戶端發佈一個事件通知來實現分佈式的通知功能。

ZookeeperWatcher 機制主要包括客戶端線程、客戶端WatcherManager、Zookeeper服務器三部分。

具體⼯做流程爲:

  1. 客戶端在向 Zookeeper 服務器註冊的,同時會將 Watcher 對象存儲在客戶端的 WatcherManager 當中。
  2. Zookeeper 服務器觸發 Watcher 事件後,會向客戶端發送通知。
  3. 客戶端線程從 WatcherManager 中取出對應的 Watcher 對象來執⾏回調邏輯。

ACL-保障數據的安全

從三個⽅⾯來理解ACL機制:權限模式(Scheme)、受權對象(ID)、權限 (Permission),一般使⽤"scheme: id : permission"來標識⼀個有效的ACL信息。

權限模式:Scheme

  1. IP:經過IP地址粒度來進⾏權限控制,如"ip:192.168.0.110"表示權限控制針對該IP地址, 同時IP模式能夠⽀持按照⽹段⽅式進⾏配置,如 "ip:192.168.0.1/24" 表示針對 192.168.0.* 這個⽹段進⾏權限控制。

  2. Digest:是最常⽤的權限控制模式,要更符合咱們對權限控制的認識,其使 ⽤"username:password"形式的權限標識來進⾏權限配置,便於區分不一樣應⽤來進⾏權限控制。當咱們經過「username:password」形式配置了權限標識後,Zookeeper會前後對其進⾏SHA-1加密 和BASE64編碼。

  3. World:是⼀種最開放的權限控制模式,這種權限控制⽅式⼏乎沒有任何做⽤,數據節點的訪問權限 對全部⽤戶開放,即全部⽤戶均可以在不進⾏任何權限校驗的狀況下操做ZooKeeper上的數據。 另外,World模式也能夠看做是⼀種特殊的Digest模式,它只有⼀個權限標識,即「 world:anyone 」。

  4. 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中,全部對數據的操做權限分爲 如下五⼤類:

  • CREATE(C):數據節點的建立權限,容許受權對象在該數據節點下建立⼦節點。
  • DELETE(D):⼦節點的刪除權限,容許受權對象刪除該數據節點的⼦節點。
  • READ(R):數據節點的讀取權限,允 許受權對象訪問該數據節點並讀取其數據內容或⼦節點列表等。
  • WRITE(W):數據節點的更新權 限,容許受權對象對該數據節點進⾏更新操做。
  • ADMIN(A):數據節點的管理權限,容許受權對象 對該數據節點進⾏ ACL 相關的設置操做。
相關文章
相關標籤/搜索