要说zookeeper节点有多少种类型,直接看创建节点的参数就知道了:
org.apache.zookeeper.ZooKeeper#create(java.lang.String, byte[], java.util.List<org.apache.zookeeper.data.ACL>, org.apache.zookeeper.CreateMode)
public String create(String path, byte[] data, List<ACL> acl, CreateMode createMode) throws KeeperException, InterruptedException {
}
其中有个参数,org.apache.zookeeper.CreateMode
public enum CreateMode {
PERSISTENT(0, false, false, false, false),
PERSISTENT_SEQUENTIAL(2, false, true, false, false),
EPHEMERAL(1, true, false, false, false),
EPHEMERAL_SEQUENTIAL(3, true, true, false, false),
CONTAINER(4, false, false, true, false),
PERSISTENT_WITH_TTL(5, false, false, false, true),
PERSISTENT_SEQUENTIAL_WITH_TTL(6, false, true, false, true);
......
}
这里有7种类型
PERSISTENT 持久型
创建了就会一直存在,直到被手动调用删除节点方法。
PERSISTENT_SEQUENTIAL 持久顺序型
会自动在节点路径名称后面添加一个自增的序号,如apple/iphone/macbook00000001,这种带自增序号的节点能保证输入同一路径时都能创建一个唯一的节点,可用于实现分布式队列,分布式公平锁。
EPHEMERAL 临时型
在回话结束后,节点自动删除。
EPHEMERAL_SEQUENTIAL 临时顺序型
临时节点特性,路径自动添加自增序号。
CONTAINER 容器型
zookeeper会有线程扫描容器型节点,当发现节点没有子节点时,就会删除掉容器节点。在没有没删除前,特性和持久节点一样,官方对此类型的节点用处说明是:Container nodes are special purpose nodes useful for recipes such as leader, lock, etc。
PERSISTENT_WITH_TTL 持久TTL型
TTL的意思是time to live ,他是容器节点之上的,当此类型节点之下没有子节点且未被修改的时间超过TTL后,就会被删除。要想使用该类型,必须在zookeeper的bin/zkService.sh中的启动zookeeper的java环境中设置环境变量zookeeper.extendedTypesEnabled=true(具体做法在下边),否则KeeperErrorCode = Unimplemented for /**。
PERSISTENT_SEQUENTIAL_WITH_TTL 持久顺序TTL型
就是持久TTL型加上顺序节点的特性。