天天看點

Zookeeper基本特性與節點資料類型

作者:記錄生活的小熊

引言

最近公司項目要使用zookeeper作為分布式鎖了,是以打算系統的了解一下zookeeper的使用特性、底層源碼、leader選舉機制、底層ZAB協定,以防項目使用過程中遇到詭異的問題而不知所措。預計分個4至5篇文章寫一下,記錄過程的同時也可以分享知識。

什麼是zookeeper

在以往的工作包括現在的面試中,對zookeeper印象最深的或許就是作為阿裡dubbo架構的注冊中心(時過境遷,現在已經是apache dubbo了(;´д`)ゞ)。官方對zookeeper的定義是:ZooKeeper是一個分布式的,開放源碼的分布式應用程式協調服務,是Google的Chubby一個開源的實作,是Hadoop和Hbase的重要元件。

沒想到吧,zookeeper使用最多的場景還是大資料領域(●ˇ∀ˇ●)。

zookeeper節點類型

  • ­持久化目錄節點:用戶端與zookeeper斷開連接配接後,該節點依舊存在,隻要不手動删除該節點,他将永遠存在
  • 持久化順序編号目錄節點:用戶端與zookeeper斷開連接配接後,該節點依舊存在,隻是Zookeeper給該節點名稱進行順序編号
  • 臨時目錄節點:zookeeper在一段時間内(逾時時間)沒有ping通此類型節點,會自動删除此節點,臨時節點不能有子節點
  • ­臨時順序編号目錄節點:和臨時節點類似,隻是在臨時節點的基礎上,zk對節點進行編号
  • 容器節點:容器節點是一個比較特殊的節點,容器節點主要用于裝載子節點,當容器節點下面沒有子節點,則容器節點在未來會被Zookeeper自動清除,定時任務預設60s 檢查一次

zookeeper節點監聽機制

zk的可以對它的所有節點進行監聽,主要是以下三種監聽方式:

  1. 節點監聽:當節點被删除或者修改時,用戶端會收到通知
  2. 目錄監聽:當目錄存在子節點建立或者子節點删除時,用戶端會收到通知
  3. 目錄遞歸子節點監聽:當目錄任意子節點有目錄結構變化或者根節點資料變化時,用戶端會收到通知

zookeeper本地部署

既然要了解zk功能,那勢必要将zk本地部署了,zk部署比較簡單,以下四步即可完成:

  1. 下載下傳并解壓zk檔案包,位址為:,解壓指令使用:tar -zxvf apache-zookeeper-3.5.8-bin.tar.gz
  2. 拷貝一份配置檔案,以備不時之需(目前如果需要“僞叢集”部署也會需要多個配置檔案)使用: cp zoo_sample.cfg zoo.cfg
  3. 修改zoo.cfg的data參數,防止檔案存儲資料丢失,dataDir=/home/tangshi/apache-zookeeper-3.5.8-bin/data
  4. 通過zk自帶的啟動腳本啟動即可:bin/zkServer.sh start conf/zoo.cfg,啟動完成後使用 :bin/zkCli.sh -server 192.168.1.104:2181 ,連接配接zkServer就可以對zk進行系列操作了。

zookeeper常用基礎指令

1、create [-s] [-e] [-c] [-t ttl] path [data] [acl],中括号為可選項,沒有則預設建立持久化節點

  • -s: 順序節點
  • -e: 臨時節點
  • -c: 容器節點
  • -t: 可以給節點添加過期時間,預設禁用,需要通過系統參數啟用
  • acl:節點權限設定

2、get [-s] [-w] path:檢視節點的資料

  • -w: 添加監聽器

3、set [-s] [-v version] path data:修改節點資料

4、delete [-v version] path:删除節點

5、ls [-s] [-w] [-R] path:檢視節點

6、stat [-w] path:檢視節點狀态,效果如下:

Zookeeper基本特性與節點資料類型

stat檢視節點狀态

  • cZxid:建立znode的事務ID(Zxid的值)。
  • mZxid:最後修改znode的事務ID。
  • pZxid:最後添加或删除子節點的事務ID(子節點清單發生變化才會發生改變)。
  • ctime:znode建立時間。
  • mtime:znode最近修改時間。
  • dataVersion:znode的目前資料版本。
  • cversion:znode的子節點結果集版本(一個節點的子節點增加、删除都會影響這個版本)。
  • aclVersion:表示對此znode的acl版本。
  • ephemeralOwner:znode是臨時znode時,表示znode所有者的 session ID。 如果znode不是臨時znode,則該字段設定為零。
  • dataLength:znode資料字段的長度。
  • numChildren:znode的子znode的數量。

zookeeper時間監聽機制

zk可以對其節點或者進行監聽,在發生對應的事件觸發,觸發後,對應的注冊立刻移除,監控指令如下:

get  -w  /path   // 對節點注冊監聽
stat -w /path   //  對節點注冊監聽,
ls -w /path //對目錄進行監聽,當目錄結構發生變化時觸發
ls -R -w /path //對目前目錄以及所有的子節點進行監聽           

zk事件類型如下:

  • None: 連接配接建立事件
  • NodeCreated: 節點建立
  • NodeDeleted: 節點删除
  • NodeDataChanged:節點資料變化
  • NodeChildrenChanged:子節點清單變化
  • DataWatchRemoved:節點監聽被移除
  • ChildWatchRemoved:子節點監聽被移除

zk事件被觸發效果如下圖:

Zookeeper基本特性與節點資料類型

節點資料變化觸發節點改變事件

zookeeper權限控制(ACL)

zookeeper可以控制節點的讀寫操作,來保證zk節點的資料安全性。zk的ACL分為權限模式、權限對象、權限資訊三個子產品,詳細解釋如下:

  • 權限模式:scheme,分為範圍驗證和密碼驗證,範圍驗證時對一段ip或者一個ip進行賦權,密碼模式則是通過使用者明和密碼驗證,通過Digest認證方式驗證。
  • 權限對象:如果權限模式為範圍驗證,則授權對象為ip或者ip位址段。權限模式為密碼模式時,則對應一個使用者名。如果對象為World,則是對所有的使用者進行授權
  • 權限資訊:即資料節點的操作種類,分别為:
  1. 資料節點(c: create)建立權限,授予權限的對象可以在資料節點下建立子節點;
  2. 資料節點(w: wirte)更新權限,授予權限的對象可以更新該資料節點;
  3. 資料節點(r: read)讀取權限,授予權限的對象可以讀取該節點的内容以及子節點資訊;
  4. 資料節點(d: delete)删除權限,授予權限的對象可以删除該資料節點的子節點;
  5. 資料節點(a: admin)管理者權限,授予權限的對象可以對該資料節點進行管理 ACL 權限。

設定節點ACL有兩種方式,一種時通過create方法,在建立節點的時候賦權,另外一種是通過setAcl方式進行賦權,詳細如下:

create /cute-bear xiaomao digest:admin:dyks0yAxrXfvFZ7G5BN0+ZUcGCE=:cdrwa
setAcl /cute-bear  digest:admin:dyks0yAxrXfvFZ7G5BN0+ZUcGCE=:cdrwa           

設定權限之後,直接使用get方法擷取節點資料則報異常:org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /encry-node-admin,需要通過:addauth digest admin:admin123 進行登入後,才可正常讀取節點資料。另外提一下,zk設定acl還有一種明文方式,登陸後就可以對節點直接使用密文添加授權。當使用者忘記節點密碼後,可以使用超級管理者模式進行密碼修改:

  1. 啟動參數添加 -Dzookeeper.DigestAuthenticationProvider.superDigest=super:<base64encoded(SHA1(密碼))
  2. 使用addauth digest super:密碼進行登入,最後使用setAcl修改密碼即可

以上就是zookeeper最基本的一些配置功能,下一篇文檔會針對zk叢集部署以及一些進階應用進行梳理。

繼續閱讀