ZK数据结构
zk整体保存数据的结构类似于文件系统的树形结构。但是每个节点可以拥有一个名字,并作为一个文件夹包括多个其他节点,同时还可以保存数据。
需要注意:
- 空字符(\u0000)不能作为名字
- \u0001 - \u0019 和\u007F - \u009F最好不要作为名字的一部分,因为他们表示的字符不好显示或者因为他们可以被转换成多种表现形式
- \ud800 -uF8FFF, \uFFF0-uFFFF, \uXFFFE -
\uXFFFF (where X is a digit 1 - E), \uF0000 - \uFFFFF 是不允许使用的 - “.”可以成为名字的一部分,但是名字不能只含有”.”
- zookeeper是保留字段
常用命令:
create /path data --创建节点/path, 并存储数据data
delete /path --删除节点/path
exists /path --检查节点/path是否存在
setData /path data --设置节点/path的数据
getData /path --获取节点/path的数据
getChildren /path --获取节点/path的子节点
1. Znodes
每个节点就是一个Znode,Znode有四种: 持久节点,临时节点,持久连续节点,临时连续节点
- 持久节点只能通过delete调用才能删除, 可用于存储一些应用数据(即使它的创建者不存在了,但这些数据依然需要保存),如Master-Worker中的任务分配信息。
- 临时节点,会在客户端崩溃或断开连接时被删除,或者通过delete调用。比如, 在Master-Worker中的Master和Worker节点均采用临时节点,当Master崩溃或连接断开, 该节点将自动删除,既而才能进行Master选举,临时节点暂时还不支持有子节点,即便以后支持, 其子节点也必须是临时节点。
- 连续节点:一个Znode可以被设置为sequential,连续节点将被分配一个唯一且连续的整数, 该整数会追加到节点的path后,如客户端创建一个path为/task/task-的连续节点,最终节点的path会变成/task/task-1。
客户端通过注册来接收节点变化的通知。注册接收通知通过Watch 来设置。而Watch是一次性操作,也就是只能接收一次通知,如果需要继续得到通知, 则需要再次Watch。
每个Znode保存的数据的读写都是原子性的,读取会获得一个Znode所有的数据,写入会修改一个Znode所有的数据。Znode的数据访问管理通过每个Znode维护的访问管理列表(Access Control List,ACL)实现。
2. 时间记录
zookeeper有多种方式记录时间:
- Zxid: zk状态每次的改变会收到一个Zxid(zookeeper transaction id),这个表示每个改变的顺序。每个改变都会有一个全局唯一的Zxid,并且这个Zxid是递增的。
-
version number:每个Znode都有三个版本号,Znode的每次修改都会增加这三个中的一个版本号
- version(Znode的数据改变,就会更新这个版本号)
- cversion(子节点改变)
- aversion(ACL改变)
- Ticks: 各种尝试次数。配置里面tickTime这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。
- Real Time: zk一般不用实际时间,除了在新建Znode和更新时往Znode的统计中会放入实际时间
3. Znode的统计信息结构
- czxid:记录znode创建时的zxid
- mzxid:记录znode最近一次修改时的zxid
- ctime:记录znode创建时的时间
- mtime:记录znode最近一次修改时的时间
- version:Znode的数据改变,就会更新这个版本号
- cversion:子节点改变
- aversion:ACL改变
- ephemeralOwner:如果是临时节点,则记录拥有者的session id,如果不是临时节点,则为0
- dataLength:znode记录的数据长度
- numChildren:子节点的个数