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