拉取 zookeeper 镜像

docker pull zookeeper:3.8

编辑对应的 zookeeper.yml 文件,配置如下:

version: '3.8'
services:
  # 节点1:Server-01
  Server-01:
    container_name: Server-01
    image: zookeeper:3.8
    ports:
      - "2181:2181"  # 客户端连接端口
    environment:
      ZOO_MY_ID: 1  # 节点唯一ID
      # 服务器列表格式:server.id=host:peerPort:leaderElectionPort:clientPort(补充clientPort支持重配置)
      ZOO_SERVERS: server.1=Server-01:2888:3888;2181 server.2=Server-02:2888:3888;2181 server.3=Server-03:2888:3888;2181
    volumes:
      - ./Cluster-01/Server-01/data:/data         # 数据持久化目录
      - ./Cluster-01/Server-01/datalog:/datalog   # 日志持久化目录
    networks:
      netzookeeper:
        ipv4_address: 172.24.0.11

  # 节点2:Server-02
  Server-02:
    container_name: Server-02
    image: zookeeper:3.8
    ports:
      - "2182:2181"
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=Server-01:2888:3888;2181 server.2=Server-02:2888:3888;2181 server.3=Server-03:2888:3888;2181
    volumes:
      - ./Cluster-01/Server-02/data:/data         # 数据持久化目录
      - ./Cluster-01/Server-02/datalog:/datalog   # 日志持久化目录
    networks:
      netzookeeper:
        ipv4_address: 172.24.0.12

  # 节点3:Server-03
  Server-03:
    container_name: Server-03
    image: zookeeper:3.8
    ports:
      - "2183:2181"
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=Server-01:2888:3888;2181 server.2=Server-02:2888:3888;2181 server.3=Server-03:2888:3888;2181
    volumes:
      - ./Cluster-01/Server-03/data:/data
      - ./Cluster-01/Server-03/datalog:/datalog
    networks:
      netzookeeper:
        ipv4_address: 172.24.0.13

networks:
  netzookeeper:
    name: netzookeeper
    driver: bridge  # 自定义桥接网络,确保节点互通
    ipam:
      driver: default
      config:
        - subnet: 172.24.0.0/25   # 定义网络的子网范围,/25 表示子网掩码为 255.255.255.128
          gateway: 172.24.0.1     # 网络的网关地址,用于容器与外部网络(如宿主机、其他网络)之间的通信路由

然后打开命令行,跳转到 zookeeper.yml 文件所在路径,输入以下命令:

docker-compose -f zookeeper.yml up -d

即搭建成功

接着进入容器 Server-01 内部,并切换到bin目录下

docker exec -it Server-01 bash
cd bin

启动 ZooKeeper 命令行客户端并连接到指定服务端

./zkCli.sh -server localhost:2181

出现如图所示情况,则说明成功通过 Zookeeper 客户端连接到 Server - 01 节点

创建节点test,并存储数据"hello zookeeper"

create /test "hello zookeeper"

查看 /test 节点的数据和元信息

get /test

新打开一个终端,进入 Server-02 节点的bin目录

docker exec -it Server-02 bash
cd bin

启动 ZooKeeper 命令行客户端并连接到指定服务端

./zkCli.sh -server localhost:2181

可看见在 Server-02 节点内也能查看到

随后返回 Server-01 所在终端,更新节点数据,将 /test 节点的数据更新为 "goodbye zookeeper",随后在/test节点下创建子节点/sub,并存储数据"sub node"

set /test "goodbye zookeeper"
create /test/sub "sub node"

在 Server-02 所在终端,输入以下命令查看操作是否同步完成

get /test
get /test/sub

最后返回 Server-01 所在终端,删除/test节点及其子节点

注意:删除节点前需先删除其所有子节点,否则会报错 "Node not empty"

delete /test/sub
delete /test

在 Server-02 所在终端,输入以下命令查看结果

ls /

完成测试后,输入 quit 退出交互模式

quit

以上测试说明了 ZooKeeper 集群节点间通信与同步机制正常,成功验证了 Zookeeper 集群的数据一致性和集群协同能力

更多推荐