1 系统模型
1.1 数据模型
视图结构类似一棵树,每个数据节点称为ZNode,是ZooKeeper中数据的最小单元
事务ID:ZXID
1.2 数据节点特性
分为持久节点、临时节点、顺序节点,可以组成生成以下四种:
数据节点保存的内容:存储数据内容和数据节点本身的一些状态信息,如事务ID、版本信息、子节点个数等
1.3 版本-保证分布式数据原子性操作
数据节点具有三种类型的版本信息:
对数据节点的任何更新操作就会引起版本号的变化,即版本表示修改次数
- version
含义:表示当前节点自从创建之后,被更新的次数(数据一样的更新也算),从0开始计算
作用:实现乐观锁机制的”写入校验“(乐观锁有数据读取、写入校验、数据写入三阶段)
数据更新时乐观锁的实现:
1.4 Watcher-数据变更的通知
流程:
1.4.1 Watcher接口
通知状态和事件类型:
1.4.2 Watcher事件
常见事件类型和通知状态
1.4.3 回调方法process()
process方法Watcher接口中的一个回调方法
WatchedEvent封装了服务端事件并传递给Watcher:
1.4.4 工作机制
三个过程:客户端注册Watcher、服务器处理Watcher、客户端回调Watcher
- 客户端注册Watcher
标记request为”使用Watcher监听“
WatchRegistration用于暂时保存数据节点的路径和Watch的对应关系
设计思想:非完全序列化:传输WatchRegistration时,只序列化了requestHeader和request属性,减轻服务端内存紧张问题
- 服务端处理Watcher
流程图:
1.服务端接收Watcher并将其存储起来的过程
可以把request对应的ServerCnxn看作是一个Watcher对象,数据节点的节点路径和ServerCnxn最终会被存储在WatchManager的watchTable和watch2Paths中:
ServerCron是一个ZooKeeper客户端和服务器之间的连接接口,代表一个客户端和服务器的连接,基于Netty实现,实现了Watcher的process接口
2.服务端触发Watch的过程
Watcher监听的对应数据节点的数据内容发送变更,即调用了setData方法,此方法会调用dataWacthers.triggerWatch方法触发事件
dataWatches|childWatches管理器的Watcher触发逻辑:
可以看到,ServerCron的process方法本质上并不是处理客户端Watcher真正的业务逻辑,而是借助当前客户端连接的ServerCnxn对象来实现对客户端的WatchedEvent传递,真正的客户端Watcher回调与业务逻辑执行都在客户端
3.客户端回调Watcher
客户端收到WatcherEvent事件后,开始处理此事件
1.SendThread接收事件通知:
2.EventThread处理事件通知:SengThread调用EventThread.queueEvent将事件传递给EventThread线程
总结
特性:
一次性:客户端和服务端都是
客户端串行执行:
轻量:
1.5 ACL-保障数据安全
ACL为访问控制列表,可以从三个方面:权限模式、授权对象、权限来标识一个有效的ACL信息
1.5.1 权限模式:Scheme
用来确定权限验证过程中使用的检验策略
ZooKeeper开发中,使用最多的是以下四种权限模式:
IP:
Digest:
World:
Super:
1.5.2 授权对象:ID
指权限赋予的用户或一个指定实体
不同权限模式下授权对象不同:
1.5.3 权限:Permission
指通过权限检查后可以被允许执行的操作
对数据的操作权限分为五类:
1.5.4 权限扩展体系
可以以插件形式插入到ZooKeeper的权限体系中去
1.5.4.1 实现自定义权限控制器
实现AuthenticationProvider接口,如CustomAuthenticationProvider
将自定义权限控制器进行注册:
1.5.5 ACL管理
1.5.5.1 设置ACL
两种方式
一:在数据节点创建的同时进行ACL权限的设置
create [-s] [-e] path data acl
二:使用setAcl命令单独对已经存在的数据节点进行ACL设置
setAcl path acl
1.5.5.2 Super模式的用法
出现的问题:
解决:
在ACL的Super模式下,使用超级管理员权限来进行处理