Watcher–数据变更通知
- zookeeper使用Watcher机制实现分布式数据的发布/订阅功能
- 一个典型的发布/订阅模型系统定义个一种一对多的订阅关系,能够让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态发生变化时,会通知所有订阅者,使他们能够做出相应的处理。
- 在zookeeper中,引入了Watcher机制来实现这种分布式的通知功能,zookeeper允许客户端向服务端注册一个Watcher监听,当服务端的一些指定事件触发了这个Watcher,那么就会向指定的客户端发送一个事件通知来实现分布式的通知功能
整个Watcher注册与通知过程如下图所示
zookeeper的Watcher机制主要包括客户端线程、客户端WatcherManager、Zookeeper服务器三部分
具体工作流程为:客户端在向Zookeeper服务器注册的同时,会将Watcher对象存储在客户端的WatcherManager当中,当Zookeeper服务器触发Watcher事件后,会向客户端发送通知,客户端线程从WatcherManager中取出对应的Watcher对象来执行回调逻辑。
ACL–保障数据的安全
zookeeper作为一个分布式的协调框架,其内部存储了分布式系统运行时状态的元数据,这些元数据会直接影响基于zookeeper进行构造的分布式系统的运行状态,因此,如果保障系统中数据的安全,从而避免因误操作所带来的数据随意变更而导致的数据库异常十分重要,在zookeeper中,提供了一套完善的ACL(Access Control List) 权限控制机制来保障数据的安全。
我们可以从三个方面的理解ACL机制:权限模式(Scheme)、授权对象(ID)、权限(Permission),通常使用”scheme: id : permission“来标识一个有效的ACL信息。
- 权限模式用来确定权限验证过程中使用的检验策略,有如下四种模式
- IP
IP模式就是通过IP地址粒度来进行权限控制,如”ip:192.168.0.110“表示权限控制针对该IP地址,同时IP模式可以支持按照网段方式进行配置,如”ip:192.168.0.1/24“表示针对192.168.0.*这个网段进行权限控制
- Digest
Digest是最常用的权限控制模式,更符合我们对权限控制的认识,其使用"username:password"形式的权限标识来进行权限配置,便于区分不同应用来进行权限控制。当我们通过"username:password"形式配置了权限标识后,zookeeper会先后对其进行SHA-1加密和BASE64编码
- World
World是一种最开放的权限控制模式,这种权限控制方式几乎没有任何作用,数据节点的访问权限对所有用户开放,即所有用户都可以在不进行任何权限校验的情况下操作zookeeper上的数据。另外,World模式也可以看做是一种特殊的Digest模式,它只有一个权限标识,即"world:anyone"
- Super
super模式,顾名思义就是超级用户的意思,也是一种特殊的Digest模式。在super 模式下,超级用户可以对任意zookeeper上的数据节点进行任何操作。
- 授权对象:ID
授权对象指的是权限赋予的用户或者一个指定实体,例如IP地址或者机器等。在不同的权限模式下,授权对象是不同的,下面是各个权限模式和授权对象之间的对应关系
| 权限模式 | 授权对象 |
|---|---|
| IP | 通常是一个IP地址或者IP段,例如:192.168.10.110 或192.168.10.1/24 |
| Digest | 自定义,通常是username:BASE64(SHA-1(username:password)) 例如:zm:sdfndsllndlksfn7c= |
| World | 只有一个ID:anyone |
| Super | 超级用户 |
- 权限
权限就是指那些通过权限检查后可以被允许执行的操作,在zookeeper中,所有对数据的操作权限分为以下五大类:
- CREATE(C):数据节点的创建权限,允许授权对象在该数据节点下创建子节点
- READ(R):数据节点的读取权限,允许授权对象访问该数据节点并读取其数据内容和子节点列表
- WRITE(W):更新节点数据的权限,允许授权对象对该数据节点进行更新操作
- DELETE(D):删除子节点的权限,允许授权对象删除该数据节点的子节点
- ADMIN(A):数据节点的管理权限,允许授权对象对该数据节点进行ACL相关的设置操作。