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- 客户端和服务器端在某一个节点上建立连接,并完成了version和zxid的同步
 
- 客户端和服务器端在某一个节点上建立连接,并完成了
- Event.KeeperState.AuthFailed- 授权失败
 
 
- 事件监听- None- 客户端和服务器连接状态发生变化,没有触发事件
 
- NodeCreated- 节点被创建
 
- NodeDeleted- 节点被删除
 
- NodeDataChanged- 节点数据发生变化
 
- NodeChildrenChanged- 子节点被创建、删除或子节点数据发生变化
- 只有一级子节点会触发
 
 
- None
 
- 连接状态监听
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身份。
 
 
- ip
