注:本文使用docker for windows模拟构建zookeeper集群,在linux系统下,可使用同样的docker命令构建
1. 创建一个文件,名为:stack.yml,内容为:
version: '3.1'
services:
zoo1:
image: zookeeper
restart: always
hostname: zoo1
ports:
- 2181:2181
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
zoo2:
image: zookeeper
restart: always
hostname: zoo2
ports:
- 2182:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zoo3:2888:3888
zoo3:
image: zookeeper
restart: always
hostname: zoo3
ports:
- 2183:2181
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=0.0.0.0:2888:3888
![](https://img2020.cnblogs.com/blog/248637/202103/248637-20210313152312069-511390439.png)
执行命令构建:docker stack deploy -c stack.yml zookeeper
或者:docker-compose -f stack.yml up
创建完成后,发现发生错误,java.net.ConnectException: Connection refused
![](https://img2020.cnblogs.com/blog/248637/202103/248637-20210313152437313-1757154912.png)
![](https://img2020.cnblogs.com/blog/248637/202103/248637-20210313152444567-1460109239.png)
其实这三个容器已经创建好了,但是就是没有启动,我们输入命令单个逐个启动,就可以了
docker start zookeeper_zoo1_1
docker start zookeeper_zoo2_1
docker start zookeeper_zoo3_1
![](https://img2020.cnblogs.com/blog/248637/202103/248637-20210313155700747-1824674070.png)
2. 在三个节点上,依次执行命令zkServer.sh status(可以看到MODE,谁是leader,谁是follower)
![](https://img2020.cnblogs.com/blog/248637/202103/248637-20210313155715996-1817693500.png)
3. 集群测试
-
进入master,创建一个根节点
输入命令进入master:docker exec -it zookeeper_zoo3_1 zkCli.sh
![](https://img2020.cnblogs.com/blog/248637/202103/248637-20210313161602142-588746033.png)
创建一个根节点目录:create /project zookeeper_project
输入命令:get /project
![](https://img2020.cnblogs.com/blog/248637/202103/248637-20210313161613539-733889228.png)
在主机上创建成功
-
进入follower节点,查看相应目录
输入命令,进入zookeeper_zoo1_1:docker exec -it zookeeper_zoo1_1 zkCli.sh
输入命令:get /project
![](https://img2020.cnblogs.com/blog/248637/202103/248637-20210313161628533-736976807.png)
输入命令,进入zookeeper_zoo2_1:docker exec -it zookeeper_zoo2_1 zkCli.sh
输入命令:get /project
![](https://img2020.cnblogs.com/blog/248637/202103/248637-20210313161636454-1635750495.png)
都成功了,说明集群也成功了
4. Zookeeper高可用测试-从节点接管主节点为新的主节点
-
进入zookeeper_zoo3_1,查看状态为leader
命令:docker exec –it zookeeper_zoo3_1 bash
zkServer.sh status
![](https://img2020.cnblogs.com/blog/248637/202103/248637-20210313162906654-1091614310.png)
![](https://img2020.cnblogs.com/blog/248637/202103/248637-20210313162923477-754586353.png)
-
剩下的zoo1和zoo2都是follower节点
输入命令,关闭zoo3
Docker stop zookeeper_zoo3_1
![](https://img2020.cnblogs.com/blog/248637/202103/248637-20210313162939387-185016347.png)
关闭主节点后,我们再查看子节点的状态
![](https://img2020.cnblogs.com/blog/248637/202103/248637-20210313162949598-585865657.png)
发现zoo2变成了主节点,zoo1还是从节点
-
我们再打开zoo3节点,再查看三个节点的状态
Docker start zookeeper_zoo3_1
![](https://img2020.cnblogs.com/blog/248637/202103/248637-20210313163002901-1649025625.png)
我们发现zoo3和zoo1为从节点,zoo2变成了主节点,从此可以看出,zookeeper集群已经成功!