在CentOS 7上使用Docker安装Zookeeper的完整指南
一、准备工作
1.1 系统要求
- CentOS 7系统
- 已安装Docker
- 至少2GB可用内存(生产环境建议更多)
- 开放2181(客户端连接)、2888(节点间通信)、3888(Leader选举)端口
1.2 安装Docker
如果尚未安装Docker,请先执行以下命令:- # 卸载旧版本Docker(如有)
- sudo yum remove docker \
- docker-client \
- docker-client-latest \
- docker-common \
- docker-latest \
- docker-latest-logrotate \
- docker-logrotate \
- docker-engine
- # 安装必要工具
- sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- # 添加Docker仓库
- sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- # 安装Docker CE
- sudo yum install -y docker-ce docker-ce-cli containerd.io
- # 启动Docker并设置开机自启
- sudo systemctl start docker
- sudo systemctl enable docker
- # 验证安装
- sudo docker --version
复制代码 二、单机模式安装Zookeeper
2.1 拉取官方镜像
- sudo docker pull zookeeper:3.7.0
复制代码 2.2 运行Zookeeper容器
- sudo docker run -d \
- --name zookeeper \
- -p 2181:2181 \
- -e ZOO_MY_ID=1 \
- -e ALLOW_ANONYMOUS_LOGIN=yes \
- zookeeper:3.7.0
复制代码 参数说明:
- -d: 后台运行容器
- --name: 容器名称
- -p 2181:2181: 映射容器2181端口到主机2181端口
- -e ZOO_MY_ID=1: 设置Zookeeper节点ID(单机模式设置为1)
- -e ALLOW_ANONYMOUS_LOGIN=yes: 允许匿名登录(仅测试环境使用)
2.3 验证安装
- # 查看容器状态
- sudo docker ps -a | grep zookeeper
- # 进入容器执行zkCli.sh
- sudo docker exec -it zookeeper zkCli.sh
- # 在zkCli中执行简单命令验证
- [zk: localhost:2181(CONNECTED) 0] ls /
复制代码 三、集群模式安装Zookeeper
3.1 创建Docker网络
- sudo docker network create --subnet=172.18.0.0/16 zk-net
复制代码 3.2 创建数据目录
- mkdir -p /data/zookeeper/{node1,node2,node3}/{data,datalog}
复制代码 3.3 启动三个Zookeeper节点
节点1:- sudo docker run -d \
- --name zk-node1 \
- --net zk-net \
- --ip 172.18.0.2 \
- -p 2181:2181 \
- -p 2888:2888 \
- -p 3888:3888 \
- -e ZOO_MY_ID=1 \
- -e ZOO_SERVERS="server.1=0.0.0.0:2888:3888;2181 server.2=zk-node2:2888:3888;2181 server.3=zk-node3:2888:3888;2181" \
- -v /data/zookeeper/node1/data:/data \
- -v /data/zookeeper/node1/datalog:/datalog \
- zookeeper:3.7.0
复制代码 节点2:- sudo docker run -d \
- --name zk-node2 \
- --net zk-net \
- --ip 172.18.0.3 \
- -p 2182:2181 \
- -e ZOO_MY_ID=2 \
- -e ZOO_SERVERS="server.1=zk-node1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zk-node3:2888:3888;2181" \
- -v /data/zookeeper/node2/data:/data \
- -v /data/zookeeper/node2/datalog:/datalog \
- zookeeper:3.7.0
复制代码 节点3:- sudo docker run -d \
- --name zk-node3 \
- --net zk-net \
- --ip 172.18.0.4 \
- -p 2183:2181 \
- -e ZOO_MY_ID=3 \
- -e ZOO_SERVERS="server.1=zk-node1:2888:3888;2181 server.2=zk-node2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181" \
- -v /data/zookeeper/node3/data:/data \
- -v /data/zookeeper/node3/datalog:/datalog \
- zookeeper:3.7.0
复制代码 3.4 验证集群状态
- # 查看任意节点的日志
- sudo docker logs zk-node1
- # 应该能看到类似下面的输出,表示集群已形成
- # [INFO] [Time:2023-01-01...] [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181] LEADING - LEADER ELECTION TOOK - 200 MS
- # 进入任一节点客户端
- sudo docker exec -it zk-node1 zkCli.sh
- # 查看集群状态
- [zk: localhost:2181(CONNECTED) 0] stat
复制代码 四、使用Docker Compose部署Zookeeper集群
4.1 安装Docker Compose
- sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- sudo chmod +x /usr/local/bin/docker-compose
- docker-compose --version
复制代码 4.2 创建docker-compose.yml文件
- version: '3.8'
- services:
- zoo1:
- image: zookeeper:3.7.0
- hostname: zoo1
- ports:
- - 2181:2181
- environment:
- ZOO_MY_ID: 1
- ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
- volumes:
- - ./data/zoo1/data:/data
- - ./data/zoo1/datalog:/datalog
- networks:
- zk-net:
- ipv4_address: 172.18.0.2
- zoo2:
- image: zookeeper:3.7.0
- hostname: zoo2
- ports:
- - 2182:2181
- environment:
- ZOO_MY_ID: 2
- ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181
- volumes:
- - ./data/zoo2/data:/data
- - ./data/zoo2/datalog:/datalog
- networks:
- zk-net:
- ipv4_address: 172.18.0.3
- zoo3:
- image: zookeeper:3.7.0
- 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=0.0.0.0:2888:3888;2181
- volumes:
- - ./data/zoo3/data:/data
- - ./data/zoo3/datalog:/datalog
- networks:
- zk-net:
- ipv4_address: 172.18.0.4
- networks:
- zk-net:
- driver: bridge
- ipam:
- driver: default
- config:
- - subnet: 172.18.0.0/16
复制代码 4.3 启动集群
- # 创建数据目录
- mkdir -p data/{zoo1,zoo2,zoo3}/{data,datalog}
- # 启动服务
- docker-compose up -d
- # 查看服务状态
- docker-compose ps
- # 查看集群日志
- docker-compose logs -f zoo1
复制代码 五、Zookeeper容器配置详解
5.1 常用环境变量
变量名说明默认值ZOO_MY_ID节点ID,集群中必须唯一无ZOO_SERVERS集群服务器列表无ZOO_TICK_TIME基本时间单位(毫秒)2000ZOO_INIT_LIMIT初始化连接时能容忍的最长心跳间隔10ZOO_SYNC_LIMIT发送请求和接收响应能容忍的最长心跳间隔5ZOO_MAX_CLIENT_CNXNS每个IP最大连接数60ZOO_STANDALONE_ENABLED是否启用独立模式trueZOO_AUTOPURGE_PURGEINTERVAL自动清理间隔(小时)0(禁用)ZOO_AUTOPURGE_SNAPRETAINCOUNT保留的快照数量35.2 持久化数据目录
Zookeeper容器中有两个重要的数据目录:
- /data: 存储数据快照
- /datalog: 存储事务日志
建议通过-v参数将这两个目录挂载到宿主机,防止容器重启后数据丢失。
六、常见问题解决
6.1 容器启动失败
问题现象:容器启动后立即退出
解决方法:- # 查看容器日志
- docker logs <container_id>
- # 常见原因:
- # 1. ZOO_MY_ID未设置或设置错误
- # 2. 数据目录权限问题
- # 3. 端口冲突
复制代码 6.2 集群无法形成
问题现象:节点日志显示"Looking for leader"
解决方法:
- 检查所有节点的ZOO_SERVERS配置是否正确
- 确保所有节点的网络互通
- 检查防火墙设置,确保2888和3888端口开放
- 清除旧数据目录重新启动
6.3 客户端连接问题
问题现象:客户端无法连接Zookeeper服务
解决方法:
- 检查容器是否正常运行:docker ps
- 检查端口映射是否正确:docker port
- 检查防火墙设置:sudo firewall-cmd --list-ports
- 测试容器内连接:docker exec -it zookeeper zkCli.sh
七、生产环境建议
- 资源限制:为Zookeeper容器设置适当的资源限制
- docker run -d \
- --name zookeeper \
- --memory 2g \
- --cpus 1 \
- ...
复制代码 - 监控:配置Zookeeper监控
- 使用四字命令:echo mntr | nc localhost 2181
- 使用Prometheus + Grafana监控
- 备份:定期备份数据目录
- tar czvf zk-backup-$(date +%Y%m%d).tar.gz /data/zookeeper
复制代码 - 日志管理:配置日志轮转
- docker run -d \
- --name zookeeper \
- --log-opt max-size=10m \
- --log-opt max-file=3 \
- ...
复制代码 八、总结
通过Docker在CentOS 7上部署Zookeeper可以大大简化安装和配置过程。本文介绍了单机模式和集群模式的部署方法,以及使用Docker Compose管理集群的最佳实践。对于生产环境,请务必考虑持久化存储、资源限制、监控和备份等关键因素。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |