Zookeeper 数据模型的结构

Zookeeper 数据模型的结构是基于节点的,我们把这种节点叫做 Znode
截屏2022-03-14 下午10.34.41.png
结点引用:

  1. /电脑/戴尔
  2. /手机/华为

我们对节点的引用,必须书写全路径,也就是说必须要从根节点开始。在 Zookeeper 底层的实现中,把 Znode 的绝对路径作为 key ,Znode 本身作为 value 来保存的。使用绝对路径来查询也提高了 Zookeeper 的性能。

Znode 的元素组成

截屏2022-03-14 下午10.41.08.png

  • data: znode 存储的数据信息,指用户保存的数据。
  • ACL:对结点进行权限控制,记录了哪些用户或者哪些IP可以访问本结点。
  • child:当前结点的子结点引用
  • stat:包含Znode 的各种元数据,比如事务 ID、版本号、时间戳、大小等 Znode 本身的数据。

Znode 的data元素存储的信息最大不能超过1MB,太大的数据会影响Zookeeper 的同步性能。

Znode 的类型

  • 持久节点: 持久节点是 Zookeeper 的默认节点,持久节点被创建后会一直存在,除非进行手动删除;
  • 持久顺序节点: 持久顺序节点是在持久节点的基础上,增加了顺序性。也就是说,持久顺序节点被创建时,会根据创建的时间进行编号,根据编号我们就可以判断它们的顺序;
  • 临时节点: 临时节点与持久节点的特点相反,临时节点被创建之后,如果与创建它的客户端断开连接,临时节点就会被销毁;
  • 临时顺序节点: 临时顺序节点就是在临时节点的基础上,增加了顺序性。

Znode 的应用

  1. 我们可以使用临时节点来实现服务注册与发现。在某个服务注册到 ZooKeeper 时,我们可以让这个这个服务创建一个临时节点,并把它的访问信息交给到 Zookeeper 维护。当这个服务与 Zookeeper 断开连接时,这个临时节点就会被销毁,这时 Zookeeper 发现这个服务离线了,就会移除它的访问地址,避免出现 404 的情况。我们也可以手动删除某个临时节点让相对应的服务下线;
  2. 当我们有大量的服务时,一旦配置信息需要修改,会消耗我们大量的时间去每个服务中修改,而且还有可能会出错,这种情况我们就可以使用持久节点来保存全局的配置信息。当某个服务注册到 ZooKeeper 时,可以去保存配置信息的节点读取配置信息。当我们修改配置时,Zookeeper 会通知这些服务,服务就会重新去读取配置信息
  3. 我们可以使用临时顺序节点来实现分布式锁。当多个服务同时对一个资源进行修改时,会出现数据错误,所以我们要避免这种情况。我们这里采取的方式就是为这个资源加锁,想要获取这个资源的服务会创建一个临时顺序节点,根据它的顺序判断这个临时顺序节点是否为第一个,如果是第一个则成功获得锁,这时这个服务就可以对这个资源进行修改了。完成操作后或者这个服务断线了都会删除这个节点,也就是释放了锁。后面的服务会根据它创建的临时顺序节点的顺序来依次对资源进行操作。