Zookeeper是一個為分布式應用提供一致性協調服務的中間件,主要用來解決分布式應用中經常遇到的一些一致性問題,如:統一命名服務、狀態同步服務、集群管理、分布式應用配置項的管理等。本文主要包括Zookeeper簡介、安裝、命令行操作等;文中所使用到的軟件版本:Java 1.8.0_191、Zookeeper 3.6.0、Centos 7.6。
1、簡介
1.1、設計目標
ZooKeeper is simple.
ZooKeeper is replicated.
ZooKeeper is ordered.
ZooKeeper is fast.
ZooKeeper是簡單、可復制、有序、快速的。
1.2、數據模型和層次命名空間
ZooKeeper提供的命名空間與標准文件系統的命名空間非常類似。命名空間由一系列路徑組成,用/分隔。ZooKeeper命名空間中的每個節點使用一個具體路徑來標識。ZooKeeper的層次命名空間結構如下:
1.3、節點
與標准文件系統不同的是,ZooKeeper命名空間的每個節點可以保存數據,就像一個文件系統中的文件,它既是文件也是目錄。ZooKeeper用來存儲狀態信息、配置、位置信息等,因此存儲在每個節點上的數據通常很小,在字節到千字節范圍內。有四種類型的節點:
臨時節點(EPHEMERAL):會話結束該節點自動被刪除,臨時節點不能擁有子節點
臨時順序節點(EPHEMERAL_SEQUENTIAL):具有臨時節點特征,但是它會在節點名稱后面增加一個序列號,分布式鎖中會用到該類型節點
持久節點(PERSISTENT):創建后永久存在,可以自動刪除;也可以設置一個存活時間,當指定存活時間過去以后,如果相應的節點沒有得到更新且沒有直接的,就會被自動刪除
持久順序節點(PERSISTENT_SEQUENTIAL):具有持久節點特征,但是它會在節點名稱后面增加一個序列號
注:順序節點中序列號對於此節點的父節點是唯一的,它是一個10位的數字,如果這個序列號大於2^32-1就會溢出。
1.4、更新和監視
客戶端可以監視一個節點,當該節點發生變化時會,客戶端會收到該節點變化的通知;一個監視器只會觸發一次,觸發后會刪除該監視器。如果客戶端和其中一個ZooKeeper服務器之間的連接中斷,則客戶端將收到一個本地通知。
1.5、狀態信息
zxid:zookeeper每次狀態改變都收到一個zxid(ZooKeeper Transaction Id),zxid是全局有序的,每次更新都會產生一個新的,且后面的大於前面的。
版本:每次節點改變都會使該節點的版本號增加,有三中版本號:dataversion(數據版本號)、cversion(子節點版本號)、aclversion(節點所擁有的ACL版本號)
通過stat [-w] path可以查看節點的具體狀態信息:
cZxid 創建節點時的事務ID
ctime 創建節點時的時間
mZxid 最后修改節點的事務ID
mtime 最后修改節點的時間
pZxid 該節點的子節點最后一次修改的事務ID,添加子節點或刪除子節點就會影響子節點列表,但是修改子節點的數據內容則不影響該ID
cversion 子節點版本號,子節點每次修改版本號加1
dataversion 數據版本號,數據每次修改該版本號加1
aclversion 權限版本號,權限每次修改該版本號加1
ephemeralOwner 節點的會話id,只有臨時節點有,持久節點值為0
dataLength 節點的數據長度
numChildren 節點的子節點數量
1.6、特性
ZooKeeper的目標是作為構建其他復雜服務的基石,因此它提供了一系列的特性:
一致性:數據一致性, 數據按照順序分批入庫
原子性:事務要么成功要么失敗
單一視圖:客戶端連接集群中的任意zk節點, 數據都是一致的
可靠性:每次對zk的操作狀態都會保存在服務端
實時性::客戶端可以讀取到zk服務端的最新數據
2、zoo.cfg參數說明
clientPort zookeeper服務器對客戶端暴露的端口
dataDir zookeeper服務器存儲快照文件的目錄,事務日志文件默認也保存在該目錄下,除非另外指定。
dataLogDir 服務器存儲事務日志文件的目錄,默認與dataDir一致。建議將它和dataDir分別配置,防止磁盤的並發讀寫,影響服務器性能。可將其配置在一個單獨的磁盤上。
tickTime 服務器最小時間單元,默認值3000ms
initLimit leader服務器等待Follewer服務器啟動,並完成數據同步的時間,默認為10,表示10*tickTime
syncLimit leader服務器和Follewer服務器之間進行心跳檢測的間隔時間,默認為5,表示5*tickTime
server.id zookeeper集群的機器列表,其中id為serverId,與myid文件中的值對應。第一個端口用於指定Leader服務器和Follewer服務器進行運行時通信和數據同步所使用的端口,第二個端口用於進行Leader選舉過程中的投票通信
zookeeper.admin.enableServer 是否啟用AdminServer,默認為 true
admin.serverPort 設置 AdminServer 的端口,默認 8080
3、安裝
3.1、單機版安裝
3.1.1、下載並解壓Zookeeper
下載地址:http://zookeeper.apache.org/releases.html
解壓:tar zxvf zookeeper-3.6.0.tar.gz
3.1.2、修改配置文件
zoo.cfg默認不存在,可以從zoo_sample.cfg conf拷貝一份:
cd /home/hadoop/app/apache-zookeeper-3.6.0-bin/conf
cp zoo_sample.cfg zoo.cfg
配置文件zoo.cfg中的內容可以使用文件中的默認值,也可以根據實際需要修改配置項:
dataDir=/home/hadoop/app/apache-zookeeper-3.6.0-bin/data
3.1.3、啟動停止
cd /home/hadoop/app/apache-zookeeper-3.6.0-bin/bin
zkServer.sh start #啟動
zkServer.sh stop #停止
3.1.4、查看日志
cd /home/hadoop/app/apache-zookeeper-3.6.0-bin/bin tail -f zookeeper.out
3.2、集群安裝
假設在172.17.139.160、172.17.139.161、172.17.139.162三台機器上安裝。
3.2.1、下載並解壓Zookeeper(每台機器)
下載地址:http://zookeeper.apache.org/releases.html
解壓:tar zxvf zookeeper-3.6.0.tar.gz
3.2.2、修改zoo.cfg配置文件(每台機器)
zoo.cfg默認不存在,可以從zoo_sample.cfg conf拷貝一份:
cd /home/hadoop/app/apache-zookeeper-3.6.0-bin/conf
cp zoo_sample.cfg zoo.cfg
zoo.cfg中集群與單機的配置不同的地方是server.id參數,其他根據實際需要修改配置項:
dataDir=/home/hadoop/app/apache-zookeeper-3.6.0-bin/data server.1=172.17.139.160:2555:3555 server.2=172.17.139.161:2555:3555 server.3=172.17.139.162:2555:3555
3.2.3、創建myid文件(每台機器)
在dataDir(/home/hadoop/app/apache-zookeeper-3.6.0-bin/data)目錄下創建myid文件,文件內容為該zookeeeper在集群中的id,對應上面zoo.cfg中server.后的數字。
172.17.139.160:/home/hadoop/app/apache-zookeeper-3.6.0-bin/data/myid 文件內容:
1
172.17.139.161:/home/hadoop/app/apache-zookeeper-3.6.0-bin/data/myid 文件內容:
2
172.17.139.162:/home/hadoop/app/apache-zookeeper-3.6.0-bin/data/myid 文件內容:
3
3.2.4、啟動停止(每台機器)
cd /home/hadoop/app/apache-zookeeper-3.6.0-bin/bin
zkServer.sh start #啟動
zkServer.sh stop #停止
4、命令行
bin/zkCli.sh可以啟動一個客戶端連接到Zookeeper:
bin/zkCli.sh [-server host:port]
不加server參數,默認連接到本地2181端口;啟動后可以輸入help/h查看使用方法:
[zk: localhost:2181(CONNECTED) 4] help ZooKeeper -server host:port cmd args addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE addauth scheme auth close config [-c] [-w] [-s] connect host:port create [-s] [-e] [-c] [-t ttl] path [data] [acl] delete [-v version] path deleteall path [-b batch size] delquota [-n|-b] path get [-s] [-w] path getAcl [-s] path getAllChildrenNumber path getEphemerals path history listquota path ls [-s] [-w] [-R] path printwatches on|off quit reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*] redo cmdno removewatches path [-c|-d|-a] [-l] set [-s] [-v version] path data setAcl [-s] [-v version] [-R] path acl setquota -n|-b val path stat [-w] path sync path version Command not found: Command not found help [zk: localhost:2181(CONNECTED) 5]
4.1、列出子節點
ls [-s] [-w] [-R] path
-s:顯示節點狀態信息
-w:監聽該節點
-R:遞歸查看所有子節點
如:ls /
4.2、創建節點
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
-s:順序節點
-e:臨時節點
-t:設置存活時間(針對持久節點,單位秒);需要開啟,默認是關閉的,參見第6小節:TTL(Time To Life)
acl:權限控制
如:create /test test
4.3、查看節點
get [-s] [-w] path
-s:顯示狀態
-w:監聽該節點
如:get /test
4.4、設置節點
set [-s] [-v version] path data
-s:返回狀態信息
-v:設置版本信息
如:set /test testaa
4.4、查看節點狀態
stat [-w] path
-w:監視該節點
如:stat /test
4.5、刪除節點
delete [-v version] path
-v:指定版本信息
如:delete /test
4.6、設置權限
setAcl [-s] [-v version] [-R] path acl
-s:返回狀態信息
-v:指定版本信息
-R:遞歸設置權限
4.7、查看權限
getAcl [-s] path
-s:返回狀態信息
5、權限控制ACL(Access Control List)
ZooKeeper的權限控制是基於每個znode節點的,需要對每個節點設置權限,子節點不會繼承父節點的權限;ACL由三個字段組成:schema:id:permission。
5.1、schema(權限模式)
world 只有一個id,anyone,代表所有人
auth 使用已添加認證的用戶認證
digest 使用“用戶名:密碼”方式認證
ip 使用IP地址認證
x509 使用客戶端X500 Principal認證
5.2、id(授權對象)
權限賦予的用戶或者一個實體
word對應的id只有一個:anyone
digest自定義id,通常為“usernmae:BASE64(SHA-1(username:password))”
ip對應的id為一個ip或ip段,如10.49.196.10、10.49.196.0、24
5.3、permission(權限)
CREATE(c) 可以創建子節點
READ(r) 可以讀取節點數據及顯示子節點列表
WRITE(w) 可以設置節點數據
DELETE(d) 可以刪除子節點(僅下一級節點)
ADMIN(a) 可以設置節點權限
5.4、例子
5.4.1、word例子
setAcl /acltest world:anyone:cdrwa
創建節點時如果沒有設置權限,這是默認的權限。
5.4.2、auth例子
addauth digest jack:123456 #先添加認證用戶 setAcl /acltest auth:jack:cdrwa
再開一個終端需先添加認證用戶(addauth digest jack:123456)才能訪問/actltest
5.4.3、digest例子
echo -n jack:123456 | openssl dgst -binary -sha1 | openssl base64#得到密文tgi9UCnyPo5FJjVylKr05nAlWeg= setAcl /acltest digest:jack:tgi9UCnyPo5FJjVylKr05nAlWeg=:cdrwa
添加認證用戶(addauth digest jack:123456)后才能訪問/actltest。
5.4.4、ip例子
setAcl /acltest ip:10.49.196.10:cdrwa
10.49.196.10的機器才能訪問/actltest。
6、TTL(Time To Life)
在zookeeper中,當創建一個PERSISTENT或者PERSISTENT_SEQUENTIAL節點的時候,可以有選擇的給這個節點設置一個存活時間(TTL);當指定存活時間過去以后,如果該節點沒有得到更新且沒有直接的,就會被自動刪除。
默認該特性是關閉的,如果需要設置java系統屬性:zookeeper.extendedTypesEnabled;由於TTL節點是在3.5.3版本增加的,3.5.4/3.6.0版本並不支持,所以在3.5.4/3.6.0等其他版本還需設置另外一個java系統屬性:Dzookeeper.emulate353TTLNodes。可以修改zkServer.sh腳本,增加:
-Dzookeeper.extendedTypesEnabled=true -Dzookeeper.emulate353TTLNodes=true
在zkServer.sh腳本里查找到start關鍵字,在如下圖所示的地方增加上面的代碼,如何重啟Zookeeper即可。
7、AdminServer
AdminServer 提供了簡單的 Zookeeper 狀態信息查詢功能,每個命令返回一個 json 字符串,AdminServer 默認 URL 為 http://ip:8080/commands。