Zookeeper组件
数据模型data model
-
Zookeeper数据模型采用层次化的多叉数结构:
- 最上层根节点以 / 表示,每个节点可以拥有N个子节点
- 每个节点上都可以存储数据,数据类型可以是数字,字符串和二进制序列
- 每个节点称为znode, 是Zookeeper中数据的最小单元,并且每一个znode都有一个唯一的路径标识
-
注意:
- Zookeeper是用来协调服务的,而不是用来存储业务数据的
- 不能在节点znode上存放大量的数据
- Zookeeper中每个节点znode存放数据量的上限是1M
数据节点znode
- Zookeeper中的每一个数据节点称为znode, 是Zookeeper中数据的最小单元
数据节点znode的四种类型
- 持久节点PERSISTENT : 一旦创建节点znode, 就会一直存在.即使Zookeeper宕机也不会消失,直到将该节点znode删除
- 临时节点EPHEMERAL : 临时节点znode的生命周期是与客户端会话session绑定的,会话消失则节点消失. 临时节点znode只能作为叶子节点,不能创建子节点
- 持久顺序节点PERSISTENT_SEQUENTIAL : 除了具备持久节点PERSISTENT的性质之外,节点znode的名称还具有顺序性
- 临时顺序节点EPHEMERAL_SEQUENTIAL : 除了具备临时节点EPHEMERAL的性质之外,节点znode的名称还具有顺序性
数据节点znode的数据结构
-
每个znode由两部分组成:
- data: 节点存放的数据信息
- stat: 节点状态信息
-
stat中状态信息描述:
| stat值 | 说明 |
|---|---|
| cZxid | create ZXID 数据节点创建时的事务ID |
| ctime | create time 数据节点的创建时间 |
| mZxid | modified ZXID 数据节点最终一次更新时的事务ID |
| mtime | modified time 数据节点最终一次更新时的时间 |
| pZxid | 数据节点的子节点列表最后一次修改时的事务ID 只有子节点列表变更时才会更新pZxid,子节点内容变更时不会更新 |
| cversion | 子节点版本号 当前数据节点的子节点每次变化时值增加1 |
| dataVersion | 数据节点内容版本号 数据节点创建时值为0,之后每次调用更新数据节点内容操作后值增加1 |
| aclVersion | 数据节点ACL版本号 表示该节点ACL信息变更次数 |
| ephemeralOwner | 创建当前临时节点的客户端会话的sessionId 如果当前节点是持久节点,那么ephemeralOwner=0 |
| dataLength | 数据节点数据内容长度 |
| numChildren | 当前数据节点子节点数量 |
- 示例:
get /dubbo
# data. 数据节点关联的数据信息为空
null
# stat. 数据节点的状态信息
cZxid = 0x2
ctime = Thu Jan 28 09:35:57 CST 2021
mZxid = 0x2
mtime = Thu Jan 28 09:35:57 CST 2021
pZxid = 0x3
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
版本version
-
Zookeeper中节点znode的stat中记录了节点相关的三个版本信息:
- 当前节点的子节点版本号cversion
- 当前节点的数据内容版本号dataVersion
- 当前节点的ACL版本号aclVersion
权限控制acl
-
Zookeeper采用ACL(AccessControlLists) 策略来进行权限控制,类似与UNIX文件系统的权限控制
-
数据节点znode的操作包含以下5种权限:
-
CREATE: 创建子节点
-
READ: 读取节点的数据和列出子节点
-
WRITE: 更新节点的数据
-
DELETE: 删除子节点
-
ADMIN: 设置节点ACL的权限
- 这里的CREATE和DELETE的权限控制是针对子节点的权限控制
-
-
Zookeeper中znode的四种身份认证的方式:
- world: 默认方式. 所有的用户都可以无条件进行访问
- ip: 指定ip的用户可以进行访问
- auth: 已经进行认证的用户可以进行访问
- digest: 通过用户名username和密码password的认证方式进行访问
事件监听器watcher
-
事件监听器Watcher :
- Zookeeper中一个很重要的特性
- Zookeeper允许用户在指定的节点znode上注册一些Watcher, 并且在一些特定事件触发时 ,Zookeeper会将事件通知到监听的客户端中
- 事件监听机制是Zookeeper实现分布式协调服务的重要特性
会话session
-
会话Session :
-
会话Session是Zookeeper服务器与客户之间的一个TCP长连接
-
通过这个会话Session. 客户端可以和Zookeeper服务器之间:
- 通过心跳检测与服务器保持有效的会话
- 向Zookeeper服务器发送请求并接收响应
- 能够通过连接接收来自服务器的Watcher事件通知
-
-
会话超时时间sessionTimeout :
- 当服务器压力过大,网络故障或者客户端主动断开连接等原因导致客户端连接断开时,只要在会话超时时间sessionTimeout规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话Session还是有效的
-
会话标识sessionID :
- 在创建客户端会话之前,服务器会为每个客户端分配一个sessionID
- 因为sessionID是Zookeeper会话的一个重要标识 ,Zookeeper中与会话有关的运行机制都是基于这个sessionID的,因此,在整个集群中服务器为客户端分配的sessionID要保证在整个集群中是全局唯一