一.什么是zookeeper

  • zookeeper 主要是服务于分布式服务,可以用zookeeper来做:统一配置管理,统一命名服务,分布式锁,集群管理。
  • 使用分布式系统就无法避免对节点管理的问题(需要是实时感知节点的状态,对接点进行统一管理等等),而由于这些问题处理起来相对麻烦,提高了系统的复杂性,zookeeper作为一个可以通用解决这些问题的中间件就应运而生了。

二.为什么zookeeper 可以干这么多?

从上面我们知道,可以用zookeeper来做:统一配置管理,统一命名服务,分布式锁,集群管理

  • 这里我们先不管 统一配置管理,统一命名管理,分布式锁,集群管理每个具体的含义

那么为什么zookeeper可以干这么多事?来看看zookeeper究竟是何方神物,在Wiki中其实也有提到

ZooKeeper nodes store their data in a hierarchical name space, much like a file system or a tree data structure

Zookeeper 的数据结构,跟Unix文件系统非常类似,可以看作一棵树,每个节点叫做ZNode。每个接单可以通过路径来表示,结构如下

Zookeeper结构图
那Zookeeper这颗树有什么特点呢?Zookeeper的节点我们称之为Znode,Znode类型分为两种:

  • 临时节点: 当客户端和服务器断开连接后,此类节点会 自动删除
  • 持久节点: 当客户端和服务器断开连接后,此类节点 不会删除

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

2.1监听器

在上面我们已经简单知道了Zookeeper的数据结构了,Zookeeper还配合监听器才能做这么多事

常见的监听场景有以下两项:

  • 监听Znode节点数据变化
  • 监听子节点的增量变化

通过 监听+Znode节点(持久/临时节点),Zookeeper 就可以玩出这么多花样

Zookeeper 是怎么做到的?

下面我们来看看Zookeeper是怎么来做:统一配置管理,统一命名服务,分布式锁,集群管理

3.1统一配置管理

比如我们现在有三个系统A B C,他们分别有三份配置,ASystem.yml,BSystem.yml,CSystem.yml,然后这三份配置又非常类似,很多配置项几乎都一样

  • 此时,如果我们要改变其中一份配置项的信息,很可能另外两份都要修改,改变了配置项的信息很可能就要重启系统

于是,我们希望将三份配置文件中,相同的配置项抽取出来一份公共的配置文件Common.yml,并且即便改了common.yml文件,也不需要重启A B C 系统

做法我们可以将Common.yml这份配置放在Zookeeper的Znode节点中,系统A B C监听着这个Znode节点有无变更,如果变更了,及时响应

3.2 统一命名服务

统一命名服务可以理解为域名,是我们为某一部分资源取得一个名字,别人可以根据这个名字拿到对应的资源

比如,我们现在有一个域名叫 www.java1234.com,但是我们这个域名下面有多台机器:

  • 192.168.1.1
  • 192.168.1.2
  • 192.168.1.3
  • 192.168.1.4

别人通过访问 www.java1234.com 即可访问到我的机器,而不是通过ip访问

3.3 分布式锁

系统A B C 都去访问/locks节点

访问的时候会创建 带顺序号的临时节点,比如系统A创建了id_000000节点,系统B创建了id_000001,系统C创建了id_000002节点,接着拿到/locks节点下的所有子节点,判断自己创建的是不是最小那个节点:

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

举个例子:

  • 系统A 拿到/locks 节点下的所有的子节点,经过比较发现自己(id_000000),是所有子节点最小的,所以得到锁
  • 系统B 拿到/locks 节点下的所有的子节点,经过比较发现自己(id_000001),不是所有子节点最小的,所以监听比自己小1的节点(id_000000)的状态
  • 系统B 拿到/locks 节点下的所有的子节点,经过比较发现自己(id_000002),不是所有子节点最小的,所以监听比自己小1的节点(id_000001)的状态

3.4集群状态

经过上面的例子,我相信大家很容易想到Zookeeper是怎么感知,节点动态新增或删除的了,我们还是以三份系统威力,在Zookeeper中创建临时节点即可:

只要A系统挂掉,那么对应的临时节点,也就会删除,其他的系统通过监听父节点下的子节点,就能感知A系统挂掉了
除了感知即诶单的上下线变化,Zookeeper还可以实现动态的选举Master的功能(如果集群是主从架构的模式下)

原理也很简单,如果想实现动态选举master的功能,Znode节点的类型是带顺序好的临时节点就好了
Zookeeper 会每次选举最小编号的作为master,如果master挂掉了,自然对应的Znode节点就会被删除,然后让最小编号作为master,这样就能实现动态选举的功能了

最后

这篇文章主要讲解了Zookeeker的入门相关知识,Zookeepe通过Znode节点类型+监听机制就实现了这么多好用的功能了!
当然,Zookeeper 要考虑的事情没那么简单,后面有机会深入的话,我们会继续分享,希望这篇文章对大家有所帮助

Logo

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

更多推荐