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

image-20221229210843162

版本-保证 分布式数据原子性

image-20221229210820415

watcher 机制

提供 发布订阅功能

session 会话机制

image-20221229210734169

客户端

主要使用 curator API

ACL权限控制

schema:id:perm 标识

  • schema: 标识 授权策略
  • ID:授权对象
  • Permission: 授予的权限

ACL 是基于每个 znode节点的。

Schema权限模式

即使用 什么样的方式来进行授权

  • world: 默认方式,全部能访问
  • auth:代表 已经认证通过的 用户
  • digest:用户名:密码 方式认证。 最常用。
  • ip: 通过ip地址 来做 权限控制。

ID授权对象

指 权限赋予的用户 或 一个指定的实体。不同的权限模式下, 授权对象不同

image-20221229204536606

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);}
posted @ 2022-12-31 22:35  小烽  阅读(212)  评论(0编辑  收藏  举报