zookeeper之znode节点与acl权限设置

zookeeper

ZooKeeper是Apache软件基金会的一个软件项目,是一个分布式的,开放源码的分布式应用程序协调服务。它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。

ZooKeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式 锁和分布式队列等功能

官网:http://ZooKeeper.apache.org/

快速开始:http://zookeeper.apache.org/doc/current/zookeeperStarted.html

API地址:https://zookeeper.apache.org/doc/

数据结构

ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode,每个ZNode都可以通过其路径唯一标识

在这里插入图片描述

zookeeper提供的名称空间非常类似于标准文件系统,key-value 的形式存储。名称key由斜线 / 分割的一系列路径元素,zookeeper名称空间中的每个节点都是由一个路径标识。

znode节点

节点类型

持久化目录节点(PERSISTENT):客户端与zookeeper断开连接后,该节点依旧存在

# 默认创建的就是持久节点
create /test

持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL):客户端与zookeeper断开连接后,该节点依旧存在,Zookeeper会给该节点按照顺序编号

# 创建序号节点
create -s /test
# 返回创建的实际路径
Created /test0000000001

create -s /test
# 返回创建的实际路径2
Created /test0000000002

临时目录节点(EPHEMERAL):客户端与zookeeper断开连接后,该节点被删除

# 创建临时节点, 断开会话 在连接将会自动删除
create -e /temp

临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL):客户端与zookeeper断开连接后,该节点被删除,Zookeeper会给该节点按照顺序编号

create -e -s /temp/seq

节点属性

查看节点属性:stat /znode

状态属性 描述
cZxid 创建节点时的事务ID,每次修改状态都会产生一个事务ID。事务ID是 ZooKeeper 中所有修改总的次序。
每次修改都有唯一的 zxid,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 之前发生。
ctime 创建节点时的时间
mZxid 最后修改节点时的事务ID
mtime 最后修改节点时的时间
pZxid 表示该节点的子节点列表最后一次修改的事务ID,添加子节点或删除子节点就会影响子节点列表,但是修改子节点的数据内容则不影响该ID(注意,只有子节点列表变更了才会变更pzxid,子节点内容变更不会影响pzxid)
cversion 子节点版本号,子节点每次修改版本号加1
dataversion 数据版本号,数据每次修改该版本号加1
aclversion 权限版本号,权限每次修改该版本号加1
ephemeralOwner 创建该临时节点的会话的sessionID。如果该节点是持久节点,那么这个属性值为0
dataLength 该节点的数据长度
numChildren 该节点拥有子节点的数量,只统计直接子节点的数量

节点监听

客户添加-w参数可实时监听节点与子节点的变化,并且实时收到通知。

命令 描述
ls -w path 监听子节点的变化(增,删)
get -w path 监听节点数据的变化
stat -w path 监听节点属性的变化
printwatches on|off 触发监听后,是否打印监听事件(默认on)

客户端命令行

查看所有命令

通过zkClient进入zookeeper客户端命令行,输入help查看zookeeper客户端的指令

localhost:2181	$	help
ZooKeeper -server host:port cmd args
	stat path [watch]
	set path data [version]
	ls path [watch]
	delquota [-n|-b] path
	ls2 path [watch]
	setAcl path acl
	setquota -n|-b val path
	history 
	redo cmdno
	printwatches on|off
	delete path [version]
	sync path
	listquota path
	rmr path
	get path [watch]
	create [-s] [-e] path data acl
	addauth scheme auth
	getAcl path

命令说明

查看某个路径下目录列表

ls [-s] [-w] [-R] path

path:代表路径,完整路径
-s:返回状态信息
-w:监听节点变化
-R:递归查看某路径下目录列表

创建节点并赋值

create [-s] [-e] [-c] [-t ttl] path [data] [acl]

[-s] [-e]-s 和 -e 都是可选的,-s 代表顺序节点, -e 代表临时节点,注意其中 -s 和 -e 可以同时使用的,并且临时节点不能再创建子节点
path:指定要创建节点的路径,比如 /runoob
data:要在此节点存储的数据
acl:访问权限相关,默认是 world,相当于全世界都能访问

修改节点存储的数据

set [-s] [-v version] path data

path:节点路径。
data:需要存储的数据。
[version]:可选项,版本号(可用作乐观锁)

获取节点数据和状态信息

get [-s] [-w] path

-s:返回结果带上状态信息
-w:返回数据并对对节点进行事件监听

查看节点状态信息

stat [-w] path

path:代表路径
-w:对节点进行事件监听

删除某节点

delete [-v version] path
deleteall path [-b batch size]

如果某节点不为空,则不能用delete命令删除

查看节点状态

stat path [watch]

设置节点的值

set path data [version]

查看当前znode中所包含的内容

ls path [watch]

查看当前节点数据并能看到更新次数等数据

ls2 path [watch]

创建节点 -s含有序列 -e临时

create [-s] [-e] path data acl

获得节点的值

get path [watch]

删除节点

delete path [version]

递归删除节点

rmr path

acl权限设置

ACL全称为Access Control List(访问控制列表),用于控制资源的访问权限。ZooKeeper使用ACL来控制对其znode的防问。

基于scheme:id:permission的方式进行权限控制。scheme表示授权模式、id模式对应值、permission即具体的增删改权限位。

注意:在使用ACL时,权限仅对当前节点有效,不会让子节点继承。

scheme认证模型

方案 描述
world 开放模式,world表示全世界都可以访问(这是默认设置)
ip ip模式,限定客户端IP防问
auth 用户密码认证模式,只有在会话中添加了认证才可以防问
digest 与auth类似,区别在于auth用明文密码,而digest 用sha-1+base64加密后的密码。在实际使用中digest 更常见。

permission权限位

权限位 权限 描述
c CREATE 可以创建子节点
d DELETE 可以删除子节点(仅下一级节点)
r READ 可以读取节点数据及显示子节点列表
w WRITE 可以设置节点数据
a ADMIN 可以设置节点访问控制列表权限

acl相关命令

命令 使用方式 描述
getAcl getAcl 读取ACL权限
setAcl setAcl 设置ACL权限
addauth addauth 添加认证用户

ACL使用示例

权限仅对当前节点有效,不会让子节点继承。如限制了IP防问A节点,但不妨碍该IP防问A的子节点

world权限

语法: setAcl <path> world:anyone:<权限位>

查看默认节点权限

# 创建一个节点
$	create -e /test
Created /test

# 查看节点权限
# 返回的默认权限表示 ,所有人拥有所有权限
$	getAcl /test
'world,'anyone
: cdrwa

修改默认权限为读写

# 设置为rw权限 
setAcl /test world:anyone:rw

# 可以正常读
get /test

# 无法正常创建子节点
create -e /test/t "rw"

# 返回没有权限的异常
Authentication is not valid : /test/t

IP权限示例:

语法:setAcl <path> ip:<ip地址|地址段>:<权限位>

auth模式示例:
语法:

setAcl <path> auth:<用户名>:<密码>:<权限位>

addauth digest <用户名>:<密码>

digest 权限示例:

语法:

setAcl <path> digest :<用户名>:<密钥>:<权限位>

addauth digest <用户名>:<密码>

# 通过sha1与base64组合加密码生成密钥

echo -n <用户名>:<密码> | openssl dgst -binary -sha1 | openssl base64

# 先 sha1 加密,然后base64加密
echo -n test:123456 | openssl dgst -binary -sha1 | openssl base64

# 返回密钥
PbXQT4DQMDcaYC1X0EY0B2RZCwM=

设置digest 权限

setAcl /test digest:test:PbXQT4DQMDcaYC1X0EY0B2RZCwM=:cdrw

查看节点将显示没有权限

#查看节点
get /test

# 显示没有权限访问
Authentication is not valid : /test

给当前会话添加认证后再查看

为节点设置digest 权限后,访问前必须执行addauth,当前会话才可以防问。

# 给当前会话添加权限帐户
addauth digest test:123456

# 再次查看即可成功查看
get /test

客户端工具

ZooInspector

下载地址: https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip

解压进入ZooInspector\build目录,执行命令:

D:\Development\ZooInspector\build>java -jar zookeeper-dev-ZooInspector.jar

在这里插入图片描述

PrettyZoo

下载地址: https://github.com/vran-dev/PrettyZoo
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38628046/article/details/125852005