• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
dwtfukgv
博客园    首页    新随笔    联系   管理    订阅  订阅
zookeeper 节点类型和使用场景

zookeeper 节点类型和使用场景

zookeeper 节点类型

  • 持久节点(persistence znode):永久保留的节点,当客户端断开连接后仍然能够保存节点数据的节点。
  • 临时节点(ephemeral znode):临时保留的节点,当客户端断开连接后节点将会被自动删除的节点,所以它不能够创建子节点。临时节点在leader选举中有重要的作用。在session连接中断开,就会被删除。
  • 有序节点(sequential znode):有顺序的节点,它既可以是持久节点也可以是临时节点。当创建一个有序节点时,系统会自动添加一个10位长度的数字来代替原节点。比如创建/sequence,那么系统会自动替换成/sequence0000000001,再创建一个有序节点就会变成数字2,如果有两个有序节点同时创建,那么产生的数字也是不一样的。有序节点在同步中有重要作用。

节点事件通知机制(watch)

客户端可以为节点注册多种事件通知,一旦节点进行了对应类型操作,zookeeper就会通知注册了对应事件的客户端。

节点操作事件主要分为如下几种:

  1. 节点创建事件:节点被创建时触发。
  2. 节点修改事件:节点数据变更时触发。
  3. 节点删除事件:节点被删除时触发。
  4. 子节点变更事件:子节点创建、修改、删除时触发。

zookeeper 使用场景

1. Zookeeper 实现配置中心

zookeeper 实现配置中心的机制主要是利用了节点的 watch 机制:

  1. 首先我们会在 zookeeper 上创建一个持久节点用于保存数据库连接信息。
  2. 然后我们的客户端连接 zookeeper 的时候会向该节点注册一个监听数据变更的watch事件。
  3. 当某个客户端操作修改了该节点时,zookeeper 会通知向改节点注册了 watch 事件的每个客户端。
  4. 当我们客户端收到了 zookeeper 的通知,我们会从 zookeeper 读取到该节点的信息,然后动态的修改自身的配置信息。

2. zookeeper 实现注册中心

zookeeper 主要是利用了临时节点和持久节点 watch 事件的特性实现注册中心的。

  1. 服务提供者会向 zookeeper 的某一个持久节点(比如说这里是/registry节点)下写入一个临时节点,节点的值就是自己服务的IP和端口等信息。
  2. 服务消费者启动时向 zookeeper 的/registry节点注册一个子节点变更事件,同时会从 zookeeper 的 /registry 节点拉取所有子节点,从而获得服务提供者的信息。
  3. 当某个服务提供者与 zookeeper 断开了会话之后,那么 zookeeper 会将此会话创建的临时节点删除,然后再通知向/registry节点注册了对应监听事件的客户端。
  4. 客户端收到 zookeeper 的节点变更通知后,重新从 zookeeper 拉取/registry节点的子节点信息。

3. zookeeper实现分布式锁

zookeeper 主要是利用临时节点,watch 和 非有序节点只允许被创建一次的特性来实现分布式锁的。

  1. 我们此次把分布式锁的节点建立在持久节点(比如说是/lock)下。
  2. 所有客户端在与 zookeeper 建立连接的时候都会向/lock节点注册子节点变更事件。
  3. 客户端获取锁的时候,他们都会向 zookeeper 的/lock节点下创建一个名叫/lock/locked的临时节点,因为 zookeeper 的节点名称是唯一的,所以这里只会有一个人创建成功,创建成功的节点则获取到了锁,可以执行自己对应的业务,当执行完自己的业务之后删除/lock/locked子节点,或者在客户端与服务端断开会话之后此节点也会被删除(因为这里创建的是临时节点)。
  4. 没有创建/lock/locked节点成功的客户端则会在此等待,因为他们已经向/lock节点注册了子节点变更事件,所以当子节点被删除之后他们会收到一个通知,收到通知之后它们又会执行第3步的流程来获取锁。

4. zookeeper 实现 master 选举

zookeeper 主要是利用了临时节点、watch机制、还有节点的唯一性原理来实现 master 选举的。

  1. 首次进行 master 选举时,所有客户端都会向 zookeeper 创建一个名称临时节点(比如说/master),因为 zookeeper 节点的唯一性,所以只会有一个客户端创建节点成功。
  2. 所有节点都会以创建成功的节点作为 master节点,然后在/master节点上注册一个节点变更的 watch。
  3. 当我们的 master 挂掉的时候,因为 master 与 zookeeper 的会话也断开了,此时 zookeeper 会删除/master节点,并向注册了对应事件的客户端发送通知。
  4. 当客户端收到了/master节点删除的通知时,客户端又都会去通过创建/master节点的方式去竞选 master。

5. zookeeper 实现分布式队列

zookeeper 主要是利用临时节点、有序节点、watch 机制的特性来完成队列的实现的。

  1. 首先我们在zookeeper里面创建一个持久节点(比如说/queue)用于存储队列信息。
  2. 在客户端执行业务前,分别向/queue节点创建临时有序节点。
  3. 客户端通过getchildren来获取/queue节点的所有子节点,然后验证自己的创建的节点顺序号是不是最小的,如果不是最小的,那么监听比自己小的前一个节点,同时等待。如果自己是最小的节点,那么执行自己的业务,执行完之后删除自己所创建的节点(或者断开连接)。
  4. 因为每个客户端都会监听在自己前面的一个节点,所以当前一个节点删除后,zookeeper 都会向注册了该节点时间的客户端发送通知,当监听的客户端收到通知,它又会重新通过getchildren来获取所有子节点,然后执行第三步相同的流程。

6. zookeeper 实现分布式ID生成

zookeeper主要利用顺序节点的特性来生成分布式ID,因为每个 zookeeper 节点都会为子节点维护一个自增的序列号,当某个服务需要生成ID时候,只要往对应节点里面创建对应顺序节点,创建成功后会返回对应节点的节点名称,我们就可以直接使用此名称来作为ID。

posted on 2021-04-12 10:12  dwtfukgv  阅读(137)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3