乐途乐途
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
  • ZooKeeper 学习路径
  • 第1章 分布式协调与ZooKeeper概述

    • ZooKeeper 概述
  • 第2章 单机与集群搭建

    • 配置参数详解
    • 集群搭建
  • 第3章 数据模型与ZNode

    • ZNode 详解
    • 节点类型对比
    • 顺序节点
    • ACL 权限控制
  • 第4章 会话与Watcher机制

    • 会话机制
    • Watcher 机制
  • 第5章 ZAB协议与一致性保证

    • ZAB 协议
    • 一致性保证
    • 数据同步
  • 第6章 Leader选举

    • Leader 选举
  • 第7章 典型应用:分布式锁

    • 分布式锁
  • 第8章 典型应用:配置中心与命名服务

    • 配置中心
    • 命名服务
  • 第9章 客户端编程基础(Java原生API)

    • Java 原生 API 编程
  • 第10章 运维与监控

    • 四字命令
    • 监控体系
  • 第11章 面试考点与设计思想

    • 设计思想
    • 面试考点汇编

本章定位:将 11 个章节的面试考点系统汇总,按主题分类,每道题配有核心要点提示。

分布式协调基础

Q1:分布式协调的核心挑战是什么?

  • 时钟不可靠(不能依赖物理时钟排序事件)
  • 网络不可靠(消息延迟、丢失、乱序)
  • 部分失败(某个节点失败不等于全部失败)

Q2:ZooKeeper 在 CAP 中属于什么? [详见 Q22 对比表格]

  • CP:保证强一致性和分区容错性
  • 牺牲可用性:Leader 宕机后选举期间集群不可用(通常 200ms 以内)

数据模型与 ZNode

Q3:ZooKeeper 的数据模型是怎样的? [详见 ZNode.md]

  • 树形命名空间(类似文件系统)
  • 每个 ZNode 既是路径也是数据容器
  • 支持 Sequential 和 Ephemeral 特性
  • 数据通常 < 1KB,单节点上限 1MB

Q4:持久节点和临时节点的区别? [详见 节点类型对比.md]

  • Persistent:手动创建手动删除,生命周期独立于 Session
  • Ephemeral:Session 结束自动删除,不能有子节点
  • Persistent Sequential / Ephemeral Sequential:自动附加 10 位递增序号

Q5:版本号的作用是什么? [详见 ZNode.md]

  • version:数据修改次数
  • cversion:子节点修改次数
  • aversion:ACL 修改次数
  • 用于乐观锁:setData 时指定预期 version,不一致则失败

Q6:如何设计 ZooKeeper 的 ACL? [详见 ACL.md]

  • Scheme:world / auth / digest / ip
  • 五种权限:CREATE、READ、WRITE、DELETE、ADMIN
  • 子节点不继承父节点 ACL

会话与 Watcher

Q7:Session 的生命周期是怎样的? [详见 Session.md]

  • CONNECTING → CONNECTED → (可能 Disconnected → CONNECTED)→ (可能 Expired)
  • Session Timeout 由客户端提议,服务端决定(范围 2 × tickTime ~ 20 × tickTime)
  • Session 迁移:重连到其他节点后继续使用原 Session

Q8:Watcher 机制的核心特点? [详见 Watcher.md]

  • 一次性触发(One-time Trigger)
  • 串行处理(客户端保证顺序)
  • 轻量级设计(只通知事件类型,不含新旧数据)
  • 服务端发送通知后才删除 Watcher,保证送达

Q9:如何处理 Watcher 丢失?

  • 收到通知后立即 getData 重新注册 Watcher
  • 定时轮询作为兜底(如每 30s 全量同步)
  • Curator 的 NodeCache / TreeCache 自动处理

ZAB 协议与一致性

Q10:ZAB 协议的四个阶段? [详见 ZAB协议.md]

  1. Leader Election(Leader 选举)
  2. Discovery(发现阶段,确定最新 epoch)
  3. Synchronization(同步阶段,Follower 追上 Leader)
  4. Broadcast(广播阶段,正常处理事务)

Q11:ZooKeeper 如何保证顺序一致性? [详见 一致性保证.md]

  • 全局 ZXID 递增:高 32 位 epoch + 低 32 位计数器
  • TCP 顺序传输确保客户端按序接收
  • 单个客户端看到的操作顺序与全局顺序一致

Q12:ZAB 和 Raft 的区别? [详见 Q22 ZK vs etcd 对比]

  • ZAB 针对主备场景,Raft 更通用
  • ZAB 选举优先有最新数据的节点(max ZXID)
  • Raft 引入 Term 概念,选举更结构化
  • 两者核心思想相似:Leader 驱动 + 多数派确认

Leader 选举

Q13:Leader 选举的投票规则? [详见 Leader选举.md]

  • 比较 epoch(大的优先)
  • 比较 ZXID(大的优先)
  • 比较 myid(大的优先)
  • 收到过半数选票后切换为 Leader

Q14:为什么需要奇数节点?

  • 选举需要过半数(quorum = floor(n/2) + 1)
  • 3 节点容忍 1 台故障,4 节点同样容忍 1 台 → 浪费资源
  • 偶数节点增加故障概率而不增加容错能力

Q15:如何避免脑裂?

  • Quorum 机制:必须有超过半数节点认可才成为 Leader
  • 旧 Leader 发现自己失去多数派支持后自动降级为 Follower
  • epoch 递增保证旧 Leader 提案被拒绝

分布式锁

Q16:ZooKeeper 分布式锁的实现原理? [详见 分布式锁.md]

  • Ephemeral Sequential 节点
  • 公平锁:Watch 前驱节点
  • 非公平锁:Watch 根节点(惊群效应)
  • 释放:delete 节点 或 Session 超时

Q17:ZooKeeper 锁和 Redis 锁的选择?

  • ZK:强一致性 + 公平排队 + 自动释放 → 适合金融、核心业务流程
  • Redis:高性能 + 简单 SET NX + EXPIRE → 适合高吞吐互联网场景

配置中心与服务发现

Q18:如何用 ZooKeeper 做配置中心? [详见 配置中心.md]

  • ZNode 存储配置,Watcher 推送变更
  • 配置树:/config/{env}/{app}/{key}
  • 需自行实现配置回滚和灰度发布

Q19:ZooKeeper 服务发现和 Eureka 的区别? [详见 Q22 对比表格]

  • ZK(CP):网络分区时少数派不可用
  • Eureka(AP):网络分区时各分区独立服务
  • 选型:强一致性场景用 ZK;高可用场景用 Eureka

运维与性能

Q20:ZooKeeper 的性能瓶颈在哪里?

  • 事务日志的磁盘 fsync(受限于磁盘 IOPS)
  • Session 数量(每个 Session 消耗内存和心跳带宽)
  • 读可以水平扩展(Follower),写不能(必须经过 Leader)

Q21:如何优化 ZooKeeper 的磁盘 IO? [详见 监控.md]

  • 事务日志和快照分盘存储(dataLogDir vs dataDir)
  • 使用 SSD 存放事务日志
  • 调整 snapCount(默认 100000)平衡日志大小和恢复速度

Q22:ZooKeeper vs etcd vs Consul 对比(CAP 角度) [详见 设计思想.md]

维度ZooKeeperetcdConsul
一致性协议ZAB(自研)RaftRaft(自研实现)
CAP 分类CP(强一致)CP(强一致)CA(默认,弱一致)
数据模型树形 ZNode(类文件系统)扁平 K-V(支持前缀范围查询)扁平 K-V + 健康检查 + DNS
Watch 机制一次性 Trigger(注册→触发→删除)Watch(gRPC 长连接流,持续推送)HTTP Long Polling(阻塞查询)
语言栈JavaGoGo
服务发现需自行实现注册/注销逻辑支持 Lease 机制(TTL)内置服务发现 + DNS / HTTP API
健康检查无内置(通过 Ephemeral 间接实现)Lease 心跳内置 TCP/HTTP/gRPC/脚本多种检查
多数据中心无原生支持(Observer 可辅助)无原生支持第一公民特性(WAN Federation)
生态成熟度极成熟(Hadoop/Kafka/HBase 依赖)Kubernetes 标准后端HashiCorp 生态(Nomad/Vault/Terraform)
密码体系Digest ACL / x509(3.5+)证书 + RBACACL Token + TLS
适用场景分布式协调、配置中心、分布式锁K8s 配置存储、共享状态、Leader 选举服务发现、健康检查、Multi-DC

三者的定位差异:

  • ZooKeeper:偏 CP 强一致协调。节点树模型适合表达层级关系和顺序,锁语义天然完备。但重型(Java 运行开销大)且 Watch 为一次性触发需自行续注册。适合 Hadoop/HBase/Kafka 等强一致性协调场景。
  • etcd:偏 CP K-V 存储。扁平 K-V + Watch 长连接 + gRPC 生态简单高效,Kubernetes 的标准配置后端。相比 ZK,Watch 持续推送更省心,但数据模型不如 ZK 树直观。
  • Consul:偏 CA 服务发现。内置健康检查、DNS 接口、多数据中心联邦,开箱即用的服务网格能力。但默认弱一致性(通过 DNS TTL 控制),一致性保证不如 ZK/etcd。

选型建议:

  • 强一致性协调 / 分布式锁 / 存量 Hadoop 生态 → ZooKeeper
  • Kubernetes 场景 / 新项目键值存储 / 简单 Leader 选举 → etcd
  • 异构服务发现 / 多数据中心 / 健康检查 → Consul

以上考点覆盖了 ZooKeeper 核心机制的所有高频问答,建议结合对应章节深入理解原理后再作答。

上一页
设计思想