Skip to content

故事:ZK 像“三胞胎”一起记账,半数以上同意才算数,挂掉一台也能继续工作。

  1. 架构
    • Leader + Follower + Observer(选主、写请求转发)
    • 数据完全复制(事务日志 + 快照)

  2. 选主算法 ZAB(ZooKeeper Atomic Broadcast)
    • 崩溃恢复阶段:投票 → 选 epoch 最大的节点为新 Leader
    • 消息广播阶段:Leader 生成全局递增 zxid,两阶段提交(先写本地日志,再广播 COMMIT)

  3. 高可用关键点
    奇数节点:3 节点集群可容忍 1 台宕机;5 节点容忍 2 台。
    快速选主:默认 tickTime=2s + syncLimit=5,10s 内完成切换。
    数据一致性:半数确认写成功,客户端永远读到最新已提交数据。

最小 Docker 高可用脚本

bash
docker network create zk-net

for i in 1 2 3; do
  docker run -d --name zk$i --net zk-net \
    -e ZOO_MY_ID=$i \
    -e ZOO_SERVERS="server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181" \
    zookeeper:3.8
done

面试一句话总结

• ZooKeeper 高可用 = “三胞胎记账”:半数存活即可读写,ZAB 选主 + 事务日志复制。