centos7-利用docker-compose搭建zookeeper集群
注意事项
-
网上很多关于通过docker-compose搭建zookeeper的集群是伪集群,即一台机器上部署多个zookeeper实例,也有些集群操作不适合在实际生产环境部署,例如每台集群服务器上同时部署多个zookeeper实例。另外网上很多关于多机器通过docker-compose搭建zookeeper集群的文章存在诸多问题,例如漏写某些步骤、配置参数过于简单、配置信息有误等问题,另外配置方式五花八门,各有细节上的不同。
-
docker下载时需要配置镜像加速器或者连外网,否则下载会很慢或者报错。
-
关于zookeeper环境变量配置,网上大体分为以下几种
一是通过创建zoo.cfg文件进行配置,如果不采用docker-compose部署zookeeper集群的话,这种方式尤为常见,特别是复杂配置。
二是在yml文件中通过environment变量进行配置,因为有些官方镜像是支持通过环境变量配置核心参数(例如集群节点信息,超时配置等),无需手动挂载配置文件。
三是即有environment环境变量配置又有zoo.cfg文件配置,二者虽然可以共存,但若同时配置了某个参数,环境变量的优先级更高。
- 关于网络配置这块是重点,查看zookeeper容器状态时经常出现各种问题,无法显示1个leader,2个floor信息,出现最多的是以下信息

通过docker compose logs zoo1命令查看时会显示以下信息
“Cannot open channel to 3 at election address zoo3/<unresolved>:3888”
造成这个错误的原因有很多种,我本地产生的原因大概率是网络配置有问题,网上大部分配置都是通过bridge模式进行搭建。
bridge模式:
Docker 的 Bridge 网络是默认的网络模式,它为每个容器分配一个虚拟网络接口,并通过 NAT(网络地址转换)与宿主机通信。
在 Bridge 模式下,容器之间的通信仅限于同一宿主机上的容器。不同宿主机上的容器无法直接通过 IP 地址通信,因为它们的网络栈是隔离的。
Zookeeper 集群需要节点之间能够直接通信,如果使用 Bridge 模式,Zookeeper 节点无法发现其他虚拟机上的节点,导致集群无法正常工作。
services:
zookeeper:
networks:
- zookeeper-net
networks:
zookeeper-net:
driver: bridge
network_mode: host模式
最终找到解决方案,即通过配置 network_mode: host 实现跨主机通信,当使用该模式时,容器与宿主机共享同一个网络命名空间,容器内的服务直接绑定到宿主机的网络接口,使用宿主机的 IP 地址和端口,使用该模式避免了复杂的跨主机网络配置
特别要注意的是如果采用了 network_mode: host 此方式,则在yml文件中不能再配置ports配置项,若配置有可能在构建的时候报错或者即使构建成功也不会生效,因为 network_mode: host 会绕过 Docker 的端口映射机制。容器内的服务会直接使用宿主机的端口。另外使用该模式也无法通过ports配置项实现端口映射,例如将2181映射成其它端口,因为Docker 的端口映射功能(ports)依赖于 Docker 的虚拟网络栈,而 network_mode: host 绕过了这一机制,因此 ports 配置会被忽略。
如果不想用此模式又想要实现端口映射,也有其它方式,不过暂时未实际操作过。
- yml文件名称最好是叫docker-compose.yml,因为这是标准命名,便于管理,若采用其它自定义名称,在执行docker compose相关命令时需要加上额外参数
例如构建zookeeper容器
#若文件名是自定义名称则需要加上-f参数并且后面加上文件自定义名称
docker-compose -f xx.yml up -d
例如显示服务容器信息时,若yml文件不是标准命名,使用以下命令时会报错
docker compose ps
集群配置信息
| IP | 实例名 |
|---|---|
| 192.168.12.136 | zoo1 |
| 192.168.12.137 | zoo2 |
| 192.168.12.138 | zoo3 |
安装JDK
集群服务器按照以下方式安装jdk
https://www.yuque.com/yichangmeng-jbcb7/mml5iw/xdqpek9uh5dx2k35
安装Docker和Docker-Compose
集群服务器按照以下方式安装docker和docker-compose
- Docker
- Docker-Compose
下载Zookeeper镜像
在集群服务器上通过docker安装zookeeper。
docker pull zookeeper

防火墙设置
在每台集群服务器上根据条件选择执行对应的命令。这里我选择不关闭防火墙而是开放端口,因为在生产环境下一般不会关闭防火墙。
- 若集群环境是内部测试环境,且对安全性要求不高,可以选择关闭防火墙
#停止防火墙服务
systemctl stop firewalld
#禁用防火墙开机自启动
systemctl disable firewalld
#查看防火墙状态,若显示为inactive(dead)则表示防火墙已关闭
systemctl status firewalld
- 若出于安全考虑不能关闭防火墙,则需要开放zookeeper所需的端口,主要有以下3个
2181:客户端连接的端口。
2888:节点间数据同步端口。
3888:选举端口
#开放端口
firewall-cmd --zone=public --add-port=2181/tcp --permanent
firewall-cmd --zone=public --add-port=2888/tcp --permanent
firewall-cmd --zone=public --add-port=3888/tcp --permanent
#重新加载防火墙规则
firewall-cmd --reload
#查看已开放的端口
firewall-cmd --zone=public --list-ports

配置主机名映射
zookeeper节点之间通过主机名通信,为了让集群中的每台服务器能够识别其他服务器的主机名,需要在每台集群服务器的/etc/hosts文件中添加以下内容,将IP地址与实例名进行映射
echo "192.168.12.136 zoo1" >> /etc/hosts
echo "192.168.12.137 zoo2" >> /etc/hosts
echo "192.168.12.138 zoo3" >> /etc/hosts

创建工作目录和配置文件
创建工作目录
在每台集群服务器上创建一个用于存放Zookeeper数据和配置的目录。
mkdir -p /opt/zookeeper/{data,conf,dockerfile}
创建zoo.cfg文件
在每台集群服务器上的 /opt/zookeeper/conf 目录下创建 zoo.cfg文件,并根据节点编号进行相应配置
cat << EOF > /opt/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data
dataLogDir=/data/log
clientPort=2181
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
server.0=zoo1:2888:3888
server.1=zoo2:2888:3888
server.2=zoo3:2888:3888
EOF

创建myid文件
在每台集群服务器上的 /opt/zookeeper/data 目录下创建 myid 文件,分别写入对应的节点编号,分别对应配置文件中的id,即server0、server1、server2
zoo1(192.168.12.136)
echo "0" > /opt/zookeeper/data/myid
zoo2(192.168.12.137)
echo "1" > /opt/zookeeper/data/myid
zoo3(192.168.12.138)
echo "2" > /opt/zookeeper/data/myid
创建docker-compose.yml文件
在每台集群服务器上的 /opt/zookeeper/dockerfile目录下创建 docker-compose.yml文件
cd /opt/zookeeper/dockerfile
vi docker-compose.yml
192.168.12.136
services:
zookeeper_zoo1:
image: zookeeper
container_name: zookeeper_zoo1
network_mode: host
restart: always
volumes:
- /opt/zookeeper/conf:/conf
- /opt/zookeeper/data:/data
192.168.12.137
services:
zookeeper_zoo2:
image: zookeeper
container_name: zookeeper_zoo2
network_mode: host
restart: always
volumes:
- /opt/zookeeper/conf:/conf
- /opt/zookeeper/data:/data
192.168.12.138
services:
zookeeper_zoo3:
image: zookeeper
container_name: zookeeper_zoo3
network_mode: host
restart: always
volumes:
- /opt/zookeeper/conf:/conf
- /opt/zookeeper/data:/data
构建Zookeeper容器
在每台集群服务器上执行以下命令启动Zookeeper容器
docker-compose up -d

启动Zookeeper容器
docker-compose start
验证集群状态
在每台集群服务器上执行以下命令验证Zookeeper节点状态
docker exec -it zookeeper_zoo1 bin/zkServer.sh status
docker exec -it zookeeper_zoo2 bin/zkServer.sh status
docker exec -it zookeeper_zoo3 bin/zkServer.sh status
若出现一个节点显示为Mode:leader,其它两个节点显示Mode:follower,则表示Zookeeper 集群启动成功且正常运行。



显示服务容器信息
显示当前项目中所有服务容器的运行状态、端口映射等信息,观察STATUS列对于的状态是否是Up。
docker compose ps




浙公网安备 33010602011771号