Zookeeper序列化使用的是Jute

数据模型

Zookeeper的数据模型和文件系统类似,每一个节点称为znode.是Zookeeper中的最小数据单元。每一个znode上都可以保存数据和挂载子节点。从而构成一个层次话的属性结构。默认存储大小为3M

zNode

  • 节点特性
    • 持久化节点
      • 节点创建后会一致存在zookeeper服务器上,直到主动删除
    • 持久化有序节点
      • 节点创建后会一直存在zookeeper服务器上,直到主动删除
    • 临时节点
      • 临时节点的声明周期和客户端的会话保持一致。
      • 当客户端会话失效,该节点自动清理。
        • 会话失效后,会有一个重连机制,短时间内此节点存在,过了重连时间后,该节点自动清理
    • 临时有序节点
      • 在临时节点上多了一个顺序性特性
  • 节点名称区分大小写
  • 子节点
    • 创建子节点操作要点
      • 先创建父节点
        • 直接创建父和子节点,会报错:Node does not exist
      • 一定要输入完整的路径(包含父路径)
      • 删除节点一定要从子节点逐层向上删除
    • 没有命令可以显示节点数
      • 想要知道节点数,可以自己递归计算

数据存储

  • Zookeeper中数据的两种类型
    • 内存数据
    • 磁盘数据

Zookeeper会把节点信息存到内存里(org.apache.zookeeper.server.DataTree类中的private final ConcurrentHashMap<String, DataNode> nodes = new ConcurrentHashMap<String, DataNode>();),Zookeeper会定时把数据存储在磁盘上。

会话

客户端和zookeeper建立一个连接(无所谓哪个节点)

  • 会话状态

NOT CONNECTED->CONNECTING->CONNECTED->CLOSED

Watcher

  • Zookeeper提供了分布式数据发布/订阅,Zookeeper允许客户端向服务器注册一个watcher监听。
  • 当服务器端的节点触发指定事件的时候会触发watcher,服务端会向客户端发送一个事件通知
  • watcher的通知是一次性,一旦触发一次通知后,该watcher就失效。如果需要永久监听,则需要反复注册
  • 不关心客户端是否收到,只关心发出去了。
  • 监听类型
    • 连接状态监听
      • Event.KeeperState.Expired
        • 客户端和服务器之间在一个tickTime事件周期之内,客户端没有收到服务器端的通知,则认为当前会话已过期 ,客户端会废弃当前连接,并重建连接
      • Event.KeeperState.Disconnected
        • 客户端主动断开
      • Event.KeeperState.SyncConnected
        • 客户端和服务器端在某一个节点上建立连接,并完成了versionzxid的同步
      • Event.KeeperState.AuthFailed
        • 授权失败
    • 事件监听
      • None
        • 客户端和服务器连接状态发生变化,没有触发事件
      • NodeCreated
        • 节点被创建
      • NodeDeleted
        • 节点被删除
      • NodeDataChanged
        • 节点数据发生变化
      • NodeChildrenChanged
        • 子节点被创建、删除或子节点数据发生变化
        • 只有一级子节点会触发

ACL

官方介绍文档

  • Zookeeper提供控制节点访问权限的功能,用于有效的保证Zookeeper中数据的安全性。避免误操作而导致系统出现重大事故
  • 权限角色
    • CREATE
    • READ
    • WRITE
    • DELETE
    • ADMIN
  • Builtin ACL Schemes
    • ip
      • 指定ip授权
    • digest(常用)
      • username:password组成字符串,通过API转换为加密内容设置到权限内
    • world
      • 开放式的权限控制模式。所有人。
    • auth(super)
      • 超级用户,可以对zookeeper上的数据节点进行操作。
    • x509
      • 将客户端X500 Principal作为ACL ID身份。