1. Zookeeper 基本使用
下載 zookeeper 鏡像
默認下載最新版本,指定版本可以在 zookeeper 後面添加 tag,如 zookeeper:latest
docker pull zookeeper
啓動 zookeeper 鏡像。
docker run --name first-zk -d zookeeper
這個命令會創建名爲 first-zk 的 zookeeper 容器,在後臺運行,並默認導出 2181 端口。
測試 zookeeper 容器
以下命令通過輸出日誌可以查看 zk 運行情況。
docker logs -f first-zk
客戶端連接 zk 服務器
1. 在已創建的 first-zk 容器中,執行 zkCli.sh:
docker exec -it first-zk zkCli.sh
2. 新建 zookeeper 容器作爲客戶端,並連接到 first-zk:
docker run -it --rm --link first-zk zookeeper zkCli.sh -server first-zk
這裏
--link first-zk
通過 docker 的 link 機制來訪問 first-zk 容器;
--rm
在容器退出後會自動刪除容器;
zkCli.sh -server first-zk
則啓動 zkCli.sh 命令,連接到 first-zk。
zkCli.sh 常用命令的使用,請參考這裏。
2. Zookeeper 集羣搭建
編寫 docker-compose.yml 文件
version: '2.2'
services:
zk1:
image: zookeeper
restart: always
container_name: zk1
ports:
- "2181:2181"
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888
zk2:
image: zookeeper
restart: always
container_name: zk2
ports:
- "2182:2181"
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888
zk3:
image: zookeeper
restart: always
container_name: zk3
ports:
- "2183:2181"
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888
在這個配置文件中,docker 運行了 3 個 zookeeper 鏡像,通過 ports
字段分別將本地的 2181, 2182, 2183 端口綁定到對應容器的 2181 端口上。
ZOO_MY_ID
和ZOO_SERVERS
是搭建 Zookeeper 集羣需要的兩個環境變量。
ZOO_MY_ID
標識服務的 id,爲 1-255 之間的整數,必須在集羣中唯一。
ZOO_SERVERS
是集羣中的主機列表。
在 docker-compose.yml
所在目錄下執行 COMPOSE_PROJECT_NAME=docker-zk-cluster docker-compose up
➜ docker-zk-cluster COMPOSE_PROJECT_NAME=docker-zk-cluster docker-compose up
Creating network "docker-zk-cluster_default" with the default driver
Creating zk2 ... done
Creating zk1 ... done
Creating zk3 ... done
Attaching to zk3, zk1, zk2
zk3 | ZooKeeper JMX enabled by default
zk1 | ZooKeeper JMX enabled by default
zk2 | ZooKeeper JMX enabled by default
zk2 | Using config: /conf/zoo.cfg
zk3 | Using config: /conf/zoo.cfg
zk1 | Using config: /conf/zoo.cfg
...
COMPOSE_PROJECT_NAME=docker-zk-cluster
設置該環境變量是爲當前的 compose 工程取的名字,與其他工程做區分。
啓動後,打開另一終端窗口,運行 COMPOSE_PROJECT_NAME=docker-zk-cluster docker-compose ps
,查看服務運行狀態
➜ COMPOSE_PROJECT_NAME=docker-zk-cluster docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------
zk1 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2181->2181/tcp,
2888/tcp, 3888/tcp
zk2 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2182->2181/tcp,
2888/tcp, 3888/tcp
zk3 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2183->2181/tcp,
2888/tcp, 3888/tcp
使用 Docker 命令行客戶端連接 ZK 集羣
docker run -it --rm --link zk1 --link zk2 --link zk3 --net docker-zk-cluster_default zookeeper zkCli.sh -server zk1:2181,zk2:2181,zk3:2181
Connecting to zk1:2181,zk2:2181,zk3:2181
--net docker-zk-cluster_default
其中docker-zk-cluster
是 compose 工程名,不作這個配置會導致docker: Error response from daemon: Cannot link to /zk1, as it does not belong to the default network.
異常。具體原因請看這裏。
查看集羣
通過 nc 命令連接到指定 Zookeeper 服務器,發送 stat 來查看狀態。
➜ ~ echo stat | nc localhost 2181
Zookeeper version: 3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 04:05 GMT
Clients:
/172.19.0.5:40210[1](queued=0,recved=31,sent=31)
/172.19.0.1:34682[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/2/76
Received: 32
Sent: 31
Connections: 2
Outstanding: 0
Zxid: 0x100000001
Mode: follower
Node count: 4
➜ ~ echo stat | nc localhost 2182
Zookeeper version: 3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 04:05 GMT
Clients:
/172.19.0.1:37312[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x100000001
Mode: follower
Node count: 4
➜ ~ echo stat | nc localhost 2183
Zookeeper version: 3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 04:05 GMT
Clients:
/172.19.0.1:54278[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x100000001
Mode: leader
Node count: 4
Proposal sizes last/min/max: 36/36/36
如上,我們發現 zk3(端口爲 2183)爲 leader,其他爲 follower。