天天看點

Zookeeper[2]—基礎篇一、Zookeeper基礎

一、Zookeeper基礎

1.1 安裝Zookeeper(參考如下部落格)

https://blog.csdn.net/qq_42642159/article/details/113239638?spm=1001.2014.3001.5501

1.2 目錄結構

bin 存放系統腳本

conf 存放配置檔案

contrib zk附加功能支援

dist-maven maven倉庫檔案

docs zk文檔

lib 依賴的第三方庫

recipes 經典場景樣例代碼

src zk源碼

其中bin和conf是非常重要的兩個目錄,平時也是經常使用的。

Zookeeper[2]—基礎篇一、Zookeeper基礎

zkServer為伺服器,啟動後預設端口為2181(zkCli.sh是Linux的啟動腳本,zkCli.cmd是windows的啟動腳本)

zkCli為指令行用戶端

conf目錄

Conf目錄為配置檔案存放的目錄,zoo.cfg為核心的配置檔案

Zookeeper[2]—基礎篇一、Zookeeper基礎
Zookeeper[2]—基礎篇一、Zookeeper基礎
Zookeeper[2]—基礎篇一、Zookeeper基礎
Zookeeper[2]—基礎篇一、Zookeeper基礎
Zookeeper[2]—基礎篇一、Zookeeper基礎

在這挑選幾個常用的講解:

clientPort:參數無預設值,必須配置,用于配置目前伺服器對外的服務端口,用戶端必須使用這端口才能進行連接配接

dataDir:用于存放記憶體資料庫快照的檔案夾,同時用于叢集的myid檔案也存在這個檔案夾裡(注意:一個配置檔案隻能包含一個dataDir字樣,即使它被注釋掉了。)

dataLogDir:用于單獨設定transaction log的目錄,transaction log分離可以避免和普通log還有快照的競争

dataDir:新安裝zk這檔案夾裡面是沒有檔案的,可以通過snapCount參數配置産生快照的時機

以下配置叢集中才會使用,後面再讨論

tickTime:心跳時間,為了確定連接配接存在的,以毫秒為機關,最小逾時時間為兩個心跳時間

initLimit:多少個心跳時間内,允許其他server連接配接并初始化資料,如果ZooKeeper管理的資料較大,則應相應增大這個值

syncLimit:多少個tickTime内,允許follower同步,如果follower落後太多,則會被丢棄。

1.3 Zookeeper的特性

Zk的特性會從會話、資料節點,版本,Watcher,ACL權限控制,叢集角色這些部分來了解,其中重點需要掌握的資料節點與Watcher

1.3.1 會話

用戶端與服務端的一次會話連接配接,本質是TCP長連接配接,通過會話可以進行心跳檢測和資料傳輸;

Zookeeper[2]—基礎篇一、Zookeeper基礎

會話(session)是zookepper非常重要的概念,用戶端和服務端之間的任何互動操作都與會話有關

會話狀态

看上圖,Zk用戶端和服務端成功連接配接後,就建立了一次會話,ZK會話在整個運作期間的生命周期中,會在不同的會話狀态之間切換,這些狀态包括:

CONNECTING、CONNECTED、RECONNECTING、RECONNECTED、CLOSE

一旦用戶端開始建立Zookeeper對象,那麼用戶端狀态就會變成CONNECTING狀态,同時用戶端開始嘗試連接配接服務端,連接配接成功後,用戶端狀态變為CONNECTED,通常情況下,由于斷網或其他原因,用戶端與服務端之間會出現斷開情況,一旦碰到這種情況,Zookeeper用戶端會自動進行重連服務,同時用戶端狀态再次變成CONNCTING,直到重新連上服務端後,狀态又變為CONNECTED,在通常情況下,用戶端的狀态總是介于CONNECTING和CONNECTED之間。但是,如果出現諸如會話逾時、權限檢查或是用戶端主動退出程式等情況,用戶端的狀态就會直接變更為CLOSE狀态

1.3.2 ZK資料模型

ZooKeeper的視圖結構和标準的Unix檔案系統類似,其中每個節點稱為“資料節點”或ZNode,每個znode可以存儲資料,還可以挂載子節點,是以可以稱之為“樹”

第二點需要注意的是,每一個znode都必須有值,如果沒有值,節點是不能建立成功的。

Zookeeper[2]—基礎篇一、Zookeeper基礎

在Zookeeper中,znode是一個跟Unix檔案系統路徑相似的節點,可以往這個節點存儲或擷取資料

通過用戶端可對znode進行增删改查的操作,還可以注冊watcher監控znode的變化。

1.3.3 Zookeeper節點類型

Zookeeper[2]—基礎篇一、Zookeeper基礎

節點類型非常重要,是後面項目實戰的基礎。

a、Znode有兩種類型:

臨時(ephemeral)(create -e /app1/test1 “test1” 用戶端斷開連接配接zk删除ephemeral類型節點,并且臨時節點不能有子節點)

Zookeeper[2]—基礎篇一、Zookeeper基礎
Zookeeper[2]—基礎篇一、Zookeeper基礎

持久(persistent) (create -s /app1/test2 “test2” 用戶端斷開連接配接zk不删除persistent類型節點)可以有子節點

Zookeeper[2]—基礎篇一、Zookeeper基礎

b、Znode有四種形式的目錄節點(預設是persistent )

PERSISTENT (持久的)

PERSISTENT_SEQUENTIAL(持久序列/test0000000019 )

Zookeeper[2]—基礎篇一、Zookeeper基礎
Zookeeper[2]—基礎篇一、Zookeeper基礎

EPHEMERAL (臨時)

EPHEMERAL_SEQUENTIAL (臨時序列)

Zookeeper[2]—基礎篇一、Zookeeper基礎

c、建立znode時設定順序辨別,znode名稱後會附加一個值,順序号是一個單調遞增的計數器,由父節點維護

1.3.4. Zookeeper節點狀态屬性

Zookeeper[2]—基礎篇一、Zookeeper基礎

1.4 ACL保障資料的安全

1.4.1 ACL機制

ACL機制,表示為 scheme: id:permission ,第一個字段表示采用哪一種機制,第二個id表示使用者,permissions表示相關權限(如隻讀,讀寫,管理等)。

Zookeeper的ACL(Access Control List),分為三個次元:scheme、id、permission

通常表示為: scheme: id :permission

schema:代表授權政策

id:代表使用者

permission:代表權限

zookeeper提供了如下幾種機制(scheme):

world: 它下面隻有一個id, 叫anyone, world:anyone代表任何人,zookeeper中對所有人有權限的結點就是屬于world:anyone的

auth: 它不需要id, 隻要是通過authentication的user都有權限(zookeeper支援通過kerberos來進行authencation, 也支援username/password形式的authentication)

digest: 它對應的id為username:BASE64(SHA1(password)),它需要先通過username:password形式的authentication

ip: 它對應的id為客戶機的IP位址,設定的時候可以設定一個ip段,比如ip:192.168.1.0/16, 表示比對前16個bit的IP段

Scheme

world:

預設方式,相當于全世界都能通路

auth:

代表已經認證通過的使用者(可以通過addauth digest user:pwd 來添加授權使用者)

digest:

即使用者名:密碼這種方式認證,這也是業務系統中最常用的

ip:

使用Ip位址認證

id

id是驗證模式,不同的scheme,id的值也不一樣。

scheme為auth時:

username:password

scheme為digest時:

username:BASE64(SHA1(password))

scheme為ip時:

用戶端的ip位址。

scheme為world時

anyone。

Permission

CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理權限,這5種權限簡寫為crwda(即:每個單詞的首字元縮寫)

CREATE©:建立子節點的權限

DELETE(d):删除節點的權限

READ®:讀取節點資料的權限

WRITE(w):修改節點資料的權限

ADMIN(a):設定子節點權限的權限

1.4.2 ACL指令

getAcl

擷取指定節點的ACL資訊

create /testDir/testAcl deer # 建立一個子節點

getAcl /testDir/testAcl # 擷取該節點的acl權限資訊

Zookeeper[2]—基礎篇一、Zookeeper基礎

setAcl

設定指定節點的ACL資訊

setAcl /testDir/testAcl world:anyone:crwa # 設定該節點的acl權限

getAcl /testDir/testAcl # 擷取該節點的acl權限資訊,成功後,該節點就少了d權限

Zookeeper[2]—基礎篇一、Zookeeper基礎

create /testDir/testAcl/xyz xyz-data # 建立子節點

delete /testDir/testAcl/xyz # 由于沒有d權限,是以提示無法删除

Zookeeper[2]—基礎篇一、Zookeeper基礎

addauth

注冊會話授權資訊

addauth digest user1:123456 # 需要先添加一個使用者(該使用者是會話層面的,如果會話退出,需要重新設定)

setAcl /testDir/testAcl auth:user1:123456:crwa # 然後才可以拿着這個使用者去設定權限

getAcl /testDir/testAcl # 密碼是以密文的形式存儲的

Zookeeper[2]—基礎篇一、Zookeeper基礎

create /testDir/testAcl/testa aaa

delete /testDir/testAcl/testa # 由于沒有d權限,是以提示無法删除

Zookeeper[2]—基礎篇一、Zookeeper基礎

退出用戶端後:

ls /testDir/testAcl #沒有權限無法通路

Zookeeper[2]—基礎篇一、Zookeeper基礎

create /testDir/testAcl/testb bbb #沒有權限無法通路

Zookeeper[2]—基礎篇一、Zookeeper基礎

addauth digest user1:123456 # 重新新增權限後可以通路了

Zookeeper[2]—基礎篇一、Zookeeper基礎

Digest

auth與digest的差別就是,前者使用明文密碼進行登入,後者使用密文密碼進行登入

create /testDir/testDigest data

addauth digest user1:123456

setAcl /testDir/testDigest digest:user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:crwa # 使用digest來設定權限

setAcl /testDir/testAcl auth:user1:123456:crwa #使用auth來設定權限

差別就是兩個使用密碼的方式不一樣,一個是明文,一個是密文

注意:這裡如果使用明文,會導緻該znode不可通路

通過明文獲得密文

shell>

java -Djava.ext.dirs=/soft/zookeeper-3.4.12/lib -cp /soft/zookeeper-3.4.12/zookeeper-3.4.12.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider deer:123456

通過Zookeeper的lib包裡面的javad代碼

deer:123456->deer:ACFm5rWnnKn9K9RN/Oc8qEYGYDs=

acl指令行ip

create /testDir/testIp data

setAcl /testDir/testIp ip:192.168.30.10:cdrwa

getAcl /testDir/testIp

1.5 常用指令

1.5.1 服務端常用指令

在準備好相應的配置之後,可以直接通過zkServer.sh 這個腳本進行服務的相關操作

啟動ZK服務: sh bin/zkServer.sh start •

檢視ZK服務狀态: sh bin/zkServer.sh status •

停止ZK服務: sh bin/zkServer.sh stop •

重新開機ZK服務: sh bin/zkServer.sh restart

1.5.2 用戶端常用指令

使用 zkCli.sh -server 127.0.0.1:2181 連接配接到 ZooKeeper 服務,連接配接成功後,系統會輸出 ZooKeeper 的相關環境以及配置資訊。 指令行工具的一些簡單操作如下:

顯示根目錄下、檔案: ls / 使用 ls 指令來檢視目前 ZooKeeper 中所包含的内容

顯示根目錄下、檔案: ls2 / 檢視目前節點資料并能看到更新次數等資料 (ls -s)

建立檔案,并設定初始内容: create /zk “test” 建立一個新的 znode節點“ zk ”以及與它關聯的字元串 [-e] [-s] 【-e 零時節點】 【-s 順序節點】

擷取檔案内容: get /zk 确認 znode 是否包含我們所建立的字元串 [watch]【watch 監聽】

(如果get指令看不到節點屬性,用get -s 試下)

修改檔案内容: set /zk “zkbak” 對 zk 所關聯的字元串進行設定 •

删除檔案: delete /zk 将剛才建立的 znode 删除,如果存在子節點删除失敗

遞歸删除:rmr /zk将剛才建立的 znode 删除,子節點同時删除

(如果沒有rmr指令使用看help指令查詢是否有deleteall,如果有就用這個指令)

退出用戶端: quit •

幫助指令: help

1.6 常用四字指令

ZooKeeper 支援某些特定的四字指令字母與其的互動。用來擷取 ZooKeeper 服務的目前狀态及相關資訊。可通過 telnet 或 nc 向 ZooKeeper 送出相應的指令 :

當然,前提是安裝好了nc

echo stat|nc 127.0.0.1 2181 來檢視哪個節點被選擇作為follower或者leader

使用echo ruok|nc 127.0.0.1 2181 測試是否啟動了該Server,若回複imok表示已經啟動。

echo dump| nc 127.0.0.1 2181 ,列出未經處理的會話和臨時節點。

echo kill | nc 127.0.0.1 2181 ,關掉server

echo conf | nc 127.0.0.1 2181 ,輸出相關服務配置的詳細資訊。

echo cons | nc 127.0.0.1 2181 ,列出所有連接配接到伺服器的用戶端的完全的連接配接 / 會話的詳細資訊

echo envi |nc 127.0.0.1 2181 ,輸出關于服務環境的詳細資訊(差別于 conf 指令)。

echo reqs | nc 127.0.0.1 2181 ,列出未經處理的請求。

echo wchs | nc 127.0.0.1 2181 ,列出伺服器 watch 的詳細資訊。

echo wchc | nc 127.0.0.1 2181 ,通過 session 列出伺服器 watch 的詳細資訊,它的輸出是一個與 watch 相關的會話的清單。

echo wchp | nc 127.0.0.1 2181 ,通過路徑列出伺服器 watch 的詳細資訊。它輸出一個與 session 相關的路徑。

1.7 ZooKeeper 日志可視化

前面以及講了兩個非常重要的配置一個是dataDir,存放的快照資料,一個是dataLogDir,存放的是事務日志檔案

(使用cat指令打開都是亂碼,需要用下面的方法打開即可)

java -classpath /usr/local/tools/zookeeper/lib/slf4j-api-1.7.25.jar:/usr/local/tools/zookeeper/lib/zookeeper-3.6.2.jar org.apache.zookeeper.server.SnapshotFormatter /usr/local/tools/zookeeper/data/version-2/snapshot.0

java -classpath /usr/local/tools/zookeeper/lib/slf4j-api-1.7.25.jar:/usr/local/tools/zookeeper/lib/zookeeper-3.6.2.jar org.apache.zookeeper.server.LogFormatter /usr/local/tools/zookeeper/data/version-2/log.1

1.8 ACL權限補充

很多同學練習setAcl權限的時候由于失誤,導緻節點無法删除

create /enjoy1/node1 enjoy

setAcl /enjoy1 world:anyone:r

這個時候無論是delete 還是rmr都沒有權限删除

解決方式:啟用super權限

使用DigestAuthenticationProvider.generateDigest(“super:admin”); 獲得密碼

  1. 修改zkServer啟動腳本增加

    “-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs=”

  2. 啟動用戶端用管理者登陸

    addauth digest super:admin