簡介
ZooKeeper 是一個開源的分布式協調服務,由 Apache 軟件基金會開發和維護。它主要用于管理和協調分布式系統中的多個節點,以解決分布式環境下的常見問題,如配置管理、服務發現、分布式鎖等。ZooKeeper 提供了一種可靠的機制,使得分布式系統中的節點可以高效地協作,確保數據的一致性和服務的高可用性。
核心功能
-
命名服務
-
為分布式系統中的節點提供唯一的名稱,方便節點之間的識別和訪問。這類似于 DNS 在互聯網中的作用,但更專注于分布式系統內部的節點命名。
-
-
分布式鎖
-
實現分布式環境下的鎖機制,確保在多節點訪問共享資源時,資源的一致性和完整性。ZooKeeper 通過其內部的順序節點創建和監聽機制,可以有效地實現分布式鎖。
-
-
配置管理
-
集中管理分布式系統中的配置信息。當配置信息發生變化時,ZooKeeper 可以及時通知各節點,確保所有節點使用最新的配置。
-
-
服務發現
-
動態發現系統中的可用服務實例。服務啟動后可在 ZooKeeper 中注冊,其他服務可通過 ZooKeeper 查詢可用的服務實例列表。
-
-
隊列管理
-
實現分布式隊列,包括普通隊列(FIFO)和優先隊列,用于任務調度和消息傳遞等場景。
-
搭建步驟
部署Docker
略
部署docker-compose
略
單實例部署(簡單)
docker run --name some-zookeeper --restart always -d zookeeper
單實例部署(使用自定義配置文件)
1、創建zookeeper管理用戶和工作目錄
useradd zookeeper
su - zookeeper
mkdir -p zookeeper/{data,conf,logs}
2、自定義配置文件zoo.cfg(舉例)
cat > zookeeper/conf/zoo.cfg <<EOF
dataDir=/data
clientPort=2181
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
standaloneEnabled=true
admin.enableServer=true
server.1=localhost:2888:3888;2181
EOF
3、啟動zookeeper單實例
docker run --name some-zookeeper --restart always \-e ZOO_LOG4J_PROP="INFO,ROLLINGFILE" \--user $(id -u):$(id -g) \-v $(pwd)/zookeeper/data:/data ?\-v $(pwd)/zookeeper/conf:/conf \-v $(pwd)/zookeeper/logs:/datalog ?\-d zookeeper
驗證Zookeeper狀態
docker exec -it some-zookeeper /bin/bash zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: standalone
進入控制臺
docker run -it --rm --link some-zookeeper:zookeeper zookeeper zkCli.sh -server zookeeper
創建結點
使用以下命令創建持久結點:
create /test '測試'
查看結點
查看結點存儲的值及其狀態:
get /test
查看結點狀態:
stat /test
修改結點
修改結點數據:
set /test '新數據'
刪除結點
刪除結點:
delete /test
遞歸刪除結點及其所有子結點:
deleteall /test
使用docker-compose部署集群
啟動集群前
1、最好創建zookeeper用戶。
2、需要提前準備的配置提前準備好,通過掛載卷的方式掛載給容器。
3、也可以通過環境變量的方式修改zookeeper啟動項
(注:如上操作均需要定義到docker-compose.yaml中,下面僅僅是舉例,只能在測試開發環境下使用。)
1、定義docker-compose.yaml(舉例)
注:如果docker-compose啟動集群時,無法自動創建network,或者就要使用已有的network,注意下面的紅色部分。
services:
? zoo1:
? ? image: zookeeper
? ? restart: always
? ? hostname: zoo1
? ? ports:
? ? ? - 2181:2181
? ? environment:
? ? ? ZOO_MY_ID: 1
? ? ? ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
? ? networks:
? ? ? - zookeeper-net? zoo2:
? ? image: zookeeper
? ? restart: always
? ? hostname: zoo2
? ? ports:
? ? ? - 2182:2181
? ? environment:
? ? ? ZOO_MY_ID: 2
? ? ? ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
? ? networks:
? ? ? - zookeeper-net? zoo3:
? ? image: zookeeper
? ? restart: always
? ? hostname: zoo3
? ? ports:
? ? ? - 2183:2181
? ? environment:
? ? ? ZOO_MY_ID: 3
? ? ? ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
? ? networks:
? ? ? - zookeeper-netnetworks:
? zookeeper-net:
? ? external: true
2、啟動zookeeper集群
docker-compose up -d
3、查看zookeeper集群狀態