何为 zookeeper?

一、定义

1、字面含义来看

什么是zookeeper,zookeeper从其单词的字面意思来看就是动物园管理员的意思,为什么要这样起名字呢,其实也跟这些组件有关;就hadoop而言最初名字的来源是作者的孩子有一个名为hadop的大象玩具,刚好这个单词呢也很符合容易记住的特点,然后就以它为hadoop的名字了,后面呢一系列的大数据组件都效仿,都以动物的方式进行命名,然后就有了我们的动物园(Hadoop生态圈) ,动物嘛毕竟是动物,而且还有还这么多,如果没人管那岂不乱了套了,所以就有了我们的zookeeper,zookeeper和其名字的含义一样,就是一个管理者,它是用于分布式环境下的协调工作。
在这里插入图片描述

2、官方的解释

官网上的解释就是,很多分布式应用它们在争夺同一个资源时,有时会因为没有协商从而导致系统出错,其实就是解决一个分布式环境下的同步问题;
在这里插入图片描述
官网上的解释其实也很模糊,只是大概讲了一下zookeeper的作用,我们再来看一下Wiki上的解释:
在这里插入图片描述
可以看到Wiki上面就解释的非常清楚了,大概呢就是说:
ZooKeeper是一个用于维护配置信息,命名,提供分布式同步以及提供组服务的集中式服务。所有这些类型的服务都以某种形式被分布式应用程序使用。每次运行它们时,都会进行很多工作来修复不可避免的错误和竞争条件。ZooKeeper的目的就是将这些不同服务的本质提炼成一个非常简单的界面,以实现集中式协调服务。服务本身是分布式的,并且高度可靠。共识,组管理和状态协议将由服务实现,因此应用程序不需要自己实现它们。这些应用程序的特定用途将包括Zoo Keeper的特定组件和特定于应用程序的约定的混合。

二、zookeeper能做哪些事

1、先来看看它的结构

  • 从Wiki中我们我们发现这样一句话

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

    什么意思呢就是说,zookeeper的节点存储在分层的命名空间当中,有点类似于Linux中的文件系统的树型结构。
    在这里插入图片描述
    Linux的文件系统格式就如上图所示,那么zookeeper这棵树又是怎么样个特点呢?

    • 在zookeeper中每个节点被成为Znode而且Znode分为两种:
      1.(Ephemeral)临时节点或者称为短暂节点,这种节点的特点就是,当客户端于服务端的连接断开后,那么此次连接会话期间创建的临时节点就会被注销掉。
      2.(Persistent)持久节点,这类节点不会在客户端断开的情况下自动删除。
      根据上面的解释,相信大家也已经猜到了,没错zookeeper采用的时C/S架构即由服务端和客户端两部分组成,可以根据下图进行理解:
      在这里插入图片描述
  • 监听器
    在上面我们已经简单知道了ZooKeeper的数据结构了,ZooKeeper还配合了监听器才能够做那么多事的。
    常见的监听场景有以下两项:
    (1)监听Znode节点的数据变化
    因为在zookeeper中的节点是可以保存数据的,所以我们可以监听节点中数据的变化
    在这里插入图片描述
    (2)监听子节点的增减变化
    这一点毋庸置疑,我们可以监听某个节点下子节点的个数。
    在这里插入图片描述

2.统一配置

  • 假如你有很多台服务器,你需要在这个集群上面配置一个分布式的服务,既然是配置服务,那少不了的就是更改配置文件,我的服务器由成百上千台,要是以人手动的方式去更改配置那岂不得配到猴年马月,有运维基础的可能会用同步命令的方式进行统一配置,那就不用说了,zookeeper在这里也可以很好的解决这个问题,比如我们要配置的这个文件叫做 test-site.xml 那么zookeeper的工作机理就如下图所示:
    在这里插入图片描述
    我们的所有服务器都监听/configuration节点中的test-site.xml数据,如果节点中的数据已有变化,就会触发监听器,然后将消息发哦送给正在监听此节点的服务器,服务器收到消息后然后再进行相应的配置修改,这就实现了统一配置;

3.统一命名服务

  • 假如我有一个域名www.nickwiki.com,但是我的服务器有多台,我想别人通过访问我的这个域名然后我自己内部协调条它访问哪一台机器,zookeeper便可以完成这一需求,其实这有点类似于nginx的功能,
    zookeeper的实现方式其实很简单,和上面的统一配置有一点类似,假如我其他机器的IP地址为
    192.168.1.1
    192.168.1.2
    192.168.1.3
    192.168.1.4
    那么就有下图:

在这里插入图片描述
我问在外部仅需访问域名即可,置于到底是访问哪一台服务器就由master端自行选择,这非常有助于服务器的负载均衡,提高服务的可靠性;

4.分布式锁的实现

  • 锁的概念在这我就不说了,可以自行百度进行了解,在这里我们可以使用ZooKeeper来实现分布式锁,那是怎么做的呢??下面来看看:
    假如系统server1、server2、server3都去访问/locks节点
    在这里插入图片描述
    访问的时候会创建带顺序号的临时/短暂(EPHEMERAL_SEQUENTIAL)节点,比如,serve1创建了id_000000节点,serve2创建了id_000002节点,serve3创建了id_000001节点。
    在这里插入图片描述

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

    如果是,则拿到锁。

    释放锁:执行完操作后,把创建的节点给删掉

    如果不是,则监听比自己要小1的节点变化

举个例子:

  • server1拿到/lock节点下的所有子节点,经过比较,发现自己(id_000000),是所有子节点最小的。所以得到锁

  • server2拿到/lock节点下的所有子节点,经过比较,发现自己(id_000002),不是所有子节点最小的。所以监听比自己小1的节点id_000001的状态

  • server3拿到/lock节点下的所有子节点,经过比较,发现自己(id_000001),不是所有子节点最小的。所以监听比自己小1的节点id_000000的状态
    ……

  • 等到系统server1执行完操作以后,将自己创建的节点删除(id_000000)。通过监听,server3发现id_000000节点已经删除了,发现自己已经是最小的节点了,于是顺利拿到锁
    ….server2如上

5.集群状态

  • 在很多分布式环境当中我们需要监控整个集群的状态,比如那一台机器宕机了,哪一台机器又重启了,这都需要我们进行监控,又比如HA(高可用)模式下的hadoop有多个namenode节点,这些namenode之间就有主从之分,在众多namnode当中只有一个namenode处于active状态,其他全部处于standby状态,只有当处于active状态的namenode出问题后,才会在待命状态下的namenode中重新选举出一个作为active的namenode出来,这当中的active-namenode的监控,和后面namnode的选举就需要用到zookeeper来实现,下面就简单的来说一下zookeeper是如何进行监控集群状态的;

在这里插入图片描述

集群中每台机器都在/cluster节点上维护一个子节点,如果server1挂掉了,那么它就会自动删除掉/cluster/s1节点,然后整个系统通过监听/cluster下中的所有子节点就可以知道集群当中所有机器的状态;
前面提到的hadoop中active-namenode的选举过程其实也可以参照前面分布式锁的方式进行实现;

  • 首先当前的active-namenode挂掉了,那么通过监听/cluster节点下的子节点就可以知道这个消息。
  • 然后集群知道这个消息后就会通知现在还存活的其他namenode,然后它们就会各自在zookeeper中进行注册一个供选举用且有顺序的临时节点,然后通过比较自己创建的节点的编号是否是最小的;
    (1)如果是那么他就可以切换身份由standby状态转为active状态
    (2)不是最小时那么他就会放弃此次争夺

三、性能情况

  • zoookeeper本身自项目启动之日起目标就是高性能的一个分布式协调框架,根据雅虎做的实验来看,也确实如此:
    在这里插入图片描述
    在读取次数超过写入次数的应用程序中,由于写入操作会涉及同步所有服务器的状态,因此该操作特别耗费性能。(但对于协调服务,通常情况下,读取次数多于写入次数。)

四、简单的API

ZooKeeper的设计目标之一是提供一个非常简单的编程界面。因此,它仅支持以下操作:

  • create:在树中的某个位置创建一个节点

  • delete:删除节点

  • exists :测试节点是否存在于某个位置

  • get data:从节点读取数据

  • set data:将数据写入节点

  • get children:获取节点子节点的列表

  • sync:等待数据传播

今天简单的讲了一下zookeeper的工作原理和用途,其实呢在实际当中远远没有上面所说的这么简单,要真的想深层次的学习于理解zookeeper还需要多看一些专业的文档,才能更全面的了解zookeeper,如果大家发现博文中出现什么问题,欢迎在评论区下留言探讨。

发布了27 篇原创文章 · 获赞 62 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42359956/article/details/105403277