ZooKeeper是一个与Unix文件系统很类似的结构,如下图,名称是由斜线(/)分隔得一系列路径,ZooKeeper的每一个节点都有一个路径标识。
这棵树由节点组成,每个节点称为ZNode。ZNode引用方式是路径引用,比如/app1/p_1,这样的层级结构让每个ZNode都有唯一的路径。
1)ZNode组成:
每个ZNode兼具文件和目录的特点,既像文件一样维护着数据、元信息、ACL(Access Control List,访问控制列表)、时间戳等数据结构,又像目录一样可以作为路径标识的一部分。
每个ZNode节点由4部分组成:
data:
存储数据信息。
ACL:
记录ZNode的访问权限,那些可以访问该节点。
stat:
ZNode的元数据,比如事务ID,时间戳,版本号,大小等。
child:
当前节点子节点的引用。
2)ZNode类型:
ZooKeeper节点有两种,分为永久节点(Persistent Node)和临时节点(Ephemeral Node)(Ephemeral Node)。节点的类型在创建的时即被确定,不可更改。
两种节点的区别在于是否依赖会话(session)而生存。客户端和ZooKeeper服务器的一次连接称为一次会话。客户端靠与服务器建立一个TCP的长连接来维持一个会话,客户端在启动的时候首先会与服务器建立一个TCP连接,通过这个连接客户端能够通过心跳检测与服务器保持有效的会话,也能向ZooKeeper服务器发送请求并获得响应。
(1)临时节点:该节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,当然也可以手动删除。虽然每个临时的Znode都会绑定到一个客户端会话,但他们对所有的客户端还是可见的。另外,ZooKeeper的临时节点不允许拥有子节点。
(2)永久节点:该节点的生命周期不依赖于会话,并且只有在客户端显式地执行删除操作的时候,他们才能被删除。
当创建Znode的时候,用户可以请求在ZooKeeper的路径结尾添加一个递增的计数。这个计数对于此节点的父节点来说是唯一的,当客户端请求创建这个节点A后,ZooKeeper会根据父节点的zxid状态,为这个A节点编写一个全目录唯一的编号(这个编号只会一直增长)。这样的节点称为顺序节点。
节点细分可以分为四种:
1)永久节点
2)永久顺序节点
3)临时节点
4)临时顺序节点