【zookeeper】基础知识及操作

是什么?

       引用官方的说法:“Zookeeper是一个高性能,分布式的,开源分布式应用协调服务。它提供了简单原始的功能,分布式应用可以基于它实现更高级 的服务,比如同步,配置管理,集群管理,命名空间。它被设计为易于编程,使用文件系统目录树作为数据模型。服务端跑在java上,提供java和C的客户端 API”。也可以理解为:zookeeper = 文件系统+通知机制。

  • 功能作用:命名服务、配置维护、集群管理、分布式消息同步和协调机制、负载均衡、对Dubbo支持。Zoopkeeper提供了一套很好的分布式集群管理的机制,就是它这种基于层次型的目录树的数据结构,并对树中的节点进行有效管理,从而可以设计出多种多样的分布式的数据管理模型,作为分布式系统的沟通调度桥梁。
  • 下载地址:https://zookeeper.apache.org/
                  image.png

安装配置

linux下安装

前期准备:官网下载安装包,本次版本zookeeper-3.4.9.tar.gz,拷贝至/opt目录下。

  1. 解压:

    1
    tar -zxvf zookeeper-3.4.9.tar.gz
  2. 新建专属zookeeper目录:mkdir /myzookeeper,随后将上一步解压的zookeeper内容拷贝进/myzookeeper目录内,拷贝:

    1
    cp -rf zookeeper-3.4.9 /myzookeeper/ zookeeper-3.4.9
  3. 进入conf文件夹,拷贝zoo_sample.cfg改为zoo.cfg:

    1
    cp zoo_sample.cfg zoo.cfg
  4. 开启服务以及客户端连接
    a) 进入/myzookeeper/zookeeper-3.4.9/bin路径下
    b) 启动服务:./zkServer.sh start
    c) 停止服务:./zkServer stop
    d) 客户端连接:./zkCli.sh
    e) 客户端退出:quit

HelloWorld

       查看+获得zookeeper服务器上的数据存储信息,Zookeeper维护一个类似文件系统的数据结构。
              image54bc0.png

       ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个Znode。很显然zookeeper集群自身维护了一套数据结构。这个存储结构是一个树形结构,其上的每一个节点,我们称之为”znode”,每一个znode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。
              imagef5df3.png

数据模型Znode

数据模型

       zookeeper内部维护了一套类型UNIX的树形数据结构:由znode构成的集合,znode的集合又是一个树形结构,每一个znode又有很多属性进行描述。Znode维护了一个stat结构体,stat包含数据变化的版本号、访问控制列表变化、时间戳等等。版本号和时间戳一起可让Zookeeper验证缓存和协调更新。每次znode的数据发生了变化,版本号就增加。例如,无论何时客户端检索数据,它也一起检索数据的版本号。并且当客户端执行更新或删除时,客户端必须提供他正在改变的znode的版本号。如果它提供的版本号和真实的数据版本号不一致,更新将会失败。
              imageb8b4b.png

数据类型

              image408b2.png
znode是由客户端创建的,它和创建它的客户端的内在联系,决定了它的存在性:

  • PERSISTENT-持久化节点:创建这个节点的客户端在与zookeeper服务的连接断开后,这个节点也不会被删除(除非您使用API强制删除)。
  • PERSISTENT_SEQUENTIAL-持久化顺序编号节点:当客户端请求创建这个节点A后,zookeeper会根据parent-znode的zxid状态,为这个A节点编写一个全目录唯一的编号(这个编号只会一直增长)。当客户端与zookeeper服务的连接断开后,这个节点也不会被删除。
  • EPHEMERAL-临时目录节点:创建这个节点的客户端在与zookeeper服务的连接断开后,这个节点(还有涉及到的子节点)就会被删除。
  • EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点:当客户端请求创建这个节点A后,zookeeper会根据parent-znode的zxid状态,为这个A节点编写一个全目录唯一的编号(这个编号只会一直增长)。当创建这个节点的客户端与zookeeper服务的连接断开后,这个节点被删除。
  • 另外,无论是EPHEMERAL还是EPHEMERAL_SEQUENTIAL节点类型,在zookeeper的client异常终止后,节点也会被删除

基础命令

常用基础命令

       Zookeeper表现为一个分层的文件系统目录树结构,不同于文件系统之处在于:zk节点可以有自己的数据,而unix文件系统中的目录节点只有子节点。 一个节点对应一个应用,节点存储的数据就是应用需要的配置信息。
              image73822.png

四字命令

       zookeeper支持某些特定的四字命令,他们大多是用来查询ZK服务的当前状态及相关信息的,通过telnet或nc向zookeeper提交相应命令,如:echo ruok | nc 127.0.0.1 2181
       运行公式:echo 四字命令 | nc 主机IP zookeeper端口
              imagec508a.png

Java Client

请参考:https://github.com/liuzhongpo/af-learning/tree/master/08-zookeeper

通知机制

session

客户端使用某种语言绑定创建一个到服务的句柄时,就建立了一个ZooKeeper会话。会话创建后,句柄处于CONNECTING状态,客户端库会试图连接到组成ZooKeeper服务的某个服务器;连接成功则进入到CONNECTED状态。通常操作中句柄将处于这两个状态之一。如果发生不可恢复的错误,如会话过期、身份鉴定失败,或者应用显式关闭,则句柄进入到CLOSED状态。下图显式了ZooKeeper客户端可能的状态转换:
              image63f03.png

watch

通知机制

  • 通知机制:客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。是一种 异步回调的触发机制。
  • ZooKeeper 支持watch(观察)的概念。客户端可以在每个znode结点上设置一个观察。如果被观察服务端的znode结点有变更,那么watch就会被触发,这个watch所属的客户端将接收到一个通知包被告知结点已经发生变化,把相应的事件通知给设置Watcher的Client端。
  • Zookeeper里的所有读取操作:getData(),getChildren()和exists()都有设置watch的选项

watch事件理解

  • 一次触发
    当数据有了变化时zkserver向客户端发送一个watch,它是一次性的动作,即触发一次就不再有效,类似一次性纸杯。只监控一次。如果想继续Watch的话,需要客户端重新设置Watcher。因此如果你得到一个watch事件且想在将来的变化得到通知,必须新设置另一个watch。
  • 发往客户端
    Watches是异步发往客户端的,Zookeeper提供一个顺序保证:在看到watch事件之前绝不会看到变化,这样不同客户端看到的是一致性的顺序。
    在(导致观察事件被触发的)修改操作的成功返回码到达客户端之前,事件可能在去往客户端的路上,但是可能不会到达客户端。观察事件是异步地发送给观察者(客户端)的。ZooKeeper会保证次序:在收到观察事件之前,客户端不会看到已经为之设置观察的节点的改动。网络延迟或者其他因素可能会让不同的客户端在不同的时间收到观察事件和更新操作的返回码。这里的要点是:不同客户端看到的事情都有一致的次序。
    
  • 为数据设置watch
    节点有不同的改动方式。可以认为ZooKeeper维护两个观察列表:数据观察和子节点观察。getData()和exists()设置数据观察。getChildren()设置子节点观察。此外,还可以认为不同的返回数据有不同的观察。getData()和exists()返回节点的数据,而getChildren()返回子节点列表。所以,setData()将为znode触发数据观察。成功的create()将为新创建的节点触发数据观察,为其父节点触发子节点观察。成功的delete()将会为被删除的节点触发数据观察以及子节点观察(因为节点不能再有子节点了),为其父节点触发子节点观察。
    观察维护在客户端连接到的ZooKeeper服 务器中。这让观察的设置、维护和分发是轻量级的。客户端连接到新的服务器时,所有会话事件将被触发。同服务器断开连接期间不会收到观察。客户端重新连接 时,如果需要,先前已经注册的观察将被重新注册和触发。通常这都是透明的。有一种情况下观察事件将丢失:对还没有创建的节点设置存在观察,而在断开连接期 间创建节点,然后删除。
  • 时序性和一致性
    Watches是在client连接到Zookeeper服务端的本地维护,这可让watches成为轻量的,可维护的和派发的。当一个client连接到新server,watch将会触发任何session事件,断开连接后不能接收到。当客户端重连,先前注册的watches将会被重新注册并触发。
    关于watches,Zookeeper维护这些保证:
    (1)Watches和其他事件、watches和异步恢复都是有序的。Zookeeper客户端保证每件事都是有序派发
    (2)客户端在看到新数据之前先看到watch事件
    (3)对应更新顺序的watches事件顺序由Zookeeper服务所见
文章目录
  1. 1. 是什么?
  2. 2. 安装配置
    1. 2.1. linux下安装
    2. 2.2. HelloWorld
  3. 3. 数据模型Znode
    1. 3.1. 数据模型
    2. 3.2. 数据类型
    3. 3.3. 基础命令
      1. 3.3.1. 常用基础命令
      2. 3.3.2. 四字命令
  4. 4. Java Client
  5. 5. 通知机制
    1. 5.1. session
    2. 5.2. watch
      1. 5.2.1. 通知机制
      2. 5.2.2. watch事件理解
|