一、Zookeeper数据模型

1、Zookeeper使用文件系统目录树作为数据模型,如下图所示。

zookeeper 创建目录 create zookeeper数据目录_数据

其具有如下的一些特点:

  • 以/作为根节点
  • 树形结构中的每个节点叫做Znode
  • 每个节点用于存储数据,所以每个节点都有数据(byte[]类型),包括节点内容数据,版本数据等等,也可以有子节点
  • 可以对Znode中的数据进行读写操作
  • 节点路径没有相对路径之说,只有绝对路径,比如这里的node1-2节点的路径只能是绝对路径/node1/node1-2
  • 数据发生变化时,版本号会递增
  • 通过数据结构stat来存储数据的变化、ACL的变化和时间戳等

2、节点的分类


  • 持久节点:一旦创建,除非主动调用删除操作,否则一直存在
  • 临时节点:与客户端的会话绑定,一旦客户端会话失效,这个客户端创建的所有临时节点都会自动被移除

对于这两种节点,可以在创建节点时,设置属性SEQUENTIAL,则会自动在节点名称后面再追加一个整型数字,上限是整型的最大值



3、节点属性


  • cZxid:表示创建该节点的事务id
  • ctime:表示创建该节点的时间
  • mZxid:表示最后一次更新该节点的事务id
  • mtime:表示最后一次更新时间
  • pZxid:
  • cversion:表示某个节点的子节点的版本号
  • dataVersion:表示某个节点存储的内容数据的版本号
  • aclVersion:表示某个节点的访问控制数据的版本号
  • ephemeralOwner:
  • dataLength:表示存储在该节点中的内容数据的长度
  • numChildren:表示该节点的直接子节点个数

4、创建节点



创建节点可以使用create命令,用法为:create [-s] [-e] path data acl,其中-s或者-e表示创建的是顺序或临时节点,默认创建的是持久节点;path参数表示要创建的节点绝对路径(要创建的节点的父节点必须存在才能创建成功);data参数表示的是即将创建的节点要存储的内容数据;acl参数用来进行权限控制,默认情况下不做任何权限控制



  • 创建不带权限控制的持久化节点:



zookeeper 创建目录 create zookeeper数据目录_版本号_02



  • 创建不带权限控制的临时节点:客户端会话关闭后自动被删除


zookeeper 创建目录 create zookeeper数据目录_数据_03



  • 创建不带权限控制的,带前缀的临时顺序节点:会自动的在指定名称的后面加一串递增的数字


zookeeper 创建目录 create zookeeper数据目录_子节点_04



  • 创建不带权限控制,不带前缀的临时顺序节点:


zookeeper 创建目录 create zookeeper数据目录_子节点_05






5、列出指定节点下的所有子节点


要列出指定节点下的所有子节点可以使用ls命令,用法为:ls path [watch],其中的path参数表示某个节点的绝对路径,查看的就是该节点下的子节点;watch参数表示监听子节点的变化。要注意的是该命令只能查看某个节点的直接子节点。如下图所示就是Zookeeper默认的节点:



zookeeper 创建目录 create zookeeper数据目录_数据_06



如果使用了watch参数,则会监听子节点的变化,包括增加和删除子节点,子节点变化时就会收到一个事件通知,仅仅会监听一次



zookeeper 创建目录 create zookeeper数据目录_数据_07



6、读取节点数据


要获取指定节点的内容数据和属性信息,可以使用get命令,用法为:get path [watch],其中的path参数表示指定节点的绝对路径;watch参数表示监听该节点的变化,如下图所示,其中的node1data就的存储在该节点中的内容数据,其它就是属性信息



zookeeper 创建目录 create zookeeper数据目录_版本号_08



如果使用了watch参数,则会监听该节点的变化,包括更新内容数据和删除该节点,变化时就会收到一个事件通知,仅仅会监听一次


zookeeper 创建目录 create zookeeper数据目录_数据_09


7、更新节点内容数据


要更新节点的内容数据可以使用set命令,用法为:set path data [version],其中的path参数表示被更新节点的绝对路径;data为更新后的节点内容数据;version参数指定当前节点内容数据的版本号,如果指定的版本号与当前节点内容数据的版本号不一致,则不能更新成功,可以不指定该参数;要注意的是一旦调用set命令更新节点内容数据成功,则节点的数据版本号就会发生变化,不管更新后的内容数据是否与更新前的内容数据内容一样



zookeeper 创建目录 create zookeeper数据目录_数据_10



8、删除节点


要想删除某个节点可以使用delete命令,用法为:delete path [version],其中path参数就是要删除的节点的绝对路径;version参数为要删除的节点的内容数据的版本号,如果在删除时指定的内容数据版本号与当前节点的内容数据版本号不一致,则会删除失败,可以不指定



zookeeper 创建目录 create zookeeper数据目录_数据_11