Zookeeper 入門
1.1 概述
Zookeeper是一個開源的分布式的,為分布式框架提供協調服務的 Apache 專案,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VWiMVE91-1630333614815)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830202143688.png)]](https://img.uj5u.com/2021/09/01/2605820114110012.png)
-
作業機制
-
Zookeeper從設計模式角度來理解:
是一個基于觀察者模式設計的分布式服務管理框架,它負責存盤和管理大家都關心的資料,然后
接受觀察者的注冊,一旦這些資料的狀態發生變化,Zookeeper就將負責通知已經在Zookeeper上注冊的那些觀察者做出相應的反應,
-
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Pc8ezH6f-1630333614817)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830202522512.png)]](https://img.uj5u.com/2021/09/01/2605820114110013.png)
1.2特點
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-HVV2WFet-1630333614819)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830202622387.png)]](https://img.uj5u.com/2021/09/01/2605820114110014.png)
1.3資料結構
ZooKeeper 資料模型的結構與 Unix 檔案系統很類似,整體上可以看作是一棵樹,每個節點稱做一個 ZNode,每一個 ZNode 默認能夠存盤 1MB 的資料,每個 ZNode 都可以通過其路徑唯一標識,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WKQexEPH-1630333614823)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830202712693.png)]](https://img.uj5u.com/2021/09/01/2605820114110015.png)
1.4應用場景
提供的服務包括:統一命名服務、統一配置管理、統一集群管理、服務器節點動態上下線、軟負載均衡等,
- 統一命名服務
在分布式環境下,經常需要對應用/服務進行統一命名,便于識別,例如:IP不容易記住,而域名容易記住
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-y1QjV0xy-1630333614826)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830202815446.png)]](https://img.uj5u.com/2021/09/01/2605820114110016.png)
-
統一配置管理
- 分布式環境下,組態檔同步非常常見,
- (1)一般要求一個集群中,所有節點的配置資訊是一致的,比如 Kafka 集群,
- (2)對組態檔修改后,希望能夠快速同步到各個節點上,
- 配置管理可交由ZooKeeper實作,
- (1)可將配置資訊寫入ZooKeeper上的一個Znode,
- (2)各個客戶端服務器監聽這個Znode,
- (3)一旦Znode中的資料被修改,ZooKeeper將通知各個客戶端服務器,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dOM3ONpW-1630333614827)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830202930376.png)]](https://img.uj5u.com/2021/09/01/2605820114110017.png)
- 分布式環境下,組態檔同步非常常見,
- 統一集群管理
- 分布式環境中,實時掌握每個節點的狀態是必要的,
- (1)可根據節點實時狀態做出一些調整,
- ZooKeeper可以實作實時監控節點狀態變化
- (1)可將節點資訊寫入ZooKeeper上的一個ZNode,
- (2)監聽這個ZNode可獲取它的實時狀態變化,
- 分布式環境中,實時掌握每個節點的狀態是必要的,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-APmTD2g1-1630333614829)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830203054034.png)]](https://img.uj5u.com/2021/09/01/2605820114110018.png)
- 服務器動態上下線
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NZnRsk7D-1630333614830)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830203111510.png)]](https://img.uj5u.com/2021/09/01/2605820114110019.png)
- 軟負載均衡
在Zookeeper中記錄每臺服務器的訪問數,讓訪問數最少的服務器去處理最新的客戶端請求
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-YZgCRey0-1630333614832)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830203318948.png)]](https://img.uj5u.com/2021/09/01/2605820114110020.png)
1.5下載地址
-
1) 官網首頁:
https://zookeeper.apache.org/ -
2)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4dbcY4nk-1630333614833)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830203359691.png)]](https://img.uj5u.com/2021/09/01/2605820114110021.png)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zfxk78k7-1630333614835)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830203404910.png)]](https://img.uj5u.com/2021/09/01/2605820114110022.png)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-s2cdFy8R-1630333614836)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830203408973.png)]](https://img.uj5u.com/2021/09/01/260582011411001.png)
-
3 )下載 Linux 環境安裝的 tar包
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jNk0GCPo-1630333614837)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830203433676.png)]](https://img.uj5u.com/2021/09/01/2605820114110023.png)
Zookeeper 本地安裝
2.1 本地模式 安裝
-
安裝前準備
-
(1)安裝 JDK
-
(2)拷貝 apache-zookeeper-3.5.7-bin.tar.gz 安裝包到 Linux 系統下
-
(3)解壓到指定目錄
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -
(4)修改名稱
mv apache-zookeeper-3.5.7 -bin/zookeeper-3.5.7 -
配置修改
-
(1)將/usr/local/zookeeper/zookeeper-3.5.7/conf 這個路徑下的 zoo_sample.cfg 修改為 zoo.cfg;
mv zoo_sample.cfg zoo.cfg -
(2)打開 zoo.cfg 檔案,修改 dataDir 路徑:
vim zoo.cfg修改如下內容:
dataDir=/usr/local/zookeeper/zkData![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XBxiIlPi-1630333614838)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830210221864.png)]](https://img.uj5u.com/2021/09/01/260582011411002.png)
-
(3)在/usr/local/zookeeper/zookeeper-3.5.7/這個目錄上創建 zkData 檔案夾
mkdir zkData
-
-
操作 Zookeeper
- 啟動 Zookeeper
bin/zkServer.sh start![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-G3tAT5DJ-1630333614839)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830210512845.png)]](https://img.uj5u.com/2021/09/01/260582011411003.png)
- 查看行程是否啟動
jps![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tzrJjzn0-1630333614840)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830210558963.png)]](https://img.uj5u.com/2021/09/01/260582011411004.png)
- 查看狀態
bin/zkServer.sh status![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qGCdv64m-1630333614842)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830210643396.png)]](https://img.uj5u.com/2021/09/01/260582011411005.png)
- 啟動客戶端
bin/zkCli.sh![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pdt51C5d-1630333614843)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830210733547.png)]](https://img.uj5u.com/2021/09/01/2605820114110024.png)
-
退出客戶端
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-vZwIE1ms-1630333614844)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830210843843.png)]](https://img.uj5u.com/2021/09/01/260582011411006.png)
quit- 停止 Zookeeper
bin/zkServer.sh stop![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1fQLds6X-1630333614845)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830210859787.png)]](https://img.uj5u.com/2021/09/01/260582011411007.png)
2.2 配置引數
Zookeeper中的組態檔zoo.cfg中引數含義解讀如下:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4PRtVdJC-1630333614846)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830211546900.png)]](https://img.uj5u.com/2021/09/01/2605820114110025.png)
-
tickTime = 2000:
通信心跳時,Zookeeper 服務器與客戶端心跳時間,單位毫秒
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-J24coMoM-1630333614847)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830211257936.png)]](https://img.uj5u.com/2021/09/01/260582011411008.png)
-
initLimit = 10 :
Leader和Follower的初始通信時限
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-TX5Mxmvy-1630333614849)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830211339719.png)]](https://img.uj5u.com/2021/09/01/260582011411009.png)
Leader和Follower
初始連接時能容忍的最多心跳數(tickTime的數量) -
syncLimit = 5 :
LF 同步通信時限
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-bIqXTA3m-1630333614849)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830211414373.png)]](https://img.uj5u.com/2021/09/01/2605820114110010.png)
Leader和Follower之間通信時間如果超過
syncLimit * tickTime,Leader認為Follwer死掉,從服務器串列中洗掉Follwer, -
dataDir :
保存Zookeeper中的資料
注意:默認的tmp目錄,容易被Linux系統定期洗掉,所以一般不用默認的tmp目錄,
-
clientPort = 2181 :
客戶端連接埠 ,通常不做修改,
Zookeeper 集群操作
3.1 集群操作
3.1.1 集群安裝
-
集群規劃
在 hadoop102、hadoop103 和 hadoop104 三個節點上都部署 Zookeeper,思考:如果是 10 臺服務器,需要部署多少臺 Zookeeper ?
-
解壓安裝
重復上面的單機安裝程序
-
配置服務器編號
-
(1)在創建 zkData
mkdir zkData -
(2)在zkData 目錄下創建一個 myid 的檔案
touch myid vi myid在檔案中添加與 server 對應的編號(注意:上下不要有空行,左右不要有空格)
2注意:添加 myid 檔案,一定要在 Linux 里面創建,在 notepad++里面很可能亂碼
-
(3)拷貝配置好的 zookeeper 到其他機器上
xsync zookeeper-3.5.7并分別在 hadoop103、hadoop104 上修改 myid 檔案中內容為 3、4
-
-
配置zoo.cfg 檔案
-
(1)如上一樣重命名zoo_sample.cfg 為zoo.cnf
-
(2)打開 zoo.cfg 檔案
vim zoo.cfg-
#修改資料存盤路徑配置
dataDir=/usr/local/zookeeper/zkData -
#增加如下配置
#######################cluster########################## server.1=192.168.109.101:2888:3888 server.2=192.168.109.102:2888:3888 server.3=192.168.109.103:2888:3888![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-32f5iYzE-1630333614850)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830213358005.png)]](https://img.uj5u.com/2021/09/01/2605820114110011.png)
-
-
(3)配置引數解讀
server.A=B:C:D,- A 是一個數字,表示這個是第幾號服務器;
集群模式下配置一個檔案 myid,這個檔案在 dataDir 目錄下,這個檔案里面有一個資料就是 A 的值,Zookeeper 啟動時讀取此檔案,拿到里面的資料與 zoo.cfg 里面的配置資訊比較從而判斷到底是哪個 server, - B 是這個服務器的地址;
- C 是這個服務器 Follower 與集群中的 Leader 服務器交換資訊的埠;
- D 是萬一集群中的 Leader 服務器掛了,需要一個埠來重新進行選舉,選出一個新的Leader,而這個埠就是用來執行選舉時服務器相互通信的埠,
- A 是一個數字,表示這個是第幾號服務器;
-
(4)同步 zoo.cfg 組態檔
xsync zoo.cfg -
集群操作
-
(1)分別啟動 Zookeeper
bin/zkServer.sh start #s1 bin/zkServer.sh start #s2 bin/zkServer.sh start #s3 -
(2)查看狀態
[root@s1 zookeeper3.5.7]# sh bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/zookeeper3.5.7/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Mode: follower [root@s2 zookeeper3.5.7]# sh bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/zookeeper3.5.7/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Mode: follower [root@s3 zookeeper3.5.7]# sh bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/zookeeper3.5.7/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Mode: leader
3.1.2 選舉機制(面試重點)
- Zookeeper選舉機制—— 第一次啟動
總結一句話,后來者居上
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-sy31U1Yx-1630333614851)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830212027475.png)]](https://img.uj5u.com/2021/09/01/2605820114110026.png)
- Zookeeper選舉機制——非第一次啟動
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Ouwzd8Nt-1630333614852)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830212053602.png)]](https://img.uj5u.com/2021/09/01/2605820114110027.png)
3.1.3 ZK 集群啟動停止腳本
-
1)在 hadoop102 的/home/atguigu/bin 目錄下創建腳本
#!/bin/bash case $1 in "start"){ for i in 192.168.109.101 192.168.109.102 192.168.109.103 do echo ---------- zookeeper $i 啟動 ------------ ssh $i "sh /usr/local/zookeeper/zookeeper3.5.7/bin/zkServer.sh start" done };; "stop"){ for i in 192.168.109.101 192.168.109.102 192.168.109.103 do echo ---------- zookeeper $i 停止 ------------ ssh $i "sh /usr/local/zookeeper/zookeeper3.5.7/bin/zkServer.sh stop" done };; "status"){ for i in 192.168.109.101 192.168.109.102 192.168.109.103 do echo ---------- zookeeper $i 狀態 ------------ ssh $i "sh /usr/local/zookeeper/zookeeper3.5.7/bin/zkServer.sh status" done };; esac -
2)增加腳本執行權限
chmod u+x zk.sh -
Zookeeper 集群啟動腳本
./zk.sh start -
Zookeeper 集群停止腳本
./zk.sh stop
3.2 客戶端 命令列 操作
3.2.1 命令列語法
| 命令基本語法 | 功能描述 |
|---|---|
| help | 顯示所有操作命令 |
| ls path | 使用 ls 命令來查看當前 znode 的子節點 [可監聽] -w 監聽子節點變化 -s 附加次級資訊 |
| create | 普通創建 -s 含有序列 -e 臨時(重啟或者超時消失) |
| get path | 獲得節點的值 [可監聽] -w 監聽節點內容變化 -s 附加次級資訊 |
| set | 設定節點的具體值 |
| stat | 查看節點狀態 |
| delete | 洗掉節點 |
| deleteall | 遞回洗掉節點 |
-
1) 啟動客戶端
bin/zkCli.sh -server 192.168.109.101:2181![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LaQeBFQa-1630333614853)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830221852517.png)]](https://img.uj5u.com/2021/09/01/2605820114110028.png)
-
2) 顯示所有操作命令
help
3.2.2 znode 節點資料資訊
- 1) 查看當前znode 中所包含的內容
ls /
-
2) 查看當前節點詳細 資料
ls -s /![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-j8JvdmAU-1630333614854)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210830221919122.png)]](https://img.uj5u.com/2021/09/01/2605820114110029.png)
- czxid:
- 創建節點的事務 zxid每次修改 ZooKeeper 狀態都會產生一個 ZooKeeper 事務 ID,事務 ID 是 ZooKeeper 中所有修改總的次序,
- 每次修改都有唯一的 zxid,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 前發生,
- ctime:
- znode 被創建的毫秒數(從 1970 年開始)
- mzxid:
- znode 最后更新的事務 zxid
- mtime:
- znode 最后修改的毫秒數(從 1970 年開始)
- pZxid:
- znode 最后更新的子節點 zxid
- cversion:
- znode 子節點變化號,znode 子節點修改次數
- dataversion:
- znode 資料變化號
- aclVersion:
- znode 訪問控制串列的變化號
- ephemeralOwner:
- 如果是臨時節點,這個是 znode 擁有者的 session id,如果不是臨時節點則是 0,
- dataLength:
- znode 的資料長度
- numChildren:
- znode 子節點數量
- czxid:
3.2.3 節點型別 (持久/ 短暫/ 有序號/ 無序號)
-
節點型別
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aZC1haic-1630416591014)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210831203642276.png)]](https://img.uj5u.com/2021/09/01/2605820114110030.png)
- 1) 分別創建2 個普通節點 (永久節點 + 不帶序號)
create /sanguo "diaochan"注意:創建節點時,要賦值
- 2)獲得節點的值
get -s /sanguo-
3)創建帶序號的節點 (永久節點 + 帶序號)
- (1)先創建一個普通的根節點/sanguo/weiguo
create /sanguo/weiguo"caocao"- (2)創建帶序號的節點
create -s /sanguo/weiguo/zhangliao "zhangliao"如果原來沒有序號節點,序號從 0 開始依次遞增,如果原節點下已有 2 個節點,則再排序時從 2 開始,以此類推,
-
4) 創建短暫節點 (短暫節點 + 不帶序號 or 帶序號)
- (1)創建短暫的不帶序號的節點
create -e /sanguo/wuguo"zhouyu"- (2)創建短暫的帶序號的節點
create -e -s /sanguo/wuguo"zhouyu"- (3)在當前客戶端是能查看到的
ls /sanguo- (4)退出當前客戶端然后再重啟客戶端
quit- (5)再次查看根目錄下短暫節點已經洗掉
set /sanguo/weiguo "simayi"
3.2.4 監聽器原理
客戶端注冊監聽它關心的目錄節點,當目錄節點發生變化(資料改變、節點洗掉、子目錄節點增加洗掉)時,ZooKeeper 會通知客戶端,監聽機制保證 ZooKeeper 保存的任何的資料的任何改變都能快速的回應到監聽了該節點的應用程式,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-o1AjJ9ju-1630416591018)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210831203230403.png)]](https://img.uj5u.com/2021/09/01/2605820114110031.png)
-
1)節點的值變化監聽
- (1)在 192.168.109.103主機上注冊監聽/sanguo
節點資料變化
get -w /sanguo- (2)在 192.168.109.102主機上修改/sanguo 節點的資料
set /sanguo "xisi"- (3)觀察 192.168.109.103主機收到資料變化的監聽
WATCHER:: WatchedEvent state:SyncConnected type:NodeDataChanged path:/sanguo注意:在192.168.109.102再多次修改/sanguo的值,192.168.109.103上不會再收到監聽,因為注冊一次,
只能監聽一次,想再次監聽,需要再次注冊, - (1)在 192.168.109.103主機上注冊監聽/sanguo
-
2)節點的子節點變化監聽(路徑變化)
- (1)在 192.168.109.103主機上注冊監聽/sanguo 節點的
子節點變化
ls -w /sanguo- (2)在 192.168.109.102 主機/sanguo 節點上創建子節點
create /sanguo/jin "simayi"- (3)觀察 192.168.109.103主機收到子節點變化的監聽
WATCHER:: WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/sanguo注意:節點的路徑變化,也是
注冊一次,生效一次,想多次生效,就需要多次注冊, - (1)在 192.168.109.103主機上注冊監聽/sanguo 節點的
3.2.5 節點洗掉與查看
- 1) 洗掉節點
delete /sanguo/jin
- 2) 遞回洗掉節點
deleteall /sanguo/shuguo
- 3) 查看節點狀態
stat /sanguo
3.3 客戶端 API 操作
3.3.1 IDEA 環境
前提:保證 192.168.109.101、192.168.109.102、192.168.109.103服務器上 Zookeeper 集群服務端啟動,
-
1) 創建一個 工程: :zookeeper
-
2) 添加pom
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.7</version>
</dependency>
</dependencies>
- 3) 拷貝log4j.properties 檔案到專案根目錄
需要在專案的 src/main/resources 目錄下,新建一個檔案,命名為“log4j.properties”,在檔案中填入,
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c]- %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c]- %m%n
- 4 )創建包名com.achang.zk
- 5 )創建類名稱zkClient
3.3.2 創建 ZooKeeper 客戶端
// 注意:逗號前后不能有空格
private static String connectString = "192.168.109.101:2181,192.168.109.102:2181,192.168.109.103:2181";
private static int sessionTimeout = 2000;
private ZooKeeper zkClient = null;
@Before
public void init() throws Exception {
zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
// 收到事件通知后的回呼函式(用戶的業務邏輯)
System.out.println(watchedEvent.getType() + "--" + watchedEvent.getPath());
// 再次啟動監聽
try {
List<String> children = zkClient.getChildren("/", true);
for (String child : children) {
System.out.println(child);
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
3.3.3 創建子節點
// 創建子節點
@Test
public void create() throws Exception {
// 引數 1:要創建的節點的路徑; 引數 2:節點資料 ; 引數 3:節點權限 ;引數 4:節點的型別
String nodeCreated = zkClient.create("/achang","shuaige".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
}
測驗:在 192.168.109.101的 zk 客戶端上查看創建節點情況
[zk: localhost:2181(CONNECTED) 16] get -s /achang
shuaige
3.3.4 獲取 子節點 并 監聽 節點 變化
// 獲取子節點
@Test
public void getChildren() throws Exception {
List<String> children = zkClient.getChildren("/", true);
for (String child : children) {
System.out.println(child);
}
// 延時阻塞
Thread.sleep(Long.MAX_VALUE);
}
- (1)在 IDEA 控制臺上看到如下節點:
zookeeper
sanguo
achang
- (2)在 192.168.109.101的客戶端上創建再創建一個節點/achang1,觀察 IDEA 控制臺
create /achang1 "achang1"
- (3)在 192.168.109.101的客戶端上洗掉節點/achang1,觀察 IDEA 控制臺
delete /achang1
3.3.5 判斷 Znode 是否存在
// 判斷 znode 是否存在
@Test
public void exist() throws Exception {
Stat stat = zkClient.exists("/achang", false);
System.out.println(stat == null ? "not exist" : "exist");
}
3.4 客戶端向服務端寫資料流程
- 寫流程之寫入請求直接發送給Leader節點
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2qCCJzHU-1630416591020)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210831210400826.png)]](https://img.uj5u.com/2021/09/01/2605820114110032.png)
- 寫流程之寫入請求發送給follower節點
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PWNmxpY5-1630416591026)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210831210415286.png)]](https://img.uj5u.com/2021/09/01/2605820114110033.png)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296557.html
標籤:其他
