Zookeeper的数据结构和标准的Unix文件系统类似,都存在一个(/)根,在Unix中数据结构被称为目录(根目录、子目录),而Zookeeper中的数据结构都被称为节点(根节点、子节点)。
Zookeeper的节点称为ZNode,ZNode是Zookeeper中的最小数据单位,在ZNode下面还可以在有Znode,层次感鲜明,一层层下去就形成了层次化命名空间ZNode树。
在Zookeeper中,每一个数据节点都是一个ZNode,如下图所示,根节点中还有两个子节点,分别是/app1和/app2,其中/app1下面还有三个子节点。
简而言之:Zookeeper的数据结构就是一大堆子节点组成的树形结构,就好比是Unix操作系统,根目录中存在子目录,子目录中包含子文件,数据都在子文件中存储,而Zookeeper是在根节点下包含很多子节点,但是每一个节点都可以存储自己的一些数据和当前节点的信息,允许存储的数据大小为1M。
Zookeeper节点类型可以分为三大类:持久性节点(Persistent)、临时性节点(Ephemeral)、顺序性节点(Sequential),在生产使用中可以组合使用分为以下四种类型:
# /data/zookeeper/bin/zkServer.sh start
/usr/local/jdk1.8.0_211/bin/java
ZooKeeper JMX enabled by default
Using config: /data/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
# /data/zookeeper/bin/zkServer.sh stop
/usr/local/jdk1.8.0_211/bin/java
ZooKeeper JMX enabled by default
Using config: /data/zookeeper/bin/../conf/zoo.cfg
# /data/zookeeper/bin/zkServer.sh restart
/usr/local/jdk1.8.0_211/bin/java
ZooKeeper JMX enabled by default
Using config: /data/zookeeper/bin/../conf/zoo.cfg
/usr/local/jdk1.8.0_211/bin/java
ZooKeeper JMX enabled by default
Using config: /data/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
/usr/local/jdk1.8.0_211/bin/java
ZooKeeper JMX enabled by default
Using config: /data/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
# /data/zookeeper/bin/zkServer.sh status
/usr/local/jdk1.8.0_211/bin/java
ZooKeeper JMX enabled by default
Using config: /data/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: standalone
使用zkCli.sh
可以进入zookeeper的客户端命令行,-server
参数表示指定zookeeper的地址,不指定-server
默认使用本机。
# /data/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181
[zk: 127.0.0.1:2181(CONNECTED) 0]
通过help
命令可以打印出客户端可以执行的命令帮助信息。
[zk: 127.0.0.1:2181(CONNECTED) 0] help
可以通过ls
命令查看Zookeeper中各个节点的信息,命令格式:ls path
部署完Zookeeper后默认有一个节点"zookeeper",可以通过ls
命令查询该节点下还有哪些节点。
1.查看根节点信息
[zk: 127.0.0.1:2181(CONNECTED) 3] ls /
[zookeeper]
2.查看/zookeeper节点信息
[zk: 127.0.0.1:2181(CONNECTED) 4] ls /zookeeper
[config, quota]
3.查看/zookeeper/config节点信息
[zk: 127.0.0.1:2181(CONNECTED) 5] ls /zookeeper/config
[]
4.查看/zookeeper/quota节点信息
[zk: 127.0.0.1:2181(CONNECTED) 6] ls /zookeeper/quota
[]
#当节点下没有子节点时,会返回[]
通过ls -s
命令可以显示出ZNode的详细信息。
[zk: 127.0.0.1:2181(CONNECTED) 18] ls -s /
[zookeeper]cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x10
cversion = 7
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
可以使用create
命令创建节点,命令格式:create /节点 数据
。
1.创建节点不写入任何数据
[zk: 127.0.0.1:2181(CONNECTED) 7] create /app1
Created /app1
2.创建节点并写入数据
[zk: 127.0.0.1:2181(CONNECTED) 8] create /app2 app2data
Created /app2
3.在/app1下再创建节点
[zk: 127.0.0.1:2181(CONNECTED) 10] create /app1/node_1
Created /app1/node_1
3.查看创建的节点
[zk: 127.0.0.1:2181(CONNECTED) 9] ls /
[app1, app2, zookeeper]
可以使用get
命令查看节点中的数据,命令格式:get /节点
。
1.如果节点没有数据则返回null
[zk: 127.0.0.1:2181(CONNECTED) 0] get /app1
null
2.如果节点有数据则返回数据内容
[zk: 127.0.0.1:2181(CONNECTED) 1] get /app2
app2data
可以使用set
命令向节点中写入数据,命令格式:set /节点 数据
。
1.在/app1节点中写入数据
[zk: 127.0.0.1:2181(CONNECTED) 4] set /app1 napp1data
2.查看写入的数据
[zk: 127.0.0.1:2181(CONNECTED) 5] get /app1
napp1data
可以使用delete
命令向节点中写入数据,命令格式:delete /节点
。
注意:如果要删除的节点中包含子节点,那么会删除失败,会提示节点不为空,只有当节点中不包含任何子节点时,才可以被删除。
如果想要删除节点下的所有节点可以使用deleteall
命令,命令格式:deleteall /节点
。
1.删除一个空的节点
[zk: 127.0.0.1:2181(CONNECTED) 15] delete /app2
2.删除节点下的子节点
[zk: 127.0.0.1:2181(CONNECTED) 16] delete /app1/node_1
3.删除节点下的所有节点包含父节点
[zk: 127.0.0.1:2181(CONNECTED) 17] deleteall /app1
依旧使用create
命令进行创建,加上-s
参数创建节点名会带有一组数字编号,形成顺序。
创建顺序性的节点,多次创建可以使用相同的节点名称,zookeeper会自动为其增加一组数字编号,并且是有顺序的。
顺序编号在集群中通用,即使另外名称的节点也会按照当前的编号顺序往下创建。
不带任何参数创建的默认就是持久性节点,不会被删除,除非人为手动删除。
[zk: 127.0.0.1:2181(CONNECTED) 19] create -s /app_seq
Created /app_seq0000000004
[zk: 127.0.0.1:2181(CONNECTED) 20] create -s /app_seq
Created /app_seq0000000005
[zk: 127.0.0.1:2181(CONNECTED) 21] create -s /app_seq
Created /app_seq0000000006
[zk: 127.0.0.1:2181(CONNECTED) 22] create -s /app_seq
Created /app_seq0000000007
[zk: 127.0.0.1:2181(CONNECTED) 23] create -s /app_seq
Created /app_seq0000000008
[zk: 127.0.0.1:2181(CONNECTED) 24] create -s /jiangxl_seq
Created /jiangxl_seq0000000009
[zk: 127.0.0.1:2181(CONNECTED) 25] create -s /jiangxl_seq
Created /jiangxl_seq0000000010
[zk: 127.0.0.1:2181(CONNECTED) 26] create -s /jiangxl_seq
Created /jiangxl_seq0000000011
依旧使用create
命令进行创建,加上-e
参数表示创建临时性的节点。
临时性的节点当会话退出后会自动删除。
[zk: 127.0.0.1:2181(CONNECTED) 28] create -e /tem1
Created /tem1
[zk: 127.0.0.1:2181(CONNECTED) 29] create -e /tem2
Created /tem2
退出会话再次进入时,临时性的节点会被自动删除。
依旧使用create
命令进行创建,加上-es
参数表示创建顺序性的临时节点,退出会话自动被删除。
[zk: 127.0.0.1:2181(CONNECTED) 1] create -es /tmp_node
Created /tmp_node0000000014
[zk: 127.0.0.1:2181(CONNECTED) 2] create -es /tmp_node
Created /tmp_node0000000015
[zk: 127.0.0.1:2181(CONNECTED) 3] create -es /tmp_node
Created /tmp_node0000000016
[zk: 127.0.0.1:2181(CONNECTED) 4] create -es /tmp_node
Created /tmp_node0000000017
[zk: 127.0.0.1:2181(CONNECTED) 5] create -es /tmp_node
Created /tmp_node0000000018
[zk: 127.0.0.1:2181(CONNECTED) 6] create -es /tmp_node
Created /tmp_node0000000019
会话退出后临时节点自动删除。