Docker Compose 部署 ZooKeeper 集群完整指南

Docker Compose 部署 ZooKeeper 集群完整指南

以下是使用 Docker Compose 部署三节点 ZooKeeper 集群的完整流程:

准备工作

  1. 安装 Docker 和 Docker Compose

    # Ubuntu 示例
    sudo apt update
    sudo apt install docker.io docker-compose
    sudo usermod -aG docker $USER  # 将当前用户加入docker组
    newgrp docker                  # 刷新组权限
    
  2. 创建工作目录

    mkdir zookeeper-cluster
    cd zookeeper-cluster
    

创建配置文件

创建 compose.yaml 文件

# zookeeper-cluster/compose.yaml
services:
  zoo1:
    image: zookeeper:3.9
    hostname: zoo1
    container_name: 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/logs:/datalog

  zoo2:
    image: zookeeper:3.9
    hostname: zoo2
    container_name: 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/logs:/datalog

  zoo3:
    image: zookeeper:3.9
    hostname: zoo3
    container_name: 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/logs:/datalog

创建数据目录结构

# 创建数据存储目录
mkdir -p data/zoo1/{data,logs}
mkdir -p data/zoo2/{data,logs}
mkdir -p data/zoo3/{data,logs}

# 创建每个节点的myid文件
echo 1 > data/zoo1/data/myid
echo 2 > data/zoo2/data/myid
echo 3 > data/zoo3/data/myid

启动 ZooKeeper 集群

# 启动所有服务
docker compose up -d

# 查看运行状态
docker compose ps

# 预期输出:
# NAME                COMMAND                  SERVICE             STATUS              PORTS
# zoo1                "/docker-entrypoint.…"   zoo1                running             0.0.0.0:2181->2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp
# zoo2                "/docker-entrypoint.…"   zoo2                running             0.0.0.0:2182->2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp
# zoo3                "/docker-entrypoint.…"   zoo3                running             0.0.0.0:2183->2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp

验证集群状态

检查节点日志

docker compose logs zoo1
docker compose logs zoo2
docker compose logs zoo3

# 在日志中寻找类似内容:
# [INFO] [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumPeer@915] - LEADING - LEADER ELECTION TOOK - 204 MS

连接到任意节点

# 连接到 zoo1
docker exec -it zoo1 zkCli.sh -server 127.0.0.1:2181

# 在 Zookeeper CLI 中运行:
[zk: 127.0.0.1:2181(CONNECTED) 0] stat
# 查看输出中的 Mode: leader 或 Mode: follower

[zk: 127.0.0.1:2181(CONNECTED) 1] quit

检查集群状态

# 使用四字命令检查集群状态
echo stat | nc localhost 2181 | grep Mode
echo stat | nc localhost 2182 | grep Mode
echo stat | nc localhost 2183 | grep Mode

# 预期输出(一个leader,两个follower):
# Mode: leader
# Mode: follower
# Mode: follower

管理命令

# 停止集群
docker compose down

# 重新启动集群
docker compose up -d

# 删除集群和数据(谨慎使用)
docker compose down -v

文件结构说明

zookeeper-cluster/
├── compose.yaml        # Docker Compose 配置文件
└── data/               # 数据存储目录
    ├── zoo1/           # 节点1数据
    │   ├── data/       # 包含 myid 文件
    │   └── logs/       # 事务日志
    ├── zoo2/           # 节点2数据
    │   ├── data/
    │   └── logs/
    └── zoo3/           # 节点3数据
        ├── data/
        └── logs/

关键注意事项

  1. myid 文件:每个节点必须在 /data 目录中有对应的 myid 文件,内容为节点ID(1,2,3)

  2. 端口映射

    • 客户端端口:2181, 2182, 2183 映射到三个节点的 2181
    • 内部通信端口(2888/3888)不需要暴露,容器间通过 Docker 网络通信
  3. 服务发现

    • 集群节点通过 hostname(zoo1, zoo2, zoo3)互相发现
    • Docker Compose 会自动创建专用网络
  4. 持久化存储

    • 数据存储在本地 data/ 目录中
    • 容器重启后数据不会丢失
  5. 版本兼容性

    • 使用官方 ZooKeeper 3.9 镜像
    • 支持 Docker Compose v2.0+

现在三节点 ZooKeeper 集群已经部署完成!可以使用客户端通过 localhost:2181, 2182 或 2183 连接集群。

### 如何使用 Docker Compose 部署多节点 Zookeeper 集群 以下是通过 `docker-compose` 设置和部署多节点 Zookeeper 集群的详细说明: #### 1. 创建项目目录结构 首先,创建一个用于存储配置文件的工作目录。例如: ```bash mkdir zookeeper-cluster && cd zookeeper-cluster ``` #### 2. 编写 `docker-compose.yml` 文件 在工作目录下创建名为 `docker-compose.yml` 的文件,并编辑其内容如下所示。 ```yaml version: '3' services: zoo1: image: zookeeper:latest container_name: zookeeper_1 restart: always ports: - "2181:2181" environment: ZOO_MY_ID: 1 ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181 volumes: - ./data/zoo1/data:/data - ./data/zoo1/datalog:/datalog zoo2: image: zookeeper:latest container_name: zookeeper_2 restart: always ports: - "2182:2181" environment: ZOO_MY_ID: 2 ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181 volumes: - ./data/zoo2/data:/data - ./data/zoo2/datalog:/datalog zoo3: image: zookeeper:latest container_name: zookeeper_3 restart: always ports: - "2183:2181" environment: ZOO_MY_ID: 3 ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181 volumes: - ./data/zoo3/data:/data - ./data/zoo3/datalog:/datalog ``` 此配置定义了一个三节点的 Zookeeper 集群[^1]。每个服务代表一个独立的 Zookeeper 实例,分别映射到不同的主机端口(如 `2181`, `2182`, 和 `2183`)。环境变量 `ZOO_MY_ID` 定义了当前实例的身份 ID,而 `ZOO_SERVERS` 列出了集群中的所有成员及其通信地址[^2]。 #### 3. 准备数据目录 为了持久化存储,在本地磁盘上准备相应的数据目录: ```bash mkdir -p data/zoo{1..3}/{data,datalog} ``` #### 4. 启动集群 运行以下命令来启动 Zookeeper 集群: ```bash docker-compose up -d ``` 这会以后台模式启动所有的容器[^3]。 #### 5. 验证集群状态 可以通过以下方式验证集群是否正常运行: - 查看正在运行的容器列表: ```bash docker ps ``` 确认三个 Zookeeper 容器均已成功启动[^4]。 - 使用 `zkCli.sh` 工具连接至任意一个 Zookeeper 节点并执行测试操作: ```bash docker exec -it zookeeper_1 zkCli.sh -server localhost:2181 ls / ``` 如果返回 `/zookeeper` 或其他默认路径,则表示集群已正确初始化。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值