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 docker
复制代码 2. 创建专用网络(所有节点)
- 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
- EOF
复制代码 2. 监控方案
- 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
- EOF
复制代码 3. 故障模拟测试
- # 每个节点执行(注意在对应目录执行)
- 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特性。
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除 |