乐闻世界logo
搜索文章和话题

Zookeeper 有哪些典型的应用场景?如何实现分布式锁和服务注册发现?

2月21日 16:24

答案

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万)
  • 需要协调服务

不适用场景

  • 海量数据存储
  • 高并发写入
  • 需要复杂查询
  • 大文件存储
标签:Zookeeper