每个节点在zookeeper中用znode表示。znodes 包含数据变更和acl变更的版本号。znode同样包含时间戳。版本号和时间戳用来帮助zookeeper验证缓存或者协调更新。每次znode数据发生变化都会使版本号增加。例如,每次client接受数据时都会接收到数据的版本号。当client更新或者删除数据时必须给znode提供数据的版本号。如果提供的版本号与实际的版本号不匹配,更新操作会失败。
znode是程序访问的主要实体类。包含如下特性:
Watches
clients 可以为znode设置watch。znode发生改变将会触发watch。当一个watch触发,zookeeper会向client发送通知。
Data Access
在namespace中存储在每个znode上的数据发生的读写操作都是原子性的。读一个znode上的全部数据或者替换掉全部数据都是原子性的。每个znode都有一个Access Contron List(ACL)用来约束哪些人可以执行相应操作。
Zookeeper不是用来做数据库或者存贮大对象的。相反,它只负责协调数据。数据可以来自配置表单、结构化信息等等。这些数据的有一个共同的特点那就是都很小:以Kb为测量单位。Zookeeper的client和server的实现类都会验证znode存储的数据是否小于1M,但是数据应该比平均值小的多。操作大数据将会触发一些消耗时间的额外操作并且影响潜在的操作,因为需要额外的时间在网络和存储介质上转移数据。如果有大数据需要存储,通常的办法是把这些数据存储在专门的大型文件系统上,例如NFS或者HDFS,然后把存储介质的位置存在zookeeper上。
Ephemeral Nodes
zookeeper有一种znode是ephemeral nodes。这些znode只在session存在期间有效。当session结束的时候这些ephemeral nodes被删除。所以ephemeral znodes不能有子节点。
Sequence Nodes -- Unique Naming
当创建一个znode时候,你也可以要求zookeeper在path的结尾单调递增。计数器对每一个znode来说都是唯一的。计数器使用%010d格式化--例如<path>0000000001。注意:计数器使用一个singed int(4bytes)来存储下一个序列值。所以计数器达到2147483647 后会溢出。
原文:http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html#sc_zkDataModel_znodes