docker compose 部署 zookeeper 高可用故障转移

 

架构图

 

部署zookeeper一主两从

一、创建 Overlay 网络

集群之间走host网络模式 (也可以直接走ip 不影响)

# 在主机 A 上初始化 Swarm(管理节点)
docker swarm init --advertise-addr <主机A_IP>
# 在主机 B 上加入集群(工作节点)
docker swarm join --token <TOKEN> <主机A_IP>:2377

 

A节点创建overlay网络

docker network create -d overlay \
  --subnet=10.200.100.0/24 \
  --gateway=10.200.100.1 \
  --attachable \
my-net

A节点创建容器 加入到这个my-paasmes新建的网络中。

docker run -d    --network=my-paasmes   --ip=10.200.100.10   nginx:1.24

 

B 节点 正常是看不到刚创建的my-paasmes 网络的,有容器使用my-paasmes网络才会显示

B节点 创建一个容器 去ping主节点

docker run -it --rm   --network=my-paasmes   alpine ping 10.200.100.10

一边ping 一边查看docker网络 可以发现, 这个网络有了(新开一个窗口)

 

 

 

 

二、准备zk集群yml文件

此yml文件是一台启动三个。可以拆开挨个启动即可

version: "3.1"
services:
  zoo1:
    image: zookeeper:3.9.3
    restart: always
    container_name: zoo1
    ports:
      - "2181:2181"
    environment:
      ZOO_MY_ID: 1
      ZOO_TICK_TIME: 1000
      ZOO_INIT_LIMIT: 3
      ZOO_SYNC_LIMIT: 1
      maxClientCnxns: 600
      standaloneEnabled: false
      ZOO_MAX_CLIENT_CNXNS: 200
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
      ZOO_AUTOPURGE_PURGEINTERVAL: 1
      ZOO_AUTOPURGE_SNAPRETAINCOUNT: 3
    volumes:
      - ./zookeeper/zoo1/data:/data
      - ./zookeeper/zoo1/datalog:/datalog
    networks:
      - my-net

  zoo2:
    image: zookeeper:3.9.3
    restart: always
    container_name: zoo2
    ports:
      - "2182:2181"
    environment:
      ZOO_MY_ID: 2
      ZOO_TICK_TIME: 1000
      ZOO_INIT_LIMIT: 3
      ZOO_SYNC_LIMIT: 1
      maxClientCnxns: 600
      standaloneEnabled: false
      ZOO_MAX_CLIENT_CNXNS: 200
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
      ZOO_AUTOPURGE_PURGEINTERVAL: 1
      ZOO_AUTOPURGE_SNAPRETAINCOUNT: 3
    volumes:
      - ./zookeeper/zoo2/data:/data
      - ./zookeeper/zoo2/datalog:/datalog
    networks:
      - my-net

  zoo3:
    image: zookeeper:3.9.3
    restart: always
    container_name: zoo3
    ports:
      - "2183:2181"
    environment:
      ZOO_MY_ID: 3
      ZOO_TICK_TIME: 1000
      ZOO_INIT_LIMIT: 3
      ZOO_SYNC_LIMIT: 1
      maxClientCnxns: 600
      standaloneEnabled: false
      ZOO_MAX_CLIENT_CNXNS: 200
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
      ZOO_AUTOPURGE_PURGEINTERVAL: 1
      ZOO_AUTOPURGE_SNAPRETAINCOUNT: 3
    volumes:
      - ./zookeeper/zoo3/data:/data
      - ./zookeeper/zoo3/datalog:/datalog
    networks:
      - my-net

networks:
  my-net:
    driver: overlay
    external: true
 

 



三、验证是否生效高可用

可以看到 主节点是leader 在zoo2 ,从节点follower在zoo1 zoo3

docker exec zoo1 zkServer.sh status
docker exec zoo2 zkServer.sh status  
docker exec zoo3 zkServer.sh status

 

停止主节点(zoo2容器) 在进行查看

这条命令是动态查看集群状态,同时看zoo1 zoo2 zoo3 一个程序停掉,肯定会有一个报错

watch -n 1 'docker exec zoo1 zkServer.sh status; docker exec zoo2 zkServer.sh status; docker exec zoo3 zkServer.sh status; '

这里可以看到 zoo2 报错了。 zoo3变成了leader 主节点

 

然后启动zoo2容器发现, zoo2 变成了从节点

 

posted @ 2025-10-23 10:19  mrdongdong  阅读(3)  评论(0)    收藏  举报