什么是Zookeeper

官方定义:

zookeeper是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

可以简单理解为 Zookeeper = 文件系统 + 监听通知机制

Zookeeper的特性

注:以下server指Zookeeper的单个服务节点,client指Zookeeper的客户端

  1. 全局数据的一致:每个 server 保存一份相同的数据副本,client 无论链接到哪个 server,展示的数据都是一致的
  2. 可靠性:如果消息被其中一台服务器接受,那么将被所有的服务器接受
  3. 顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息 a 在消息 b 前发布,则在所有 server 上消息 a 在消息 b 前被发布,偏序是指如果一个消息 b 在消息 a 后被同一个发送者发布,a 必须将排在 b 前面
  4. 数据更新原子性:一次数据更新要么成功,要么失败,不存在中间状态
  5. 实时性:ZooKeeper 保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息

ZooKeeper的特性和功能是实现诸如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等服务的基础

文件系统

Zookeeper维护一个类似文件系统的数据结构:
在这里插入图片描述
ZooKeeper节点(如上图中/NameServer)称为 znode 。每个znode由一个名称标识,并用路径(/)序列分隔
znode由三部分组成:

  • stat:此为状态信息,描述该Znode版本、权限等信息。
  • data:与该Znode关联的数据
  • children:该Znode下的节点

我们能够自由地增加、删除znode,在一个znode下增加、删除子znode,并且可以在znode中存储数据

Zone节点的类型

  • 持久节点:即使在创建该特定znode的客户端断开连接后,持久节点仍然存在。默认情况下,除非另有说明,否则所有znode都是持久的。
  • 临时节点 - 客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。因此,只有临时节点不允许有子节点。如果临时节点被删除,则下一个合适的节点将填充其位置。临时节点在leader选举中起着重要作用。
  • 顺序节点 - 顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径。例如,如果将具有路径 /myapp 的znode创建为顺序节点,则ZooKeeper会将路径更改为 /myapp0000000001 ,并将下一个序列号设置为0000000002。如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字。顺序节点在锁定和同步中起重要作用。

监听机制

客户端通过Zookeeper提供的API注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。

ZooKeeper应用场景

依据ZooKeeper全局数据一致、数据更新原子性、实时性等特性及其监听机制,可以用于实现分布式锁、统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

分布式应用配置管理

假设我们的程序是分布式部署在多台机器上,如果我们要改变程序的配置文件,需要逐台机器去修改,非常麻烦,现在把这些配置全部放到zookeeper上去,保存在 zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 zookeeper 的通知,然后从 zookeeper 获取新的配置信息应用到系统中。
在这里插入图片描述

分布式锁

  • 在 ZooKeeper 指定节点(locker)下创建临时顺序节点 node_n
  • 获取 locker 下所有子节点 children
  • 对子节点按节点自增序号从小到大排序
  • 判断本节点是不是第一个子节点,若是,则获取锁;若不是,则等待
  • 使用 ZooKeeper 感知节点的功能,对本节点的上一个节点进行感知
  • 当上一个节点被删除了,ZooKeeper 会通知该线程,该线程就结束等待,并获取锁
  • 释放锁,并删除该临时节点

详细分布式锁实现可以参考菜鸟教程:Zookeeper 分布式锁实现原理

Zookeeper安装

参考:W3Cschool:Zookeeper安装步骤

参考

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐