ZooKeeper 入门教程之一

ZooKeeper 的应用场景

命名服务

ZooKeeper 可以用来实现分布式命名服务。命名服务是指通过指定的名字来获取资源或者服务的地址,利用 ZooKeeper 创建一个全局的路径,这个路径就可以作为一个名字,指向集群中的节点、提供服务的地址、或者一个远程的对象等等。统一命名服务的命名结构如下图所示:

  • (1)在分布式环境下,经常需要对应用 / 服务进行统一命名,以便于识别不同的服务。
    • 类似于域名与 IP 之间对应关系,IP 不容易记住,而域名容易记住。
    • 通过名称来获取资源服务的地址、服务提供者等信息。
  • (2)按照层次结构组织应用 / 服务的名称。
    • 可将服务名称以及地址信息写到 ZooKeeper 上,客户端通过 ZooKeeper 获取可用服务列表。

配置管理

应用程序分布式地部署在不同的机器上,将应用的配置信息存储在 ZooKeeper 的 Znode 下,当有配置发生改变时,也就是 Znode 的内容发生变化时,利用 Watch 监听机制通知给各个客户端,然后客户端从 ZooKeeper 拉取最新的配置信息,从而实时动态更新配置信息。ZooKeeper 的配置管理结构图如下所示:

  • 在分布式环境下,配置文件管理和同步是一个常见问题。

    • 一个集群中,所有节点的配置信息是一致的,比如 Hadoop 集群。
    • 对配置文件修改后,希望能够快速同步到各个节点上。
  • 配置管理可交由 ZooKeeper 实现。

    • 可将配置信息写入 ZooKeeper 上的一个 Znode。
    • 各个客户端监听这个 Znode。
    • 一旦 Znode 中的数据被修改,ZooKeeper 会通知各个客户端。

集群管理

所谓集群管理就是:是否有机器退出和加入、选举 Master。集群管理主要指集群监控和集群控制两个方面,前者侧重于集群运行时的状态的收集,后者则是对集群进行操作与控制。

  • 在开发和运维中,面对集群,经常有如下需求。

    • 希望知道集群中究竟有多少机器在工作。
    • 对集群中的每台机器的运行时状态进行数据收集。
    • 对集群中机器进行上下线的操作。
  • ZooKeeper 集群管理结构图如下所示:

  • (1) 在分布式环境中,实时掌握每个节点的状态是必要的,可根据节点实时状态做出一些调整。
  • (2) 可交给 ZooKeeper 实现。
    • 可将节点信息写入 ZooKeeper 上的一个 Znode。
    • 监听这个 Znode 可获取它的实时状态变化。
  • (3) ZooKeeper 支持强一致性。
    • 利用 ZooKeeper 的强一致性,能够保证在分布式高并发情况下节点创建的全局唯一性。
    • 比如,同时有多个客户端请求创建 /currentMaster 节点,最终一定只有一个客户端请求能够创建成功。
  • (4) 典型的应用场景。
    • Hbase 中 Master 状态监控与选举。

分布式锁

处于不同节点上不同的服务,它们可能需要顺序的访问一些资源,这里需要一把分布式的锁。ZooKeeper 提供的顺序节点和 Watch 机制使其成为实现分布式锁的理想选择。通过创建临时顺序节点,并利用节点的顺序特性,可以实现分布式系统中的锁机制,用于控制对共享资源的访问。

  • 分布式锁有多种类型:写锁、读锁、时序锁。
    • 写锁:在 ZooKeeper 上创建的一个临时的无编号的节点。由于是无编号,在创建时不会自动编号,导致只能客户端有一个客户端得到锁,然后进行写入。
    • 读锁:在 ZooKeeper 上创建一个临时的有编号的节点,这样即使下次有客户端加入是同时创建相同的节点时,它也会自动编号,也可以获得锁对象,然后对其进行读取。
    • 时序锁:在 ZooKeeper 上创建的一个临时的有编号的节点,然后根据编号的大小控制锁。

分布式队列

  • 分布式队列分为两种。
    • 第一种:队列按照 FIFO 方式进行入队和出队操作,比如实现生产者和消费者模型。
    • 第二种:当一个队列的成员都到齐时,这个队列才可用,否则一直等待所有成员到达,这种是同步队列。比如一个 Job 由多个 Task 组成,只有所有 Task 完成后,Job 才可以执行完成。首先可以为 Job 创建一个 /job 目录,然后在该目录下,为每个完成的 Task 创建一个临时节点,一旦临时节点的数量达到 Task 总数,则表示 Job 执行完成。

数据发布与订阅

数据发布与订阅即所谓的配置管理,顾名思义就是将数据发布到 ZooKeeper 节点上,供订阅者动态获取数据,从而实现配置信息的集中式管理和动态更新。例如全局的配置信息、服务地址列表等就非常适合使用。配置信息一般有以下特点:

  • 数据量小的 Key-Value
  • 数据内容在运行时会发生动态变化
  • 集群机器共享,配置一致

ZooKeeper 采用推拉结合的方式来实现发布与订阅:

  • 推(Push): ZooKeeper 服务端会推送 Wathcer 事件通知给注册了监控节点的 ZooKeeper 客户端。
  • 拉(Pull): ZooKeeper 客户端获得事件通知后,会主动到 ZooKeeper 服务端拉取最新的数据。

分布式通知与协调

  • (1) 分布式环境中,经常存在一个服务需要知道它所管理的子服务的状态。
    • (a) NameNode 需知道各个 DataNode 的状态。
    • (b) JobTracker 需知道各个 TaskTracker 的状态。
  • (2) 心跳检测机制可通过 ZooKeeper 来实现。
  • (3) 消息推送可由 ZooKeeper 来实现,ZooKeeper 相当于一个发布 / 订阅系统。