ZooKeeper 是一个分布式协调服务的开源框架。主要用来解决分布式集群中应用系统的一致性的问题。其本质上是一个分布式的小文件存储系统。提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中 的节点进行有效管理。从而来维护和监控你存储的数据的状态变化。将通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。

  • Paxos算法:
  • 虚拟同步技术(virtual synchrony):

1.1 Zookeeper 基础

  • znode : 类似于文件系统的层级树状结构
image-20210617224318288

​ 在这个文件系统里面,是一个主-从结构的示例

  • ZooKeeper API暴露的方法:

    • create/path data : 创建一个名为 /path 的 znode 节点,并包含数据 data
    • delete/path : 删除 /path 的 znode
    • exist/path : 检查是否存在名为 /path 的节点
    • setData/path data : 设置名为 /path 的 znode 的数据为 data
    • getData/path : 返回名为 /path 节点的数据信息
    • getChildren/path : 返回所有 /path 节点的所有子节点列表

    ZooKeeper 不允许局部写入或读取znode节点的数据

  • znode 的不同类型

    当新建znode时,还需要指定该节点的类型(mode),不同的类型 决定了znode节点的行为方式。

    • 持久节点和临时节点 : 持久的znode,如/path,只能通过调用delete来进行 删除。临时的znode与之相反,当创建该节点的客户端崩溃或关闭了与 ZooKeeper的连接时,这个节点就会被删除。

      一个临时znode,在以下两种情况下将会被删除: 1.当创建该znode的客户端的会话因超时或主动关闭而中止时。 2.当某个客户端(不一定是创建者)主动删除该节点时。

    • 有序节点 : 一个有序znode节 点被分配唯一个单调递增的整数。当创建有序节点时,一个序号会被追加到路径之后。有序znode通过 提供了创建具有唯一名称的znode的简单方式。同时也通过这种方式可以直观地查看znode的创建顺序。

    综上,znode一共有4种类型:持久的(persistent)、临时的 (ephemeral)、持久有序的(persistent_sequential)和临时有序的 (ephemeral_sequential)。

  • 监视与通知

    ZooKeeper通常以远程服务的方式被访问,如果每次访问znode时, 客户端都需要获得节点中的内容,这样的代价就非常大。因为这样会导致更高的延迟,而且ZooKeeper需要做更多的操作。

    为此,基于通知的机制 : 客户端向ZooKeeper注册需要接收通知的 znode,通过对znode设置监视点(watch)来接收通知。

image-20210617231554521
  • 版本

    每一个znode都有一个版本号,它随着每次数据变化而自增。使用版本来阻止并行操作的不一致性。

image-20210617233008097

1.2 Zookeeper 架构

  • ZooKeeper服务器端运行于两种模式下:独立模式(standalone)和 仲裁模式(quorum)。独立模式几乎与其术语所描述的一样:有一个单独的服务器,ZooKeeper状态无法复制。在仲裁模式下,具有一组 ZooKeeper服务器,我们称为ZooKeeper集合(ZooKeeper ensemble),它们之前可以进行状态的复制,并同时为服务于客户端的请求。

    这里重点介绍下 仲裁模式 : 在仲裁模式下,ZooKeeper复制集群中的所有服务器的数据树。但如果让一个客户端等待每个服务器完成数据保存后再继续,延迟问题将无法接受。例如有5台机器,必须有3台进行操作确认;4台机器,必须有3台进行操作确认;可以看出,奇数台的性价比高些。

  • 会话

    在对ZooKeeper集合执行任何请求前,一个客户端必须先与服务建立会话。会话的概念非常重要,对ZooKeeper的运行也非常关键。客户端提交给ZooKeeper的所有操作均关联在一个会话上。当一个会话因某种原因而中止时,在这个会话期间创建的临时节点将会消失。

    客户端通过TCP协议与服务器进行连接并通信, 但当会话无法与当前连接的服务器继续通信时,会话就可能转移到另一个服务器上。会话提供了顺序保障,这就意味着同一个会话中的请求会以FIFO(先进先出)顺序执行

2.3 开始使用ZooKeeper(MAC OS)

  • 首先从官网下载zookeeper压缩包 https://zookeeper.apache.org/releases.html

  • 找到需要下载的包 Apache ZooKeeper 3.7.0 Source Release(asc, sha512)

  • 得到压缩包 apache-zookeeper-3.7.0-bin.tar.gz

  • 进入相应文件夹,解压压缩包

    tar -zxvf ./apache-zookeeper-3.7.0-bin.tar.gz
    
  • 进入解压后的文件目录,修改配置文件,位于conf文件夹下, 重命名为 zoo.cfg

  • 修改 zoo.cfg, 可以修改 DataDir 文件夹位置,用来zookeeper建目录用的

    image-20210623224859656
  • 启动

    ./bin/zkServer.sh start
    
    image-20210623225209771

    上面这个命令是后台运行

    如果想在前台运行并输出命令,可以用

    ./bin/zkServer.sh start-foreground
    
  • 暂停

    ./bin/zkServer.sh stop
    
  • 会话建立

    ./bin/zkCli.sh
    
    image-20210623230247625
  • 建立节点,删除并退出会话

    image-20210623230633970