思矿戳 发表于 2025-9-24 17:05:56

【Zookeeper】ZooKeeper集群搭建与选举原理终极指南(Docker版 + 三角色详解)

ZooKeeper集群搭建与选举原理终极指南(Docker版 + 三角色详解)

一、环境准备(Docker版)

1. 服务器准备(3台节点)

# 所有节点执行
sudo apt-get update && sudo apt-get install -y docker.io docker-compose
sudo systemctl enable docker && sudo systemctl start docker2. 创建专用网络(所有节点)

docker network create --driver bridge --subnet 172.20.0.0/16 zk_net二、Docker方式部署ZooKeeper集群

1. 节点1配置(Leader候选)

# 创建数据目录
mkdir -p /data/zookeeper/node1/{data,datalog}

# 创建docker-compose.yml
cat > /data/zookeeper/node1/docker-compose.yml <<EOF
version: '3.8'
services:
zookeeper:
    image: zookeeper:3.8.1
    restart: always
    hostname: zk-node1
    container_name: zk-node1
    ports:
      - "2181:2181"
      - "2888:2888"
      - "3888:3888"
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=zk-node1:2888:3888;2181 server.2=zk-node2:2888:3888;2181 server.3=zk-node3:2888:3888;2181
      ZOO_STANDALONE_ENABLED: "false"
    volumes:
      - /data/zookeeper/node1/data:/data
      - /data/zookeeper/node1/datalog:/datalog
    networks:
      zk_net:
      ipv4_address: 172.20.0.101
networks:
zk_net:
    external: true
EOF阶段二:状态转换
sequenceDiagram    participant Node1    participant Node2    participant Node3      Note over Node1: 初始状态: LOOKING    Node1->>Node2: 投票(1, zxid=100)    Node2->>Node1: 投票(2, zxid=120)    Node1->>Node3: 投票(2, zxid=120)    Node3->>Node1: 投票(3, zxid=120)    Note over Node1: 发现Node2获得多数票    Node1->>Node2: LEADERINFO    Node2-->>Node1: ACK    Note over Node1: 切换为FOLLOWING六、生产环境调优建议

1. 关键参数优化

mkdir -p /data/zookeeper/node2/{data,datalog}

cat > /data/zookeeper/node2/docker-compose.yml <<EOF
version: '3.8'
services:
zookeeper:
    image: zookeeper:3.8.1
    restart: always
    hostname: zk-node2
    container_name: zk-node2
    ports:
      - "2182:2181"
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zk-node1:2888:3888;2181 server.2=zk-node2:2888:3888;2181 server.3=zk-node3:2888:3888;2181
    volumes:
      - /data/zookeeper/node2/data:/data
      - /data/zookeeper/node2/datalog:/datalog
    networks:
      zk_net:
      ipv4_address: 172.20.0.102
networks:
zk_net:
    external: true
EOF2. 监控方案

mkdir -p /data/zookeeper/node3/{data,datalog}

cat > /data/zookeeper/node3/docker-compose.yml <<EOF
version: '3.8'
services:
zookeeper:
    image: zookeeper:3.8.1
    restart: always
    hostname: zk-node3
    container_name: zk-node3
    ports:
      - "2183:2181"
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zk-node1:2888:3888;2181 server.2=zk-node2:2888:3888;2181 server.3=zk-node3:2888:3888;2181:observer
      ZOO_OBSERVER_ENABLED: "true"
    volumes:
      - /data/zookeeper/node3/data:/data
      - /data/zookeeper/node3/datalog:/datalog
    networks:
      zk_net:
      ipv4_address: 172.20.0.103
networks:
zk_net:
    external: true
EOF3. 故障模拟测试

# 每个节点执行(注意在对应目录执行)
docker-compose up -d

# 查看节点状态
docker exec -it zk-node1 zkServer.sh status
docker exec -it zk-node2 zkServer.sh status
docker exec -it zk-node3 zkServer.sh status通过这种Docker化部署方式,您可以在10分钟内快速搭建一个生产可用的ZooKeeper集群,三大角色各司其职:Leader处理写请求保证一致性,Follower参与选举并提供读服务,Observer则专门扩展读能力。这种架构设计完美体现了分布式系统CAP理论中的CP特性。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

厥轧匠 发表于 4 天前

收藏一下   不知道什么时候能用到
页: [1]
查看完整版本: 【Zookeeper】ZooKeeper集群搭建与选举原理终极指南(Docker版 + 三角色详解)