zookeeper探索(5): Znode类型及特点

2016-5-10 sunsmile zookeeper

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时,计数器将溢出。


发表评论:

Powered by emlog 京ICP备15044591号-1