面试官问你什么是ZooKeeper?把这篇甩给他

栏目: 编程工具 · 发布时间: 6年前

内容简介:前言ZooKeeper相信大家已经听过这个词了,不知道大家对他了解多少呢?ZooKeeper也可以作为直至在了解Kafka的时候,发现Kafka也需要依赖ZooKeeper。Kafka使用ZooKeeper

前言

ZooKeeper相信大家已经听过这个词了,不知道大家对他了解多少呢?ZooKeeper也可以作为 注册中心 。后面听到ZooKeeper的时候,是因为ZooKeeper可以作为 分布式锁 的一种实现。

直至在了解Kafka的时候,发现Kafka也需要依赖ZooKeeper。Kafka使用ZooKeeper 管理自己的元数据配置

这篇文章来写写我学习ZooKeeper的笔记,如果有错的地方希望大家可以在评论区指出。

一、什么是ZooKeeper

从上面我们也可以发现,好像哪都有ZooKeeper的身影,那什么是ZooKeeper呢?我们先去 官网 看看介绍:

面试官问你什么是ZooKeeper?把这篇甩给他

面试官问你什么是ZooKeeper?把这篇甩给他

官网对ZooKeeper的介绍

官网还有另一段话:

ZooKeeper: A Distributed Coordination Service for Distributed Applications

相比于官网的介绍,我其实更喜欢 Wiki 中对ZooKeeper的介绍:

面试官问你什么是ZooKeeper?把这篇甩给他

面试官问你什么是ZooKeeper?把这篇甩给他

wiki介绍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结构图

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

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

  • 持久(Persistent) :当客户端和服务端断开连接后,所创建的Znode(节点) 不会删除

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

面试官问你什么是ZooKeeper?把这篇甩给他

面试官问你什么是ZooKeeper?把这篇甩给他

Znode和Znode的类型

2.1 监听器

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

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

  • 监听Znode节点的 数据变化

  • 监听子节点的 增减变化

面试官问你什么是ZooKeeper?把这篇甩给他

面试官问你什么是ZooKeeper?把这篇甩给他

监听Znode节点的数据有无变化

面试官问你什么是ZooKeeper?把这篇甩给他

面试官问你什么是ZooKeeper?把这篇甩给他

监听子节点的增减变化

没错,通过 监听+Znode节点(持久/短暂[临时]) ,ZooKeeper就可以玩出这么多花样了。

三、ZooKeeper是怎么做到的?

下面我们来看看用ZooKeeper怎么来做:统一配置管理、统一命名服务、分布式锁、集群管理。

3.1 统一配置管理

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

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

于是,我们希望把ASystem.yml、BSystem.yml、CSystem.yml相同的配置项抽取出来成一份 公用 的配置common.yml,并且即便common.yml改了,也不需要系统A、B、C重启。

面试官问你什么是ZooKeeper?把这篇甩给他

面试官问你什么是ZooKeeper?把这篇甩给他

系统A、B、C都使用着这份配置

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

面试官问你什么是ZooKeeper?把这篇甩给他

面试官问你什么是ZooKeeper?把这篇甩给他

系统A、B、C监听着ZooKeeper的节点,一旦common.yml内容有变化,及时响应

参考资料:

3.2 统一命名服务

统一命名服务的理解其实跟 域名 一样,是我们为这某一部分的资源给它 取一个名字 ,别人通过这个名字就可以拿到对应的资源。

比如说,现在我有一个域名 www.java3y.com ,但我这个域名下有多台机器:

  • 192.168.1.1

  • 192.168.1.2

  • 192.168.1.3

  • 192.168.1.4

别人访问 www.java3y.com 即可访问到我的机器,而不是通过IP去访问。

面试官问你什么是ZooKeeper?把这篇甩给他

面试官问你什么是ZooKeeper?把这篇甩给他

通过名称去访问旗下的IP

3.3 分布式锁

锁的概念在这我就不说了,如果对锁概念还不太了解的同学,可参考下面的文章

  • Java锁?分布式锁?乐观锁?行锁?

我们可以使用ZooKeeper来实现分布式锁,那是怎么做的呢??下面来看看:

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

面试官问你什么是ZooKeeper?把这篇甩给他

面试官问你什么是ZooKeeper?把这篇甩给他

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

访问的时候会创建 带顺序号的临时/短暂 (EPHEMERAL_SEQUENTIAL)节点,比如,系统A创建了id_000000节点,系统B创建了id_000002节点,系统C创建了id_000001节点。

面试官问你什么是ZooKeeper?把这篇甩给他

面试官问你什么是ZooKeeper?把这篇甩给他

创建出临时带顺序号的节点

接着,拿到/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如上

3.4集群状态

经过上面几个例子,我相信大家也很容易想到ZooKeeper是怎么" 感知 "节点的动态新增或者删除的了。

还是以我们三个系统A、B、C为例,在ZooKeeper中创建 临时节点 即可:

面试官问你什么是ZooKeeper?把这篇甩给他

面试官问你什么是ZooKeeper?把这篇甩给他

各维护一个临时节点

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

除了能够感知节点的上下线变化,ZooKeeper还可以实现 动态选举Master 的功能。(如果集群是主从架构模式下)

原理也很简单,如果想要实现动态选举Master的功能,Znode节点的类型是带 顺序号的临时节点 (EPHEMERAL_SEQUENTIAL)就好了。

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

最后

这篇文章主要讲解了ZooKeeper的入门相关的知识,ZooKeeper通过 Znode的节点类型+监听机制 就实现那么多好用的功能了!

当然了,ZooKeeper要考虑的事没那么简单的,后面有机会深入的话,我还会继续分享,希望这篇文章对大家有所帮助~


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Elements of Programming

Elements of Programming

Alexander A. Stepanov、Paul McJones / Addison-Wesley Professional / 2009-6-19 / USD 39.99

Elements of Programming provides a different understanding of programming than is presented elsewhere. Its major premise is that practical programming, like other areas of science and engineering, mus......一起来看看 《Elements of Programming》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器