Zookeeper入門實戰(1)-概念、安裝及命令行


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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM