初识Zookeeper

1. 什么是ZooKeeper?

官网定义:

ZooKeeper: A Distributed Coordination Service for Distributed Applications

(1) ZooKeeper主要服务于分布式系统,可以用来做:统一配置管理、统一命名服务、分布式锁、集群管理

(2) ZooKeeper作为一个通用中间件,可解决分布式系统对节点的管理问题(实时感知节点的状态、对节点进行统一管理等)。

比如:Kafka使用ZooKeeper管理自己的元数据配置

ZooKeeper和Redis一样,也是C/S结构(分成客户端和服务端)

2. 为什么ZooKeeper能干这么多?

        ZooKeeper的数据结构,可以看做是一颗,每个节点叫做ZNode,可以通过路径来标识,如下图:

Znode分为两种类型:

  • 短暂/临时(Ephemeral):当客户端和服务端断开连接后,所创建的Znode会自动删除
  • 持久(Persistent):当客户端和服务端断开连接后,所创建的Znode不会删除。

2.1 监听器

        ZooKeeper配合监听器,通过监听+Znode节点机制来实现这些功能。常见的监听场景有以下两项:

  • 监听Znode节点的数据变化;
  • 监听子节点的增减变化。

2.2 统一配置管理

     有三个系统A、B、C,分别对应三份配置(ASystem.yml、BSystem.yml、CSystem.yml),且这三份配置又非常类似。如果改变其中一份配置项的信息,很可能其他两份都要改,且很可能还要重启系统。 于是希望把这三份相同的配置项抽取出来成一份公用的配置common.yml,并且即便修改了common.yml,也无需重启系统A、B、C。

做法:将common.yml放在ZooKeeper的Znode节点中,系统A、B、C监听着这个Znode节点有无变更,如果变更了,及时响应。

  参考:基于zookeeper实现统一配置管理


2.3 统一命名服务

        统一命名服务与域名一样,即为某一部分资源取一个名字,通过这个名字就可以拿到对应的资源。比如说,现有一个域名www.zz.com,这个域名下有多台机器:

  • 192.168.1.1
  • 192.168.1.2
  • 192.168.1.3
  • 192.168.1.4

别人访问www.zz.com即可访问到这些机器,而不是通过IP去访问。

2.4 分布式锁

锁的概念参考:

        ZooKeeper实现分布式锁:系统A、B、C都去访问/locks节点,访问的时候会创建带顺序号的临时(EPHEMERAL_SEQUENTIAL)节点,比如,系统A创建了id_000000节点,系统B创建了id_000002节点,系统C创建了id_000001节点。

         接着,拿到/locks节点下的所有子节点(id_000000,id_000001,id_000002),并判断自己创建的是不是最小的那个节点。

  • 如果是,则拿到锁。
    • 释放锁:执行完操作后,把创建的节点给删掉。
  • 如果不是,则监听比自己小1的节点变化。

一个例子:

  • 系统A拿到/locks节点下的所有子节点,经过比较,发现自己(id_000000),是所有子节点最小的,所以得到锁。
  • 系统B拿到/locks节点下的所有子节点,经过比较,发现自己(id_000002),不是所有子节点最小的,所以监听比自己小1的节点id_000001的状态。
  • 系统C拿到/locks节点下的所有子节点,经过比较,发现自己(id_000001),不是所有子节点最小的,所以监听比自己小1的节点id_000000的状态。
  • …...
  • 等到系统A执行完操作以后,将自己创建的节点删除(id_000000)。通过监听,系统C发现id_000000节点已经删除了,发现自己已经是最小的节点了,于是顺利拿到锁。
  • ….系统B如上

2.5 集群状态

        在ZooKeeper中创建临时节点,只要系统A挂了,那/groupMember/A这个节点就会删除,通过监听groupMember下的子节点,系统B和C就能够感知到系统A已经挂了。(新增也是同理)

         除了能够感知节点的上下线变化,在主从架构模式下,ZooKeeper还可以实现动态选举Master的功能。只要Znode节点的类型是带顺序号的临时节点(EPHEMERAL_SEQUENTIAL),就能实现动态选举Master的功能。

        Zookeeper会每次选举最小编号的作为Master,如果Master挂了,自然对应的Znode节点就会删除。然后让新的最小编号作为Master,这样就可以实现动态选举的功能了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值