一、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是非常重要的兩個目錄,平時也是經常使用的。
zkServer為伺服器,啟動後預設端口為2181(zkCli.sh是Linux的啟動腳本,zkCli.cmd是windows的啟動腳本)
zkCli為指令行用戶端
conf目錄
Conf目錄為配置檔案存放的目錄,zoo.cfg為核心的配置檔案
在這挑選幾個常用的講解:
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長連接配接,通過會話可以進行心跳檢測和資料傳輸;
會話(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中,znode是一個跟Unix檔案系統路徑相似的節點,可以往這個節點存儲或擷取資料
通過用戶端可對znode進行增删改查的操作,還可以注冊watcher監控znode的變化。
1.3.3 Zookeeper節點類型
節點類型非常重要,是後面項目實戰的基礎。
a、Znode有兩種類型:
臨時(ephemeral)(create -e /app1/test1 “test1” 用戶端斷開連接配接zk删除ephemeral類型節點,并且臨時節點不能有子節點)
持久(persistent) (create -s /app1/test2 “test2” 用戶端斷開連接配接zk不删除persistent類型節點)可以有子節點
b、Znode有四種形式的目錄節點(預設是persistent )
PERSISTENT (持久的)
PERSISTENT_SEQUENTIAL(持久序列/test0000000019 )
EPHEMERAL (臨時)
EPHEMERAL_SEQUENTIAL (臨時序列)
c、建立znode時設定順序辨別,znode名稱後會附加一個值,順序号是一個單調遞增的計數器,由父節點維護
1.3.4. 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權限資訊
setAcl
設定指定節點的ACL資訊
setAcl /testDir/testAcl world:anyone:crwa # 設定該節點的acl權限
getAcl /testDir/testAcl # 擷取該節點的acl權限資訊,成功後,該節點就少了d權限
create /testDir/testAcl/xyz xyz-data # 建立子節點
delete /testDir/testAcl/xyz # 由于沒有d權限,是以提示無法删除
addauth
注冊會話授權資訊
addauth digest user1:123456 # 需要先添加一個使用者(該使用者是會話層面的,如果會話退出,需要重新設定)
setAcl /testDir/testAcl auth:user1:123456:crwa # 然後才可以拿着這個使用者去設定權限
getAcl /testDir/testAcl # 密碼是以密文的形式存儲的
create /testDir/testAcl/testa aaa
delete /testDir/testAcl/testa # 由于沒有d權限,是以提示無法删除
退出用戶端後:
ls /testDir/testAcl #沒有權限無法通路
create /testDir/testAcl/testb bbb #沒有權限無法通路
addauth digest user1:123456 # 重新新增權限後可以通路了
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”); 獲得密碼
-
修改zkServer啟動腳本增加
“-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs=”
-
啟動用戶端用管理者登陸
addauth digest super:admin