引言
最近公司項目要使用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的可以對它的所有節點進行監聽,主要是以下三種監聽方式:
- 節點監聽:當節點被删除或者修改時,用戶端會收到通知
- 目錄監聽:當目錄存在子節點建立或者子節點删除時,用戶端會收到通知
- 目錄遞歸子節點監聽:當目錄任意子節點有目錄結構變化或者根節點資料變化時,用戶端會收到通知
zookeeper本地部署
既然要了解zk功能,那勢必要将zk本地部署了,zk部署比較簡單,以下四步即可完成:
- 下載下傳并解壓zk檔案包,位址為:,解壓指令使用:tar -zxvf apache-zookeeper-3.5.8-bin.tar.gz
- 拷貝一份配置檔案,以備不時之需(目前如果需要“僞叢集”部署也會需要多個配置檔案)使用: cp zoo_sample.cfg zoo.cfg
- 修改zoo.cfg的data參數,防止檔案存儲資料丢失,dataDir=/home/tangshi/apache-zookeeper-3.5.8-bin/data
- 通過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:檢視節點狀态,效果如下:
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權限控制(ACL)
zookeeper可以控制節點的讀寫操作,來保證zk節點的資料安全性。zk的ACL分為權限模式、權限對象、權限資訊三個子產品,詳細解釋如下:
- 權限模式:scheme,分為範圍驗證和密碼驗證,範圍驗證時對一段ip或者一個ip進行賦權,密碼模式則是通過使用者明和密碼驗證,通過Digest認證方式驗證。
- 權限對象:如果權限模式為範圍驗證,則授權對象為ip或者ip位址段。權限模式為密碼模式時,則對應一個使用者名。如果對象為World,則是對所有的使用者進行授權
- 權限資訊:即資料節點的操作種類,分别為:
- 資料節點(c: create)建立權限,授予權限的對象可以在資料節點下建立子節點;
- 資料節點(w: wirte)更新權限,授予權限的對象可以更新該資料節點;
- 資料節點(r: read)讀取權限,授予權限的對象可以讀取該節點的内容以及子節點資訊;
- 資料節點(d: delete)删除權限,授予權限的對象可以删除該資料節點的子節點;
- 資料節點(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還有一種明文方式,登陸後就可以對節點直接使用密文添加授權。當使用者忘記節點密碼後,可以使用超級管理者模式進行密碼修改:
- 啟動參數添加 -Dzookeeper.DigestAuthenticationProvider.superDigest=super:<base64encoded(SHA1(密碼))
- 使用addauth digest super:密碼進行登入,最後使用setAcl修改密碼即可
以上就是zookeeper最基本的一些配置功能,下一篇文檔會針對zk叢集部署以及一些進階應用進行梳理。