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开启权限认证 zookeeper权限设置_云原生

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

znode节点

节点类型

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

java复制代码# 默认创建的就是持久节点
create /test

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

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

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

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

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

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

java复制代码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客户端的指令

java复制代码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

命令说明

查看某个路径下目录列表

java复制代码ls [-s] [-w] [-R] path

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

创建节点并赋值

java复制代码create [-s] [-e] [-c] [-t ttl] path [data] [acl]

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

修改节点存储的数据

java复制代码set [-s] [-v version] path data

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

获取节点数据和状态信息

java复制代码get [-s] [-w] path

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

查看节点状态信息

java复制代码stat [-w] path

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

删除某节点

java复制代码delete [-v version] path
deleteall path [-b batch size]

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

查看节点状态

java复制代码stat path [watch]

设置节点的值

java复制代码set path data [version]

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

java复制代码ls path [watch]

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

java复制代码ls2 path [watch]

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

java复制代码create [-s] [-e] path data acl

获得节点的值

java复制代码get path [watch]

删除节点

java复制代码delete path [version]

递归删除节点

java复制代码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:<权限位>

查看默认节点权限

java复制代码# 创建一个节点
$	create -e /test
Created /test

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

修改默认权限为读写

java复制代码# 设置为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 <用户名>:<密码>

java复制代码# 通过sha1与base64组合加密码生成密钥

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

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

# 返回密钥
PbXQT4DQMDcaYC1X0EY0B2RZCwM=

设置digest 权限

java复制代码setAcl /test digest:test:PbXQT4DQMDcaYC1X0EY0B2RZCwM=:cdrw

查看节点将显示没有权限

java复制代码#查看节点
get /test

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

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

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

java复制代码# 给当前会话添加权限帐户
addauth digest test:123456

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

客户端工具

ZooInspector

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

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

makefile复制代码D:\Development\ZooInspector\build>java -jar zookeeper-dev-ZooInspector.jar

zookeeper开启权限认证 zookeeper权限设置_云原生_02

PrettyZoo

下载地址: https://github.com/vran-dev/PrettyZoo

zookeeper开启权限认证 zookeeper权限设置_云原生_03