Zookeeper ZNode

ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务。ZooKeeper 由不同分层的命名空间组成,命名空间与文件系统的目录非常相似,命名空间的数据存储的节点在 Zookeeper 中称为ZNode。

每个ZNode都有唯一的命名空间,如 /test1/test2 是两个不同的节点,节点中存储了数据以及其自身的状态信息(如zxID、ACL访问控制、版本号、子节点等信息)。每一个节点都可以拥有子节点,子节点也是属于不同的节点,如 /test1/test1/follow 也是不同的节点,但上级节点删除时可以递归删除子节点。

ZNode类型

ZNode 有不同的类型,在创建时就需要指定,且创建完成后不可修改类型。

持久节点(Persistent)

持久节点在创建完成后就一直存在,不会因为创建该节点的连接会话关闭而被删除,除非有删除操作来删除节点。持久节点可以有子节点。

1
2
[zk: localhost:2181(CONNECTED) 2] create /test "hello"
Created /test

持久顺序节点(Persistent Sequential Nodes)

持久顺序节点具有持久节点的所有特性,该类型的节点在创建时会自动增加数字后缀用于记录节点创建的先后顺序,数字后缀的范围为0~2147483647(Integer.MAX_VALUE)。在zkCli中创建顺序节点只需要增加 -s 的参数即可。

1
2
[zk: localhost:2181(CONNECTED) 10] create -s /test- "hello"
Created /test-0000000000

临时节点(Ephemeral Nodes)

临时节点并不是一直存在的,创建该节点的连接会话关闭后就会被自动删除。在zkCli中创建临时节点只需要增加 -e 的参数即可。

1
2
[zk: localhost:2181(CONNECTED) 15] create -e /test "hello"
Created /test

也正是因为连接会话关闭后就会被自动删除的特性,临时节点被设计为不能创建子节点,如果尝试创建子节点Zookeeper会返回错误提示。

1
2
[zk: localhost:2181(CONNECTED) 18] create -e /test/sub "hello"
Ephemerals cannot have children: /test/sub

临时顺序节点(Ephemeral Sequential Nodes)

临时顺序节点具有临时节点的所有特性,与持久顺序节点一样在创建时会增加数字后缀用于记录节点创建的先后顺序。在zkCli中创建临时顺序节点需要增加 -e -s 的参数。

1
2
[zk: localhost:2181(CONNECTED) 20] create -e -s /test "hello"
Created /test0000000001

容器节点(Container Nodes)

容器节点是一种特殊的节点,与子节点的关联非常密切。当容器节点下的所有子节点都被删除后,容器节点自身在一段时间后也会被自动删除,默认的删除时间是60s。也正因为容器节点可能被自动删除的原因,在容器节点下创建子节点时需要捕获 KeeperException.NoNodeException 异常,以便于在自动删除后找不到容器节点时重新创建。在zkCli中创建容器节点需要增加 -c 的参数。

1
2
3
4
5
6
7
8
9
10
[zk: localhost:2181(CONNECTED) 25] create -c /test "hello"
Created /test
[zk: localhost:2181(CONNECTED) 26] create -c /test/sub1 "hello"
Created /test/sub1
[zk: localhost:2181(CONNECTED) 27] create -c /test/sub2 "hello"
Created /test/sub2
[zk: localhost:2181(CONNECTED) 28] ls -R /test
/test
/test/sub1
/test/sub2

TTL节点(TTL Nodes)

TTL节点与持久节点有关,是一种特殊的持久节点,在创建持久节点时,可以指定以毫秒为单位的超时时间,如果节点在超时时间内没有被修改,并且节点下没有子节点,那么这个节点在未来将被删除。
需要注意的是,TTL节点默认是禁用的,需要修改JVM参数后才能使用,否则将抛出 KeeperException.UnimplementedException 异常。
在zkCli中创建TTL节点需要增加 -t timeout 参数,其中 timeout 为超时时间,单位为毫秒。

1
2
[zk: localhost:2181(CONNECTED) 35] create -t 5000 /test "hello"
Created /test

如果没有增加JVM参数时尝试新建TTL节点,在zkCli中将返回错误提示。

1
2
[zk: localhost:2181(CONNECTED) 2] create -t 5000 /test "hello"
KeeperErrorCode = Unimplemented for /test

开启TTL节点配置

Unix类系统:修改 zkServer.sh 文件,在合适的位置增加 -Dzookeeper.extendedTypesEnabled=true JVM 参数即可。
Windows系统:修改 zkServer.cmd 文件,在合适的位置增加 -Dzookeeper.extendedTypesEnabled=true JVM 参数即可。
修改完启动脚本文件后重新启动 Zookeeper 即可。