版本声明
Zookeeper
服务器版本:3.4.6
数据模型
Zookeeper
维护着一个树形层次结构,树中的节点被称为znode
。Znode
可以用于存储数据,并且有一个与之关联的ACL(access control list,访问控制列表)。Zookeeper
被设计为用来实现协调服务(通常使用小数据文件),而不是用于大容量数据存储。因此一个znode能存储的数据被限制在1MB以内。Zookeeper
的数据访问具有原子性。客户端在读取一个znode
的数据时,要么读到所有的数据,要么读操作失败,不会只读到部分数据。同样,写操作将替换znode存储的所有数据。Zookeeper
会保证写操作不成功就失败,不会出现部分写之类的情况。Zookeeper
中的路径必须是绝对路径,即每条路径必须从一个斜杠开始。所有路径必须是规范的,即每条路径只有唯一的一种表示方式,不支持路径解析。/zookeeper
是一个保留词,不能用作一个路径组件。Zookeeper
使用/zookeeper
来保存管理信息
Znode
-
Znode
是Zookeeper
中数据的最小单元,每个Znode上都可以保存数据,同时还可以挂载子节点,znode之间的层级关系就像文件系统的目录结构一样,zookeeper将全部的数据存储在内存中以此来提高服务器吞吐量、减少延迟的目的。 -
Znode
有三种类型,Znode
的类型在创建时确定并且不能修改。- 临时(EPHEMERAL):在创建临时
Znode
的客户端会话结束时,服务器会将临时节点删除。临时节点不能有子节点(即使是临时子节点)。虽然每个临时Znode
都会绑定一个特定的客户端会话,但是它们对所有客户端都是可见的 - 持久(PERSISTENT):节点一旦被创建,会一直存在与服务器上,
Zookeeper
规定所有非叶子节点必须是持久化节点 - 顺序(SEQUENTIAL):如果在创建
Znode
时设置了顺序标识,那么该Znode名称之后便会附加一个值,这个值由一个单调递增的计数器(由父节点维护)所添加
- 临时(EPHEMERAL):在创建临时
-
临时节点在两种情况下会被删除
- 当创建
Znode
的客户端的会话因超时或者主动关闭而终止时(不是TCP连接断开) - 当某个客户端(不一定是临时
Znode
的创建者)主动删除该节点时
- 当创建
-
每个数据节点除了存储数据内容之外,还存储了数据节点本身的一些状态信息。
Znode
的状态(Stat
)信息[zk: 127.0.0.1:2181(CONNECTED) 1] get /jannal-create/user/password 123456 cZxid = 0x6000000e4 ctime = Wed Oct 03 22:46:07 CST 2018 mZxid = 0x6000000e4 mtime = Wed Oct 03 22:46:07 CST 2018 pZxid = 0x6000000e4 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 0
状态属性 说明 cZxid Created ZXID表示该数据节点被创建时的事务ID ctime Created Time表示节点被创建的时间 mZxid Modified ZXID 表示该节点最后一次被更新时的事务ID mtime Modified Time表示节点最后一次被更新的时间 pZxid 表示该节点的子节点列表最后一次被修改时的事务ID。只有 子节点列表
变更了才会变更pZxid,子节点内容
变更不会影响pZxidcversion 子节点的版本号 dataVersion 数据节点版本号 aclVersion 节点的ACL版本号 ephemeralOwner 创建该临时节点的会话的SessionID。如果节点是持久节点,这个属性为0 dataLength 数据内容的长度 numChildren 当前节点的子节点个数 -
Zookeeper
中版本(version)表示的是对数据节点的数据内容、子节点列表或是节点ACL信息的修改次数,初始为0表示没有被修改,每当对数据内容进行更新,version就会加1。如果前后两次修改并没有使得数据内容发生变化,version的值依然会变化。修改时如果设置version=-1
,表示客户端并不要求使用乐观锁,可以忽略版本对比。//第一次dataVersion是0 [zk: 127.0.0.1:2181(CONNECTED) 1] get /jannal-create/user/password 123456 cZxid = 0x6000000e4 ctime = Wed Oct 03 22:46:07 CST 2018 mZxid = 0x6000000e4 mtime = Wed Oct 03 22:46:07 CST 2018 pZxid = 0x6000000e4 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 0 //将值修改为1234567后dataVersion变为1 [zk: 127.0.0.1:2181(CONNECTED) 3] set /jannal-create/user/password 1234567 cZxid = 0x6000000e4 ctime = Wed Oct 03 22:46:07 CST 2018 mZxid = 0x6000000e6 mtime = Wed Oct 03 23:02:52 CST 2018 pZxid = 0x6000000e4 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 7 numChildren = 0 //将值修改为原来的123456后dataVersion变为2 [zk: 127.0.0.1:2181(CONNECTED) 4] set /jannal-create/user/password 123456 cZxid = 0x6000000e4 ctime = Wed Oct 03 22:46:07 CST 2018 mZxid = 0x6000000e7 mtime = Wed Oct 03 23:02:57 CST 2018 pZxid = 0x6000000e4 cversion = 0 dataVersion = 2 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 0