【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 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
2. 节点2配置(Follower)
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
3. 节点3配置(Observer)
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

三、启动集群

# 每个节点执行(注意在对应目录执行)
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

四、三大核心角色详解

1. Leader(领导者)

核心职责

  • 唯一接受写请求的节点
  • 负责将写操作转化为事务(ZXID)
  • 管理数据同步流程(2PC提交)
  • 维护与Follower的心跳

关键特性

写请求

Proposal

Proposal

ACK

Commit

Client

Leader

Follower1

Follower2

Follower

All

2. Follower(跟随者)

核心职责

  • 接受客户端读请求(负载分流)
  • 参与Leader选举投票
  • 从Leader同步数据变更
  • 转发写请求给Leader

状态转换

确认Leader

Leader失联

LOOKING

FOLLOWING

3. Observer(观察者)

特殊优势

  • 不参与投票(提高集群扩展性)
  • 接受客户端读请求
  • 异步同步Leader数据
  • 跨数据中心部署的理想选择

性能对比

角色写吞吐量读吞吐量网络开销
Leader
Follower
Observer最高

五、选举原理深度解析

1. 选举触发条件
  • 集群初始化启动
  • Leader失去心跳(默认2*tickTime)
  • 超过半数节点连接丢失
  • 管理员手动触发(zkServer.sh restart
2. 选举过程详解

阶段一:选票广播

# 伪代码示例
class Vote:
    def __init__(self, sid, zxid, epoch):
        self.sid = sid    # 服务器ID
        self.zxid = zxid  # 最新事务ID
        self.epoch = epoch # 选举周期

def compare_votes(v1, v2):
    if v1.epoch != v2.epoch:
        return v1.epoch > v2.epoch
    elif v1.zxid != v2.zxid:
        return v1.zxid > v2.zxid
    else:
        return v1.sid > v2.sid

阶段二:状态转换

Node3Node2Node1Node3Node2Node1初始状态: LOOKING发现Node2获得多数票切换为FOLLOWING投票(1, zxid=100)投票(2, zxid=120)投票(2, zxid=120)投票(3, zxid=120)LEADERINFOACK

六、生产环境调优建议

1. 关键参数优化
# 在docker环境变量中添加:
environment:
  ZOO_TICK_TIME: "2000"
  ZOO_INIT_LIMIT: "10"
  ZOO_SYNC_LIMIT: "5"
  ZOO_AUTOPURGE_SNAP_RETAIN_COUNT: "3"
  ZOO_AUTOPURGE_PURGE_INTERVAL: "24"
2. 监控方案
# 使用四字命令监控
watch -n 1 "echo mntr | nc localhost 2181"

# 推荐监控指标:
• zk_avg_latency          # 平均延迟
• zk_outstanding_requests # 排队请求数
• zk_znode_count          # 节点数量
• zk_watch_count          # watch数量
3. 故障模拟测试
# 模拟Leader宕机
docker pause zk-node1

# 观察日志(约2-5秒应完成选举)
docker logs --tail 100 -f zk-node2

# 恢复节点
docker unpause zk-node1

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

原创作者: sun-10387834 转载于: https://www.cnblogs.com/sun-10387834/p/18922477
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值