一、基础结构
1 ZNode
Zookeeper的数据节点称为ZNode,ZNode是Zookeeper中数据的最小单元,每个ZNode都可以保存数据,同时还可以挂载子节点。
1.1 ZNode 分类
持久节点(PERSISTENT):节点创建后便一直存在于Zookeeper服务器上,直到有删除操作来主动清除该节点。
持久顺序节点(PERSISTENT_SEQUENTIAL):相比持久节点,其新增了顺序特性,每个父节点都会为它的第一级子节点维护一份顺序,用于记录每个子节点创建的先后顺序。在创建节点时,会自动添加一个数字后缀,作为新的节点名,该数字后缀的上限是整形的最大值。
临时节点(EPEMERAL):临时节点的生命周期与客户端会话绑定,客户端失效,节点会被自动清理。同时,Zookeeper规定不能基于临时节点来创建子节点,即临时节点只能作为叶子节点。
临时顺序节点(EPEMERAL_SEQUENTIAL):在临时节点的基础添加了顺序特性。
1.2 ZNode结构
czxid | 该节点被创建时的事务ID |
mzxid | 该节点最后一次被更新时的事务ID |
ctime | 该节点被创建的时间 |
mtime | 该节点最后一次被更新的时间 |
version | 数据节点的版本号 |
cversion | 子节点的版本号 |
aversion | 节点ACL的版本号 |
emphemeralOwner | 创建该临时节点的会话SessionID。如果该节点为持久节点,则该属性的值为0 |
dataLength | 数据内容的长度 |
numChildren | 子节点个数 |
pzxid | 该节点子节点列表最后一次被修改时的事务ID,只有子节点列表变更才会变更pzxid,子节点内容变更不会影响pzxid。 |
2 Watcher
Zookeeper使用Watcher机制实现分布式数据的发布/订阅功能。
Zookeeper的Watcher机制主要包括客户端线程、客户端WatcherManager、Zookeeper服务器三部分。客户端在向Zookeeper服务器注册的同时,会将Watcher对象存储在客户端的WatcherManager当中。当Zookeeper服务器触发Watcher事件后,会向客户端发送通知,客户端线程从WatcherManager中取出对应的Watcher对象来执行process(WatchedEvent event)回调函数。
其中WatchedEvent包含KeeperState,EventType和path属性。
KeeperState | EventType | 说明 |
SyncConnected(3) | None(-1) | 成功建立会话 |
NodeCreated(1) | 节点被创建 | |
NodeDeleted(2) | 节点被删除 | |
NodeDataChanged(3) | 节点数据内容发生变更 | |
NodeChildrenChanged(4) | 子节点列表发生变更 | |
Disconnected(0) | None(-1) | 断开连接 |
Expired(-112) | None(-1) | 超时 |
AuthFailed(4) | None(-1) | 权限检查失败 |
3 ACL(Acess Control List)
ACL机制:权限模式(Scheme)、授权对象(ID)、权限(Permission),通常使用"scheme:id:permission"来标识一个有效的ACL信息。
3.1 权限模式(Scheme)
(1)IP:通过IP地址粒度来进行权限控制,如"ip:192.168.0.110"表示权限控制针对该IP地址,同时IP模式可以支持按照网段方式进行配置,如"ip:192.168.0.1/24"表示针对192.168.0.*这个网段进行权限控制。
(2)Digest:使用"username:password"形式的权限标识来进行权限配置,便于区分不同应用来进行权限控制。
(3)World:最为开放的权限控制模式,数据节点的访问权限对所有用户开放。他只有一种权限标识,为“world:anyone”
(4)Super:超级用户,是一种特殊的Digest模式,超级用户可以对任意Zookeeper上的数据节点进行任何操作。
3.2 授权对象(ID)
权限赋予的用户或一个指定实体,如IP地址或机器等。不同的权限模式通常有不同的授权对象。
权限模式 | 授权对象 |
IP | IP地址或IP段,例如“192.168.0.110”或“192.168.0.1/24” |
Digest | username:BASE64(SHA-1(usermname:passworld)) |
World | anyone |
Super | 与Digest一致 |
3.3 权限(Permission)
通过权限检查可以被允许执行的操作,Zookeeper对所有数据的操作权限分为CREATE(节点创建权限)、DELETE(节点删除权限)、READ(节点读取权限)、WRITE(节点更新权限)、ADMIN(节点管理权限)。
二、应用
1 配置中心
客户端在自己关注的节点上注册Watcher,一旦节点数据发生变更,服务器就向客户端发出Watcher事件通知,客户端接到消息后,主动从服务器上拉取最新数据。
2 全局唯一ID生成
创建顺序节点,每个数据节点都能维护一份子节点的顺序序列。
3 分配任务和监控管理
各个服务器在Zookeeper上注册临时顺序节点,节点序号最小的机器执行任务,或者将任务分配到各个节点
4 分布式锁
(1)排它锁
所有客户端创建同一个Lock临时节点,节点内容为客户端ID,只有一个会创建成功。其他客户端在节点上注册Watcher来监听节点变化。
(2)共享锁
客户端注册临时顺序节点,如/shared_lock/192.168.0.1-R-0000000001或/shared_lock/192.168.0.2-W-0000000002。
对于读请求:如果自己是序号最小的节点或者比自己序号小的都是读请求,则获取共享锁。
如果比自己序号小的节点中存在写请求,则进入等待。
对于写请求:如果自己不是序号最小的节点,则进入等待。