综述
- 数据模型
- 节点信息
- 版本
- acl
数据模型
zookeeper其实就是一个文件系统。用节点来存储数据。这个节点叫ZNode。所有ZNode组成一棵树。ZNode里面可以存储数据。
数据模型.png重点。每个节点只有绝对路径。没有相对路径。
节点类型
-
持久节点
zookeeper中最常见的节点。所谓持久节点,是指改数据节点被创建后,就一直存在,直到有删除请求主动删除这个节点。 -
持久顺序节点
持久顺序节点的基本特征和持久节点是一样的。额外的特性表现在顺序性上。每个父节点都会为它的直系子节点维护一份顺序,用于记录每个子节点创建的先后顺序。在建立子节点的时候默认加上一个数字后缀,数字上限是整型的最大值。
观察一下。在/zk-test下创建子节点,非顺序的节点创建后,父节点的顺序值也会+1,只是不会加在节点名字上。父节点记录顺序+1,只要是创建子节点就会+1,不管子节点是否临时,是否持久。就是持久的节点,会把这个10位顺序值放在节点名字的后面。
- 临时节点
和持久节点不同的是,临时节点的生命周期和client会话是绑定在一起的,session失效,那么这个节点会被自动清理掉。
注意!!
- 不能基于临时节点创建临时节点,临时节点只能是叶子节点。
- session失效,不是TCP断开连接。而是 session章节会讲
- 临时顺序节点
基本特性和临时节点一致,额外特性和顺序节点一致。
节点信息
节点信息.png第一行为节点存储的内容。如图,.zk-test节点存储的就是test0这个字符串。
zk作为服务发现的时候,节点的内容基本上是服务的ip地址。
下面就是属性了
属性 | 说明 |
---|---|
cZxid | 即create ZXID,表示该数据节点被创建时的事务ID |
ctime | 即create time,表示该节点被创建时的时间 |
mZxid | 即modified ZXID,表示该节点最后一次更新时的事务ID |
mtime | 即modified time,表示该节点最后一次更新的时间 |
dataVersion | 该节点版本号 |
cversion | 子节点列表的版本号 |
pZxid | 表示该节点的子节点列表最后一次被修改时的事务ID。注意,只有列表变了才会被修改,子节点内容的变化不会影响pZxid |
aclVersion | 该节点acl版本号 |
ephemeralOwner | 创建该临时节点的会话的sessionId。如果该节点是持久节点,那么这个属性值为0 |
dataLength | 该节点数据内容的长度 |
numChildren | 当前节点的子节点个数。临时节点也算在内,临时节点被删除时,数量对应减少 |
属性中提到了事务ID,那zk中的事务是什么呢?
zk的事务是指能够改变服务器状态的操作。是一次操作,并不是一组操作。比如,节点的创建,节点的删除,数据节点内容的更新,客户端会话创建与失效。
对每个事务请求,zk都会为其分配一个全局唯一的事务ID。用ZKID表示,通常是一个64位的数字。每一个ZXID对应一次更新操作,通过ZXID可以识别出zk处理这些操作的全局顺序。
属性中提到了版本,那zk中的版本是什么呢?
版本类型 | 说明 |
---|---|
dataVersion | 当前数据节点数据内容的版本号 |
cversion | 当前数据节点子节点列表的版本号 |
aversion | 当前数据节点ACL变更版本号 |
分布式领域中,version的存在基本上就是用来做乐观锁的。
当请求的version相同时,接收请求,version + 1。
请求的version不同,拒绝请求。
属性里面提到了ACL,那zk的ACL是什么呢?
ACL(Access Control List)权限控制机制
ACL格式。
scheme:id:permission
scheme(模式)
-
ip
ip粒度的权限控制,例如配置了ip:192.168.0.110,即表示权限控制都是针对这个ip地址的。
也可以设置ip段,例如ip:192.168.0.1/24。表示针对192.168.0.*这个ip段进行权限控制。 -
digest
digest是最常用的控制模式。账号密码模式,以类似 username:password 的形式来进行权限配置,便于区分不同应用来进行权限控制。
当我们通过username:password配置权限之后,zk会对其先后进行两次编码处理。分别是SHA-1算法加密和BASE64编码。 -
world
是一种最开放的权限控制模式,也就是没有权限。只有一个选项可填world:anyone -
super
顾名思义就是超级用户的意思。在super模式下,超级用户可以对任意zk上的数据节点进行任何操作。
id(授权对象)
授权对象指的是权限赋予的用户或者一个指定的实例。
权限模式 | 授权对象 |
---|---|
ip | ip地址或者ip段 |
digest | username:password |
world | 只能是 "anyone" |
super | 与digest模式一致 |
permission(权限)
- create(C):数据节点创建权限,允许授权对象在该数据节点下创建子节点
- DELETE(D):子节点的删除权限,允许授权对象删除该节点的子节点
- READ(R):数据节点的读权限,允许授权对象访问该数据节点并读取其数据内容和子节点
- WRITE(W):数据节点的更新权限,允许授权对象对该数据节点进行更新
- ADMIN(A):超管权限
ACL管理
-
在创建节点的时候就设置
创建时设置.png
2)之后设置
创建后设置.png
网友评论