Zookeeper 简单介绍

153 阅读4分钟

Zookeeper 简介

Zookeeper 基本概念

  1. 集群角色

    • Leader
    • Follower
    • Observer(不参与 Leader 选举过程,不参与写操作的过半成功策略 ⇒ 可以在不影响写性能的情况下提升集群性能)
  2. 会话(Session)

    • 一个客户端连接是指客户端和服务端之间的一个 TCP 长连接
  3. 数据节点(ZNode)

    • 数据模型(ZNode Tree)中的数据单元,由一系列使用/ 进行分割的路径表示,是 Zookeeper 中最小的数据单元。

    • ZNode 的类型

      • 持久节点(Persistent): 节点创建后会一直存在服务器,直到删除操作主动清除
      • 持久顺序节点(Persistent_Sequential): 有顺序的持久节点,实质是创建节点时,会在节点名后加一个数字后缀,来表示其顺序
      • 临时节点(Ephemeral): 生命周期与客户端会话绑定在一起,客户端会话结束,节点会被删除。临时节点不能创建子节点
      • 临时顺序节点(Ephemeral_Sequential): 有顺序的临时节点
    • 节点状态信息

      • cZxid: Create ZXID,表示节点被创建时的事务 ID

      • ctime: Create Time,表示节点创建时间

      • mZxid: Modified ZXID, 表示节点最后一次被修改时的事务ID

      • mtime: Modified Time, 表示节点最后一次被修改的时间

      • pZxid: 表示该节点的子节点列表最后一次被修改时的事务ID。只有子节点列表变更才会更新 pZxid,子节点内容变更不会更新

      • cversion: 当前子节点的版本

      • dataVersion: 当前节点内容版本

      • aclVersion: 当前节点的 ACL 版本

      • ephemeralOwner: 创建该临时节点时的会话 sessionID,如果是持久节点值为0

      • numChildren: 直系子节点数

  4. 事件监听器(Watcher)

    • Zookeeper 允许用户在指定节点上注册一些 Watcher,并在一些特定事件触发的时候,Zookeeper 服务端会将事件通知到感兴趣的客户端,该机制是Zookeeper 实现分布式协调服务的重要特性。
    • 工作流程:客户端在向 Zookeeper 服务器注册的同时,会将 Watcher 对象存储在客户端的 WatcherManager 当中。当 Zookeeper 服务器触发 Watcher 事件后,会向客户端发送通知,客户端线程从 WatcherManager 中取出对应的 Watcher 对象来执行回调逻辑。
  5. ACL(Access Control Lists)

    从三个方面来理解 ACL 机制:权限模式(Scheme)、授权对象(ID)、权限(Permission),通常使用 scheme:id:permission 来标识一个有效的 ACL 信息

    • 权限模式(Scheme)确定权限验证过程中使用的检验策略,有以下四种模式:

      • **IP:**按 IP 地址粒度来进行权限控制
      • **Digest:**使用username:password 形式的权限来进行权限控制,当使用此模式,zookeeper 会先后对其进行 SHA-1 加密和 BASE64 编码
      • **World:**数据节点的访问权限对所有用户开放,可看作一种特殊的 Digest 模式
      • **Super:**超级用户可对任意 zookeeper 上的数据节点进行任何操作
    • 授权对象(ID):权限赋予的用户或一个指定实体,不同权限模式下,授权对象不同

    • 权限(Permission),Zookeeper 其定义了五种权限:

      • CREATE: 创建子节点的权限
      • READ: 获取节点数据和子节点列表的权限
      • WRITE: 更新节点数据的权限
      • DELETE: 删除子节点的权限
      • ADMIN: 设置节点 ACL 的权限

Zookeeper 命令行操作

  1. 连接服务器

    #连接本地服务器
    zkCli.sh
    #连接指定服务器
    zkCli.sh -server ip:port
    
  2. 创建节点

    # -s -e分布指定节点特性,顺序或临时节点,不指定创建持久节点;acl 用来进行权限控制
    create [-s][-e] path data acl
    
  3. 读取节点

    # 列出指定节点下所有直系子节点,
    ls path
    # 获取指定节点的数据内容和属性信息
    get path
    
  4. 更新节点

    # 更新指定节点的数据内容
    set path data [version]
    
  5. 删除节点

    # 删除指定节点, 若删除的节点存在子节点,那么无法删除该节点,必须先删除子节点
    delete path [version]
    

Zookeeper API 操作

  1. 原生API

    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.14</version>
    </dependency>
    

    核心类:ZooKeeper

  2. ZkClient(Github开源):在原生 API 之上进行包装,更易用,在内部实现了诸如 Session 超时重连、Watcher 反复注册等功能

    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.2</version>
    </dependency>
    

    核心类:ZkClient

  3. Curator 客户端(Netflix开源):易用,解决许多细节开发工作,提供 Fluent 的编程风格支持

    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>2.12.0</version>
    </dependency>
    

    使用 CuratorFrameworkFactory 工厂类来创建客户端(newClient() / builder()), client.start()开启会话

Zookeeper 应用场景