架构师之路

ZooKeeper详解2.基础知识

2019-03-07  本文已影响15人  卢卡斯哔哔哔

1 ZooKeeper的结构

1.1 数据模型

image.png

1.2 znode的类型

znode一共有4种类型:持久的(persistent)、临时的(ephemeral)、持久有序的(persistent_sequential)和临时有序的(ehpemeral_sequential)

持久节点
临时节点
有序节点

一个有序节点被分配为一个单调递增的整数,比如通过create -s /user 0会创建一个user0000000002的有序节点,继续创建则会创建出user0000000003user0000000004等节点。

1.3 znode的属性

一个znode不仅可以保存值,还有很多属性来表示其性质,如下所示:

# 该path的对应的值
123
# 创建节点时的事务id
cZxid = 0x5f
# 创建节点时的时间戳
ctime = Wed Mar 06 16:54:38 CST 2019
# 最近一次修改的事务id
mZxid = 0x61
# 最近一次修改的时间戳
mtime = Wed Mar 06 16:54:52 CST 2019
# 子节点列表最后一次被修改的事务id
pZxid = 0x5f
# 子节点的版本号,子节点发生变化子节点版本递增
cversion = 0
# 当前节点数据的版本号,如果数据修改版本号会递增
dataVersion = 1
# 权限版本号,权限发生变化时权限版本号递增
aclVersion = 0
# 临时节点的拥有着,拥有者断开时自动消失
ephemeralOwner = 0x100073f79100005
# 数据长度
dataLength = 3
# 子节点个数
numChildren = 0

2 增删改查

增:create [-s] [-e] path data acl
删:delete path [version]
删:rmr path
改:set path data [version]
查:get path [watch]
查:ls path [watch]
查:ls2 path [watch]
查:stat path

3 quota命令

quota的意思是限额,可以限制一个path上子节点的个数或者path上的数据长度。

增:setquota -n|-b val path

-n val:设置子节点个数最大为值为val
-b val:设置节点数据长度的最大值val

删:delquota [-n|-b] path

跟setquota中的含义一致,删除path上的quota

查:listquota path

列出改path上的quota信息。

[zk: localhost:2181(CONNECTED) 19] listquota /users
# quota对应的znode的位置
absolute path is /zookeeper/quota/users/zookeeper_limits
# quota设置的值:count表示子节点最大数,bytes表示数据长度最大值
# 为-1表示没有限制
Output quota for /users count=5,bytes=-1
# 当前节点的状态:count的值包括本节点
Output stat for /users count=4,bytes=16
quota细节
  1. 父节点有quota设置时子节点不允许设置
  2. 当前节点已经有quota时不允许重复设置
  3. quota的设置的其实是在/zookeeper/quota/${path}/zookeeper_limits中设置的一个znode
  4. quota中count的值包括当前节点,即如果/users有三个子节点,那么count=4
  5. quota中count的值是递归的,即如果/users/lucas还有子节点,那么该子节点也计算在/users的count中
  6. 超出quota不会报错,会打印一行WARN日志

4 权限控制

参考ZooKeeper ACL权限控制

4.1 ACL(Access Control List)简介

ACL是ZooKeeper的权限控制系统。生产环境中,一个ZooKeeper集群可能有多个客户端在连接,需要为不同的客户端分配不同znode的权限,防止误操作。ACL使用schema:id:permission来描述权限控制,其特性如下:

  1. ZooKeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限
  2. 每个znode支持设置多种权限控制方案和多个权限
  3. 子节点不会继承父节点的权限,客户端无权访问某节点,但可能可以访问它的子节点
Schema与id
权限模式 id 描述
world 只有一个id:anyone 默认方式,所有人都可以访问
ip 一个IP地址 通常是一个IP地址或是IP段,例如“192.168.122.112”
auth 不需要id 只要是通过authentication的user都有权限
digest username:BASE64(SHA1(password)) 使用“用户名:密码”方式认证
super 在这种scheme情况下,对应的id可以做任何事情
权限
权限 ACL简写 描述
CREATE c 可以创建子节点
DELETE d 可以删除子节点(仅下一级节点)
READ r 可以读取节点数据及显示子节点列表
WRITE w 可以设置节点数据
ADMIN a 可以设置节点访问控制列表权限

4.2 命令

setAcl path acl

设置znode的权限

# world模式
setAcl path world:anyone:<acl>
# ip模式
setAcl path ip:<ip>:<acl>
# auth模式
addauth digest <user>:<password> #添加认证用户
setAcl path auth:<user>:<acl>
# digest模式
setAcl path digest:<user>:<password>:<acl>
getAcl path

查看path的权限

[zk: localhost:2181(CONNECTED) 0] getAcl /
'world,'anyone
: cdrwa
addauth scheme auth

添加用户权限

5 其他命令

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
    quit
    getAcl path
    close
    connect host:port
上一篇下一篇

猜你喜欢

热点阅读