4、Zookeeper技术内幕之重要理论
4.1 重要理论
4.1.1 数据模型znode
红色表示根节点,蓝色表示父节点,绿色表示叶子节点。
zk数据存储结构与标准的Unix文件系统非常相似,都是在根节点下挂很多子节点。zk中没有引入传统文件系统中目录与文件的概念,而是使用了称为znode的数据节点概念。znode是zk中数据的最小单元,每个znode上都可以保存数据,同时还可以挂子节点,形成一个树形化命名空间。
(1)节点类型
- 持久化节点
- 持久化顺序节点
- 临时节点:临时节点的生命周期与客户端的会话绑定在一起。临时节点不能有子节点,即临时节点只能是叶子节点。
- 临时顺序节点
(2)节点状态
cZxid:Created Zxid,表示当前znode被创建时的事务ID
ctime:Created Time,表示当前znode被创建的时间
mZxid:Modified Zxid,表示当前znode最后一次被修改时的事务ID
mtime:Modified Time,表示当前znode最后一次被修改的时间
pZxid:表示当前znode的子节点列表最后一次被修改时的事务ID。注意,只能是其子节点列表变更了才会引起pZxid的变更,子节点的内容的修改不会影响pZxid
cversion:Children Version,表示子节点版本号。该版本号用于充当乐观锁
dataversion:表示当前znode数据的版本号。该版本号用于充当乐观锁
aclversion:表示znode的权限ACL的版本号。该版本号用于充当乐观锁
ephemeralOwner:若当前znode是持久节点,则其值为0;若为临时节点,则其值为创建该节点的会话SessionID。当会话消失后,会根据SessionID来查找与该会话相关的临时节点进行删除。
dataLength:当前znode中存放的数据的长度
numChildren:当前znode所包含的子节点的个数
4.1.2 会话
会话是zk中最重要的概念之一,客户端与服务端之间的任何交互操作都与会话相关。
Zookeeper客户端启动时,首先会与zk服务器建立一个TCP长连接。连接一旦建立,客户端会话的生命周期也就开始了。
(1)会话状态
常见的会话有三种:
- CONNECTING:连接中。客户端要创建连接,其首先会在客户端创建一个zk对象,代表服务器。其会采用轮询的方式对服务器列表逐个尝试连接,直到连接成功。不过,为了对server进行负载均衡,其首先会对服务器列表进行打散操作,然后在轮询。
- CONNECTED:已经连接。
- CLOSE:连接已经关闭。
(2)会话连接事件
客户端与服务端的长连接失效后,客户端将进行重连。在重连的过程中客户端会产生三种会话连接事件:
- CONNECTION_LOSS
- SESSION_MOVED
- SESSION_EXPIRED
(3)分桶策略
前面无论是会话状态还是会话连接事件,都与会话超时有着紧密的联系。zk对于会话超时管理,采用了一种特殊的方式-分桶策略
A、基本概念
分桶策略是指,将超时时间相近的会话放到同一个桶中进行管理,以减少管理的复杂度。在检查超时时,只需要检查桶中剩余的会话即可,因为没有超时的会话已经移出桶了,而桶中存在的会话就是超时会话。
从以上描述可知,zk对于会话的超时管理并非精确管理,即并非是一超时马上就执行相关超时操作。
B、分桶依据
分桶计算的依据为:
其中ExpirationInternal的值为TickTime。
4.1.3 ACL
(1)ACL简介
ACL全称为Access Control List(访问控制列表),是一种细粒度的权限管理策略,可以针对任意用户与组进行细粒度的权限控制。zk利用ACL控制znode节点的访问权限,如节点数据读写、节点创建、节点删除、读取子节点列表、设置节点权限等。
(2)zk的ACL维度
Unix/Linux系统的ACL分为两个维度:组与权限,且目录的子目录或者文件能继承父目录的ACL。而Zookeeper的ACL分为三个维度:授权策略scheme、授权对象id、用户权限permission,子znode不会继承父znode权限。
A、授权策略scheme
授权策略用于确认权限验证过程中使用的检查策略(简单地说,通过什么验证权限,即一个用户要访问某个znode,如何验证身份),在zk中最常用的四种策略。
- IP
- Digest
- World
- Super
B、授权对象id
授权对象指的是权限赋予的用户。不同的授权策略具有不同的授权对象。下面是各个授权模式下对应的授权对象id。
- IP
- Digest
- World
- Super
C、权限Permission
权限是指通过了验证的用户可以对znode执行的操作。共有5种权限,不过zk支持自定义权限。
- c:Create
- d:Delete
- r:Read
- w:Write
- a:ACL
4.1.4 Watcher机制
zk通过Watcher机制实现了发布/订阅模式。
(1)watcher工作原理
(2)watcher事件
对于同一个事件类型,在不同的通知状态中代表的含义是不同的。
(3)watcher特性
zk的watcher机制具有以下几个特征:
- 一次性
- 串行性
- 轻量级