答案
Zookeeper 在分布式系统中有着广泛的应用场景,主要利用其协调和一致性特性。
1. 配置中心
应用场景:
- 集中管理应用配置
- 配置动态更新,无需重启服务
- 不同环境配置隔离
实现方式:
- 将配置存储在持久节点中
- 使用 Watcher 监听配置变化
- 配置更新时通知所有客户端
优势:
- 配置统一管理,避免配置不一致
- 支持配置版本控制
- 配置变更实时生效
2. 服务注册与发现
应用场景:
- 微服务架构中的服务治理
- 服务实例的注册和下线
- 服务负载均衡
实现方式:
- 服务启动时创建临时节点注册
- 服务下线时临时节点自动删除
- 客户端监听节点变化获取服务列表
优势:
- 自动感知服务实例变化
- 无需人工干预
- 支持健康检查
3. 分布式锁
应用场景:
- 跨进程的互斥访问控制
- 资源竞争协调
- 任务调度
实现方式:
- 创建临时顺序节点
- 最小序号的节点获得锁
- 其他节点监听前一个节点
代码示例:
java// 创建临时顺序节点 String lockPath = zk.create("/lock/lock-", data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); // 获取所有锁节点 List<String> children = zk.getChildren("/lock", false); // 判断是否是最小序号 if (lockPath.equals("/lock/" + children.get(0))) { // 获得锁 } else { // 监听前一个节点 zk.exists("/lock/" + previousNode, watcher); }
4. Leader 选举
应用场景:
- 主从架构中的主节点选举
- 集群协调
- 故障转移
实现方式:
- 所有节点创建临时顺序节点
- 序号最小的节点成为 Leader
- 其他节点监听 Leader 节点
优势:
- 自动选举,无需人工干预
- Leader 故障时自动重新选举
- 保证只有一个 Leader
5. 分布式队列
应用场景:
- 任务分发
- 消息队列
- 工作队列
实现方式:
- 使用持久顺序节点存储任务
- 消费者按序号消费任务
- 完成后删除节点
类型:
- FIFO 队列:先进先出
- Barrier 队列:等待所有参与者到达
6. 命名服务
应用场景:
- 生成全局唯一 ID
- 分布式环境下的命名
- 资源寻址
实现方式:
- 使用持久顺序节点
- 节点序号作为唯一标识
- 结合业务前缀生成业务 ID
优势:
- 保证全局唯一性
- 分布式环境可用
- 性能较好
7. 集群管理
应用场景:
- 集群成员管理
- 集群状态监控
- 集群协调
实现方式:
- 节点创建临时节点注册
- 监听节点变化
- 统计集群规模
优势:
- 自动感知成员变化
- 实时监控集群状态
- 支持动态扩缩容
8. 分布式通知/协调
应用场景:
- 系统间通知
- 协作任务
- 事件广播
实现方式:
- 使用 Watcher 机制
- 节点变化触发通知
- 多个客户端监听同一节点
优势:
- 实时性高
- 解耦系统依赖
- 支持一对多通知
实际应用案例
Kafka:
- 使用 Zookeeper 存储 broker 信息
- 选举 Controller
- 存储 topic 和 partition 信息
Hadoop:
- NameNode 高可用
- 资源调度协调
- 集群管理
Dubbo:
- 服务注册中心
- 配置中心
- 服务治理
选择 Zookeeper 的考虑因素
适用场景:
- 需要强一致性
- 读多写少
- 数据量不大(节点数 < 10万)
- 需要协调服务
不适用场景:
- 海量数据存储
- 高并发写入
- 需要复杂查询
- 大文件存储