centos7-利用docker-compose搭建zookeeper集群

注意事项

  1. 网上很多关于通过docker-compose搭建zookeeper的集群是伪集群,即一台机器上部署多个zookeeper实例,也有些集群操作不适合在实际生产环境部署,例如每台集群服务器上同时部署多个zookeeper实例。另外网上很多关于多机器通过docker-compose搭建zookeeper集群的文章存在诸多问题,例如漏写某些步骤、配置参数过于简单、配置信息有误等问题,另外配置方式五花八门,各有细节上的不同。

  2. docker下载时需要配置镜像加速器或者连外网,否则下载会很慢或者报错。

  3. 关于zookeeper环境变量配置,网上大体分为以下几种

一是通过创建zoo.cfg文件进行配置,如果不采用docker-compose部署zookeeper集群的话,这种方式尤为常见,特别是复杂配置。

二是在yml文件中通过environment变量进行配置,因为有些官方镜像是支持通过环境变量配置核心参数(例如集群节点信息,超时配置等),无需手动挂载配置文件。

三是即有environment环境变量配置又有zoo.cfg文件配置,二者虽然可以共存,但若同时配置了某个参数,环境变量的优先级更高。

  1. 关于网络配置这块是重点,查看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 配置会被忽略。

如果不想用此模式又想要实现端口映射,也有其它方式,不过暂时未实际操作过。

  1. 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

centos7安装jdk8

安装Docker和Docker-Compose

集群服务器按照以下方式安装docker和docker-compose

  1. Docker

centos系统搭建K8s集群

  1. Docker-Compose

centos7+docker dock-compose使用

下载Zookeeper镜像

在集群服务器上通过docker安装zookeeper。

docker pull zookeeper

防火墙设置

在每台集群服务器上根据条件选择执行对应的命令。这里我选择不关闭防火墙而是开放端口,因为在生产环境下一般不会关闭防火墙。

  1. 若集群环境是内部测试环境,且对安全性要求不高,可以选择关闭防火墙
#停止防火墙服务
systemctl stop firewalld

#禁用防火墙开机自启动
systemctl disable firewalld

#查看防火墙状态,若显示为inactive(dead)则表示防火墙已关闭
systemctl status firewalld
  1. 若出于安全考虑不能关闭防火墙,则需要开放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

posted @ 2025-06-03 15:46  相遇就是有缘  阅读(51)  评论(0)    收藏  举报