CreateMode表示znode的创建模式,也可以说是znode的类型,共有以下7种类型。
1.PERSISTENT
持久节点,即使创建此znode的client与zookeeper断开连接,该znode也会存在。
持久节点特性测试
(1)持久节点不能同名
# 第一步:创建一个持久节点
[zk: localhost:2181(CONNECTED) 8] create /per 123
Created /per
[zk: localhost:2181(CONNECTED) 9] ls /
[per]
# 第二步:创建一个同名的持久节点,报错
[zk: localhost:2181(CONNECTED) 10] create /per 123
Node already exists: /per
[zk: localhost:2181(CONNECTED) 11]
(2)持久节点数据持久化保存,session断开或zookeeper重启都还能看到持久节点
# 第一步:创建一个持久节点
[zk: localhost:2181(CONNECTED) 8] create /per 123
Created /per
[zk: localhost:2181(CONNECTED) 9] ls /
[per]
第二步:session断开,重连,持久节点还在
[zk: localhost:2181(CONNECTED) 1] ls /
[per]
第三步:zookeeper server重启,持久节点还在
[zk: localhost:2181(CONNECTED) 1] ls /
[per]
(3)持久节点可以创建子节点
# 第一步:创建一个持久节点
[zk: localhost:2181(CONNECTED) 8] create /per 123
Created /per
[zk: localhost:2181(CONNECTED) 9] ls /
[per]
# 第二步:创建一个持久节点的子节点
[zk: localhost:2181(CONNECTED) 10] create /per/z1 222
Created /per/z1
2.PERSISTENT_SEQUENTIAL
持久顺序节点,即使创建此znode的client与zookeeper断开连接,该znode也会存在。
与PERSISTENT不同的是,此种类型的znode名称会被附加一个单调递增的数字。
比如两次创建/znode/abc,则实际生成的znode为/znode/abc1和/znode/abc2。
持久顺序节点特性测试
(1)可创建重名持久顺序节点,但是节点名称会加上序号
# 第一步:创建持久顺序节点
[zk: localhost:2181(CONNECTED) 9] create -s /per 123
Created /per0000000017
# 第二步:创建同名的持久顺序节点
[zk: localhost:2181(CONNECTED) 10] create -s /per 123
Created /per0000000018
(2)持久顺序节点持久化保存,session断开或者zookeeper重启都不会影响到数据
第一步:查看已创建的持久顺序节点
[zk: localhost:2181(CONNECTED) 11] ls /
[per0000000017, per0000000018]
# 第二步:session断开,重连,可查看到之前创建的持久顺序节点
[zk: localhost:2181(CONNECTED) 1] ls /
[per0000000017, per0000000018]
[zk: localhost:2181(CONNECTED) 2]
(3)持久顺序节点可以创建子节点,包括持久子节点和临时子节点
# 第一步:创建持久顺序节点
[zk: localhost:2181(CONNECTED) 3] create -s /aaa 123
Created /aaa0000000017
# 第二步:创建临时子节点
[zk: localhost:2181(CONNECTED) 4] create -e /aaa0000000017/t 1
Created /aaa0000000017/t
# 第三步:创建持久子节点
[zk: localhost:2181(CONNECTED) 5] create /aaa0000000017/t1 2
Created /aaa0000000017/t1
[zk: localhost:2181(CONNECTED) 6]
3.EPHEMERAL
临时节点,当创建此znode的client与zookeeper断开连接,该znode会被删除。
临时节点特性测试
临时节点有以下特性
(1)session关闭,临时节点删除
临时节点只属于某个session,当session断开,则临时节点被删除。如下所示
# 第一步:建立session连接,创建临时节点
[zk: localhost:2181(CONNECTED) 15] create -e /temp 1
Created /temp
[zk: localhost:2181(CONNECTED) 16] ls /
[temp]
[zk: localhost:2181(CONNECTED) 17]
# 第二步:断开session链接,临时节点已被删除
[zk: localhost:2181(CONNECTED) 0] ls /
[]
[zk: localhost:2181(CONNECTED) 1]
(2)临时节点不能创建子节点
# 第一步:创建临时节点
[zk: localhost:2181(CONNECTED) 15] create -e /temp 1
Created /temp
[zk: localhost:2181(CONNECTED) 16] ls /
[temp]
# 第二步:创建临时节点的子节点,发现无法创建
[zk: localhost:2181(CONNECTED) 17] create -e /temp/child 1
Ephemerals cannot have children: /temp/child
[zk: localhost:2181(CONNECTED) 18]
(3)同一临时节点不允许多次创建
# 第一步:创建临时节点
[zk: localhost:2181(CONNECTED) 15] create -e /temp 1
Created /temp
[zk: localhost:2181(CONNECTED) 16] ls /
[temp]
# 第二步:再次创建临时节点,报错
[zk: localhost:2181(CONNECTED) 17] create -e /temp 1
Node already exists: /temp
[zk: localhost:2181(CONNECTED) 18]
4.EPHEMERAL_SEQUENTIAL
临时节点顺序节点,与EPHEMERAL不同的是,此种类型的znode名称会被附加一个单调递增的数字。
临时顺序节点特性测试
临时顺序节点有以下特性
(1)session关闭,临时顺序节点删除
# 第一步:创建临时顺序节点
[zk: localhost:2181(CONNECTED) 20] create -e -s /temp 1
Created /temp0000000011
# 第二步:断开session连接,再次查看临时顺序节点,发现不存在
[zk: localhost:2181(CONNECTED) 0] ls /
[]
[zk: localhost:2181(CONNECTED) 1]
(2)临时顺序节点不能有子节点
# 第一步:创建临时顺序节点
[zk: localhost:2181(CONNECTED) 10] create -e -s /temp 1
Created /temp0000000011
# 第二步:在临时顺序节点下创建一个子临时顺序节点,发现创建报错
[zk: localhost:2181(CONNECTED) 11] create -e -s /temp/t1 1
Node does not exist: /temp/t1
# 第三步:在临时顺序节点下创建一个子临时节点,发现创建报错
[zk: localhost:2181(CONNECTED) 12] create -e /temp/t1 1
Node does not exist: /temp/t1
(3)创建同名的临时顺序节点,节点名称会加序号,这是分布式锁实现的原理
# 第一步:创建临时顺序节点
[zk: localhost:2181(CONNECTED) 27] create -e -s /temp 1
Created /temp0000000012
# 第二步:创建同名的临时顺序节点
[zk: localhost:2181(CONNECTED) 28] create -e -s /temp 1
Created /temp0000000013
# 第三步:创建同名的临时顺序节点
[zk: localhost:2181(CONNECTED) 29] create -e -s /temp 1
Created /temp0000000014
5.CONTAINER
container节点是一个特殊用途的节点,对于诸如leader、lock等非常有用。当容器的最后一个子对象被删除时,该容器将成为将来某个时候由服务器删除的候选对象。有了这种属性,当在container节点内部创建子节点时,需要准备捕获org.apache.zookeeper.KeeperException.NoNodeException异常。
6.PERSISTENT_WITH_TTL
带有过期时间的持久节点,如果该znode在给定的TTL时间内未被修改,且该节点无子节点,则该znode会被删除。
7.PERSISTENT_SEQUENTIAL_WITH_TTL
带有过期时间的持久顺序节点,与PERSISTENT_WITH_TTL不同的是,创建此种znode的名称后面会附加单调递增的数字。