zookeeper 基本介绍
zookeeper
分布式协调服务
数据模型
文件系统类似,树形结构
操作命令
create
set
delete
deleteall
get
ls
stat
....
节点类型
4中类型的节点(zk3.6 加了2种类型)
持久化节点
- 持久化节点 persistent
- 持久化 临时节点 persistent_sequential
临时节点
生命周期与客户端会话周期一致
- 临时节点 ephemeral
- 临时有序节点 ephemeral_sequential
临时节点不能 存在 子节点
Container 节点
zookeeper 3.6 新加
为 Leader、Lock 等操作 而设计的节点类型。
作用:当容器节点的最后一个子节点 被 删除后, 容器节点 会被标注, 并且在一段时间后 删除。
需要捕获 KeeperException.NoNodeException异常。
TTL 节点
zookeeper3.6 新加
节点在指定 TTl时间内没有修改 并且没有 子节点使, 该节点会在一段时间后被删除。
启动需要添加 参数:
Dzookeeper.extendedTypesEnabled=true
zookeeper 特性
节点状态信息 stat
版本-保证 分布式数据原子性
watcher 机制
提供 发布订阅功能
session 会话机制
客户端
主要使用 curator API
ACL权限控制
schema:id:perm 标识
- schema: 标识 授权策略
- ID:授权对象
- Permission: 授予的权限
ACL 是基于每个 znode节点的。
Schema权限模式
即使用 什么样的方式来进行授权
- world: 默认方式,全部能访问
- auth:代表 已经认证通过的 用户
- digest:用户名:密码 方式认证。 最常用。
- ip: 通过ip地址 来做 权限控制。
ID授权对象
指 权限赋予的用户 或 一个指定的实体。不同的权限模式下, 授权对象不同
Id ipId1 = new Id("ip", "192.168.190.1");
Id ANYONE_ID_UNSAFE = new Id("world", "anyone");
Permission 权限类型
指通过 权限 检查后 可以被允许的操作
create / delete / read / write / admin
- create: 允许对 子节点 create 操作
- read: 允许对 本节点 getChildren 和 getData操作
- write: 允许对 本节点 setData
- delete:允许对 子节点 delete操作
- admin:允许对 本节点 setAcl 操作
权限模式schema 和 授权对象 ID 主要用来 确认 权限验证过程种使用的验证策略。 匹配到验证策略并 验证成功后, 再根据 权限操作类型来决定当前客户端的 访问权限。
认证 - 授权
实战
ACL 命令
getAcl getAcl <path> 读取ACL权限
setAcl setAcl <path> <acl> 设置ACL权限
addauth addauth <scheme> <auth> 添加认证用户
word方式
创建一个节点后默认就是world模式
[zk: localhost:2181(CONNECTED) 2] create /auth
Created /auth
[zk: localhost:2181(CONNECTED) 3] getAcl /auth
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 4] create /world
Created /world
[zk: localhost:2181(CONNECTED) 5] getAcl /world
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 6] setAcl /world:anyone:acd
setAcl [-s] [-v version] [-R] path acl
[zk: localhost:2181(CONNECTED) 7] setAcl /world world:anyone:acd
[zk: localhost:2181(CONNECTED) 8] getAcl /world
IP模式
在ip模式中,首先连接到zkServer的命令需要使用如下方式 接着按照IP的方式操作如下
[zk: 192.168.221.128:2181(CONNECTED) 3] create /ip-modelCreated /ip-model[zk: 192.168.221.128:2181(CONNECTED) 4] setAcl /ip-model ip:127.0.0.1:cdrwa,ip:192.168.221.128/131:cdrwaAcl is not valid : /ip-model[zk: 192.168.221.128:2181(CONNECTED) 5] setAcl /ip-model ip:127.0.0.1:cdrwa,ip:192.168.221.128:cdrwa[zk: 192.168.221.128:2181(CONNECTED) 6] getAcl /ip-model'ip,'127.0.0.1: cdrwa'ip,'192.168.221.128: cdrwa
Auth模式
auth模式的操作如下。 当我们退出当前的会话后,再次连接,执行如下操作,会提示没有权限 这时候,我们需要重新授权。
[zk: 192.168.221.128:2181(CONNECTED) 7] create /authCreated /auth
[zk: 192.168.221.128:2181(CONNECTED) 8] addauth digest mic:mic # 增加授权用户,明文用户名和密码,zk会对密码加密[zk: 192.168.221.128:2181(CONNECTED) 9] setAcl /auth auth:mic:cdrwa # 授予权限[zk: 192.168.221.128:2181(CONNECTED) 11] getAcl /auth'digest,'mic:xUsfnPBF9eNvHVWZx/TZt9ioxBA=: cdrwa
[zk: 192.168.221.128:2181(CONNECTED) 12]
退出当前会话后,权限需要重新设置
Digest
使用语法,会发现使用方式和Auth模式相同。
setAcl /digest digest:用户名:密码:权限
但是有一个不一样的点,密码需要用加密后的,否则无法被识别。
密码: 用户名和密码加密后的字符串。
使用下面程序生成密码 得到:xUsfnPBF9eNvHVWZx/TZt9ioxBA=
再回到client上进行如下操作 当退出当前会话后,需要再次授权才能访问/digest节点
public static void main(String[] args) throws Exception {
String up="mic:mic";
byte[] digest=MessageDigest.getInstance("SHA1").digest(up.getBytes());
String encodeString=Base64.getEncoder().encodeToString(digest); System.out.println(encodeString);}