win环境基于docker搭建zookeeper伪集群
创建路径:D:\Docker\zk-cluster
在此路径下创建配置文件:docker-compose.yml
version: '2'
networks:
zk-net:
name: zk-net
services:
zoo1:
image: zookeeper
restart: always
container_name: zoo1
ports:
- "2181:2181"
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2182 server.3=zoo3:2888:3888;2183
networks:
- zk-net
zoo2:
image: zookeeper
restart: always
container_name: zoo2
ports:
- "2182:2181"
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2182 server.3=zoo3:2888:3888;2183
networks:
- zk-net
zoo3:
image: zookeeper
restart: always
container_name: zoo3
ports:
- "2183:2181"
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2182 server.3=zoo3:2888:3888;2183
networks:
- zk-net
看一下各个参数的含义:
zoo1: #配置1号zk
image: zookeeper:latest #zk版本
restart: always
container_name: zoo1 #容器的名字
ports:
- "2181:2181" #将该容器的2181端口开放给物理机2181端口
environment:
ZOO_MY_ID: 1 #表示zk服务的id,它是1-255之间的整数,必须在集群中唯一
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2182 server.3=zoo3:2888:3888;2183 #zk集群的主机列表
其中 ZOO_SERVERS 一项配置较为复杂,所以我问了一下chatGPT:
这是 ZooKeeper 集群的配置信息,其中 server.1 表示该节点的 ID 号为 1。zoo1:2888:3888 表示该节点所在的服务器名称和端口号,其中 2888 是用于 follower 和 leader 连接的端口号,3888 是用于选举 leader 时的端口号。2181 是客户端连接的端口号,也就是 ZooKeeper 服务监听的端口号。因此,这个配置信息表示该节点的 ID 号为 1,它的地址为 zoo1:2888:3888,同时监听的端口号为 2181。
注意这里根据zookeeper版本不同,配置也有区别,3.4.x及以下版本并没有 ;2181 这个参数。
在该路径下打开终端
PS D:\Docker> cd .\zk-cluster\
使用该命令启动:
PS D:\Docker\zk-cluster> docker-compose -f .\docker-compose.yml up -d
然而报错了:
Top-level object must be a mapping
顺便看一下这个报错,错误原因是没保存···
保存这个文档,然后重新启动
PS D:\Docker\zk-cluster> docker-compose -f .\docker-compose.yml up -d
[+] Running 4/4
✔Network zk-cluster_default Created 0.8s
✔ Container zoo1 Started 3.3s
✔ Container zoo3 Started 3.3s
✔ Container zoo2 Started 3.3s
启动成功。
查看docker客户端的容器面板:

进入该容器:
PS D:\Docker\zk-cluster> docker exec -it zoo1 /bin/bash
root@9c3f8f26101c:/apache-zookeeper-3.8.1-bin# cd bin
root@9c3f8f26101c:/apache-zookeeper-3.8.1-bin/bin# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
root@9c3f8f26101c:/apache-zookeeper-3.8.1-bin/bin# exit
exit
PS D:\Docker\zk-cluster> docker exec -it zoo2 /bin/bash
root@204ef646b371:/apache-zookeeper-3.8.1-bin# cd bin
root@204ef646b371:/apache-zookeeper-3.8.1-bin/bin# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Client port found: 2182. Client address: localhost. Client SSL: false.
Mode: leader
可以看到zoo1是follower,zoo2是leader
简单的3节点zookeeper集群就搭建完毕。
在查找资料过程中,我发现不少的博客都另外配置了zoo.cfg这个文件,这当然不失为一种办法。但是就在本地部署伪集群来说,我无法认同在docker中使用这样的配置方法,这使得配置的过程复杂化了。当然在真正的zookeeper集群中,这并不是一个问题···
浙公网安备 33010602011771号