znode
zookeeper的的功能可以看做是维护了一个树状数据结构,根节点是“/”,从外部观察,每个节点的信息都存在一个znode的数据结构里
Zstat & Stat
znode的数据结构在zookeeper内部是通过Zstat来定义的,其代码如下
package org.apache.zookeeper.server.jersey.jaxb;
import javax.xml.bind.annotation.XmlRootElement;
/**
* Represents a STAT using JAXB.
*/
@XmlRootElement(name="stat")
public class ZStat {
public String path;
public String uri;
public byte[] data64;
public String dataUtf8;
public long czxid;
public long mzxid;
public long ctime;
public long mtime;
public int version;
public int cversion;
public int aversion;
public long ephemeralOwner;
public int dataLength;
public int numChildren;
public long pzxid;
// 构造方法
@Override
public int hashCode() {
return path.hashCode();
}
/**
* This method considers two ZStats equal if their path, encoding, and
* data match. It does not compare the ZooKeeper
* org.apache.zookeeper.data.Stat class fields.
*/
@Override
public boolean equals(Object obj) {
//code
}
@Override
public String toString() {
//code
}
}
而Zstat的数据从ZNodeResource的代码中可以看出是来自Stat的,只是这里由于java的函数只允许返回值只能有一个,所以Stat作为参数传了进去。Zstat相对于Stat有了一个节点的value值,另外他们都有一些关于这个节点个属性,如下表所示
操作 | 新增、修改数据 | 新增、修改子节点列表 | 修改ACL |
---|---|---|---|
时间 | ctime、mtime | ||
事务id | mZxid | pZxid | |
版本 | dataversion | cversion | aclversion |
session | ephemeralOwner | ||
长度 | dataLength | numChildren |
客户端脚本
create
create [-s] [-e] path data [acl]
各个参数含义如下:
- -s:创建顺序节点
- -e:创建临时节点(否则为持久节点)
- path:路径,需要注意path是绝对路径并且要求父节点存在
- data:数据
- acl:权限控制信息,默认不加控制
在系统自带的zookeeper下是可以创建自己的节点的
ls
ls path [watch]
可以看到默认情况下根节点下面有一个名字是zookeeper的节点,而这个节点下面有config和quota两个节点。
get
get path [watch]
这个命令会获取上面提到的Znode的相关信息
set
set path data [version]
这里使用version用于乐观锁
delete
delete path [version]
同set一样version用于乐观锁
同create类似,delete在有子节点存在的情况下不允许删除父节点
系统Znode
在zookeeper初始化后除了根节点还有三个节点,分别是 /zookeeper, /zookeeper/config,/zookeeper/quota,这三个节点是无法删除的(会报Arguments are not valid),但是可以修改,也可以增加子节点。