zookeeper集群需至少3个奇数节点并配置自定义docker网络zk-net,通过挂载宿主机目录实现配置与数据持久化,启动后验证角色与故障自动恢复能力。

明确集群最小规模与网络前提
ZooKeeper集群必须满足“奇数节点且不少于3个”才能实现容错和自动选举。单节点无法高可用,2节点存在脑裂风险,3节点是生产环境最低可行配置。Docker默认的bridge网络不支持跨容器服务发现,所以必须先创建自定义桥接网络,让zk节点能通过容器名互相解析:
- 执行 docker network create zk-net 创建专用网络
- 所有zookeeper容器都需用 --network zk-net 参数加入该网络
- 容器名(如 zk1、zk2、zk3)将作为其他节点的主机名直接使用
准备配置与数据持久化目录
避免容器重启后配置丢失或数据清空,需提前在宿主机创建结构化目录:
- 新建目录:mkdir -p /opt/zk/{zk1,zk2,zk3}/{data,logs,conf}
- 为每个节点写好 myid 文件:echo "1" > /opt/zk/zk1/data/myid(对应zk2、zk3分别写2、3)
- 为每个节点准备 zoo.cfg,内容包含全部节点信息,例如 zk1 的配置中要写:
server.1=zk1:2888:3888
server.2=zk2:2888:3888
server.3=zk3:2888:3888
启动三个ZK容器并验证状态
按顺序依次启动(推荐先启zk1,再zk2,最后zk3),确保选举过程稳定:
- zk1 启动命令:
docker run -d --name zk1 --network zk-net \
-p 2181:2181 -v /opt/zk/zk1/data:/data -v /opt/zk/zk1/logs:/logs \
-v /opt/zk/zk1/conf/zoo.cfg:/conf/zoo.cfg \
-e ZOO_MY_ID=1 zookeeper:3.8.1 - zk2 和 zk3 类似,仅替换 --name、-v 路径、ZOO_MY_ID 和对应 myid 值
- 启动后执行 docker logs -f zk2 观察是否出现 Mode: leader 或 Mode: follower
- 进入任一容器执行 zkCli.sh -server zk1:2181,再运行 stat 查看集群连接数与角色
模拟故障并确认自动恢复能力
高可用的核心是故障转移是否无感,可手动验证:
- 停掉当前 leader 容器:docker stop zk2
- 等待约10–20秒,观察 zk1 或 zk3 的日志是否出现新选举过程,并最终输出新的 leader 角色
- 用 zkCli 连接剩余节点,执行 ls / 确认数据可读写,会话未中断
- 重新启动 zk2:docker start zk2,它会自动以 follower 身份加入并同步数据











