Zookeeper 是什么?
Zookeeper 為分布式應用提供高效且可靠的分布式協調服務,提供了諸如統一命名服務、配置管理和分布式鎖等分布式的基礎服務。在解決分布式數據一致性方面,ZooKeeper 并沒有直接采用 Paxos 算法,而是采用了名為 ZAB 的一致性協議
ZooKeeper 主要用來解決分布式集群中應用系統的一致性問題
,它能提供基于類似于文件系統的目錄節點樹方式的數據存儲。但是 ZooKeeper 并不是用來專門存儲數據的,它的作用主要是用來維護和監控存儲數據的狀態變化。通過監控這些數據狀態的變化,從而可以達到基于數據的集群管理
很多大名鼎鼎的框架都基于 ZooKeeper 來實現分布式高可用,如:Dubbo、Kafka 等
Zookeeper 一個最常用的使用場景就是用于擔任服務生產者和服務消費者的注冊中心
Zookeeper 數據結構
Zookeeper 數據結構為一棵樹,每一個節點成為 ZNode,每個 ZNode 默認存儲 1MB 數據
Zookeeper 應用場景
統一命名服務
對多個相同服務進行統一命名,可以負載均衡以及提高可用性
統一配置管理
在分布式環境下,保證所有節點配置信息一致,并保證在修改配置文件之后,快速可以同步到各個節點中
實現:在 Zookeeper 中維護一份配置文件,客戶端監聽配置文件,保證配置文件修改后可以同步到最新配置
Zookeeper 安裝
https://zookeeper.apache.org/
去官網下載 3.5.7-bin-tar.gz
單機
- 安裝 jdk
- 下載 bin.tar.gz 包
- 解壓
tar -zxvf xxxbin-tar.gz -C /解壓目錄
修改 zookeeper 配置文件 ./conf/zoo.cfg
cd conf
# 將示例配置文件復制一份
cp zoo_sample.cfg zoo.cfg
# 修改配置文件
vi zoo.cfg
# 修改 dataDir 數據存儲目錄,可以在安裝的zookeeper目錄下創建 zkData 目錄,將數據存儲目錄設置為 zkData 目錄
dataDir= # 啟動服務
./bin/zkServer.sh start
# 查看是否啟動
jps -l# 啟動客戶端
./bin/zkCli.sh# 查看 zookeeper 狀態
bin/zkServer.sh status
配置文件解析
Zookeeper 配置文件內容如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper
clientPort=2181
-
tickTime
通信心跳時間,單位毫秒,是 Zookeeper 服務器與客戶端心跳事件
-
initLimit
LF 初始通信時間,Leader 和 Follower 初始連接時能容忍的最多心跳數
即如果 initLimit=2,tickTime=2000,那么 Leader 和 Follower 初始連接時間最大不能超過
2 * 2000ms = 2秒
-
syncLimit
LF 同步通信時限
Leader 和 Follower 之間通信如果超過
syncLimit * tickTime
,則 Leader 認為 Follower 掛掉,從服務器列表中刪除 Follower -
dataDir:保存 Zookeeper 中的數據
默認 tmp 目錄,Limux 中 tmp 目錄定期刪除,一般不用默認目錄
Zookeeper 集群安裝
在 3 臺服務器上部署 zookeeper,假設服務器分別為:zk1、zk2、zk3
部署流程為:
1、解壓安裝
解壓安裝到 /develop/
目錄下,并且改名為 zookeeper
,最終 zookeeper 目錄為 /develop/zookeeper/
2、配置服務器編號
單臺服務器編號配置
# 在 /develop/zookeeper/ 目錄下創建目錄 zkData,用于存放數據
cd /develop/zookeeper
mkdir zkData# 在 zkData 目錄下創建 myid 文件
vi myid# myid 文件內容,作為身份標識
1
將上述的 zookeeper 目錄拷貝到其他兩臺服務器,并且修改 myid
內容分別為 2、3
3、配置 zoo.cfg 文件
# 在每一臺服務器將 zoo_sample.cfg 命名為 zoo.cfg
mv zoo_sample.cfg zoo.cfg
vim zoo_cfg# 修改數據存儲路徑
dataDir=/develop/zookeeper/zkData
# 增加集群配置
server.1=ip:2888:3888
server.2=ip:2888:3888
server.3=ip:2888:3888
上邊集群配置參數解釋:
server.A=B:C:D
A 表示為服務器的 myid
B 表示服務器 ip
C 表示服務器 Follower 和集群中的 Leader 服務器交換信息的端口
D 表示集群中 Leader 如果掛了,需要用來選舉的通信端口
4、啟動集群
在每臺服務器中進行啟動
zkServer.sh start
可以使用命令 zkServer.sh status
查看啟動狀態,當集群超過半數節點啟動后,狀態才為正常(如果不超過半數啟動,無法選舉 Leader)