zookeeper探索(5): Znode类型及特点
zookeeper的多个分布式server端共同维护着目录树,如下图所示。目录树类似与操作系统中的文件系统,每个znode都是树形结构中的一个点,但每个znode节点中只保存少量信息,适用于读写频率较低的场景下。每个znode维护一个属性结构,包含版本号、时间戳等信息。
znode包含以下特征:
watches
zookeeper中的watch是只能触发一次。也就是说,如果客户端在指定的znode设置了watch,如果该znode数据发生变更,zookeeper会发送一个变更通知给客户端,同时触发设置的watch事件(类似于windows回调函数,已定义好类型的函数指针)。如果znode数据又发生了变更,客户端在收到第一次通知后没有重新设置该znode的watch,否则zookeeper就不会发送变更通知给客户端,也不会调用对应的watch事件。
zookeeper异步通知设置Watch的客户端。但是zookeeper能够保证在znode的变更生效之后才会异步地通知客户端,然后客户端才能够看到znode的数据变更。由于网络延迟,多个客户端可能会在不同的时间看到znode数据的变更,但是看到变更的顺序是能够保证有序一致的。
znode可以设置两类Watch,一个是Data Watches(该znode的数据变更导致触发Watch事件),另一个是Child Watches(该znode的孩子节点发生变更导致触发Watch事件)。
- 调用getData()和exists() 方法可以设置Data Watches,调用getChildren()方法可以设置Child Watches。
- 调用setData()方法触发在该znode的注册的Data Watches。
- 调用create()方法创建znode,将触发该ZNoznode的Data Watches;
- 调用create()方法创建znode的孩子节点,则触发znode的Child Watches。
- 调用delete()方法删除znode,则同时触发Data Watches和Child Watches,如果该被删除的znode还有父节点,则父节点触发一个Child Watches。
数据访问
节点类型
zookeeper中的的节点分为永久节点、临时节点,在此基础上,又分为顺序节点和非顺序节点;
JAVA API中定义为:
- PERSISTENT:永久节点
- EPHEMERAL:临时节点
- PERSISTENT_SEQUENTIAL:永久顺序节点
- EPHEMERAL_SEQUENTIAL:临时顺序节点
C API中定义为:
- ZOO_PERSISTENT:永久节点
- ZOO_EPHEMERAL:临时节点
- ZOO_PERSISTENT|ZOO_SEQUENTIAL:永久顺序节点
- ZOO_EPHEMERAL|ZOO_SEQUENTIAL:临时顺序节点
顺序节点能够保证节点的唯一性;
当创建顺序Znode的时候,用户可以请求在ZooKeeper的路径结尾添加一个递增的计数。这个计数对于此节点的父节点来说是唯一的,它的格式为"%10d"(10位数字,没有数值的数位用0补充,例如"0000000001")。当计数值大于2^32-1时,计数器将溢出。
发表评论: