zookeeper quota & acl

quota

节点数限制

  • 创建测试节点
[zk: localhost:2181(CONNECTED) 27] create /test_quota_count a
Created /test_quota_count
  • 设置quota,节点数量设置为5
[zk: localhost:2181(CONNECTED) 28] setquota -n 5 /test_quota_count
Comment: the parts are option -n val 5 path /test_quota_count
  • 查看测试节点quota和当前状态
[zk: localhost:2181(CONNECTED) 29] listquota /test_quota_count
absolute path is /zookeeper/quota/test_quota_count/zookeeper_limits
Output quota for /test_quota_count count=5,bytes=-1
Output stat for /test_quota_count count=1,bytes=1

[zk: localhost:2181(CONNECTED) 31] get /zookeeper/quota/test_quota_count/zookeeper_limits
count=5,bytes=-1 # quota 节点数量限制为5,大小不限制
cZxid = 0x140000296e
ctime = Fri May 10 15:19:11 CST 2019
mZxid = 0x140000296e
mtime = Fri May 10 15:19:11 CST 2019
pZxid = 0x140000296e
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 16
numChildren = 0

[zk: localhost:2181(CONNECTED) 32] get /zookeeper/quota/test_quota_count/zookeeper_stats
count=1,bytes=1 # 测试节点当前子节点数量为1,大小为1个字节
cZxid = 0x140000296f
ctime = Fri May 10 15:19:11 CST 2019
mZxid = 0x140000296f
mtime = Fri May 10 15:19:11 CST 2019
pZxid = 0x140000296f
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 15
numChildren = 0
[zk: localhost:2181(CONNECTED) 33]
  • 在测试节点下尝试创建子节点
[zk: localhost:2181(CONNECTED) 34] create /test_quota_count/a a
Created /test_quota_count/a
[zk: localhost:2181(CONNECTED) 35] create /test_quota_count/b a
Created /test_quota_count/b
[zk: localhost:2181(CONNECTED) 36] create /test_quota_count/c a
Created /test_quota_count/c
[zk: localhost:2181(CONNECTED) 37] create /test_quota_count/d a
Created /test_quota_count/d
[zk: localhost:2181(CONNECTED) 38] create /test_quota_count/e a
Created /test_quota_count/e
[zk: localhost:2181(CONNECTED) 39] create /test_quota_count/f a
Created /test_quota_count/f
  • 看下日志文件zookeeper.out,当节点数量达到上限时,会有告警日志

    需要注意的是,这里只是告警,并不会阻止子节点的创建

2019-05-10 15:22:52,478 [myid:1] - WARN  [CommitProcessor:1:DataTree@302] - Quota exceeded: /        test_quota_count count=6 limit=5
2019-05-10 15:22:54,726 [myid:1] - WARN  [CommitProcessor:1:DataTree@302] - Quota exceeded: /        test_quota_count count=7 limit=5

子节点大小限制

  • 创建测试节点
[zk: localhost:2181(CONNECTED) 43] create /test_quota_byte a
Created /test_quota_byte
  • 设置quota,节点大小限制为10个字节
[zk: localhost:2181(CONNECTED) 44] setquota -b 10 /test_quota_byte
Comment: the parts are option -b val 10 path /test_quota_byte
  • 查看测试节点quota和当前状态
[zk: localhost:2181(CONNECTED) 45] get /zookeeper/quota/test_quota_byte/zookeeper_limits
count=-1,bytes=10 # quota 子节点大小限制为10字节,节点数量不限制
cZxid = 0x1400002978
ctime = Fri May 10 15:28:10 CST 2019
mZxid = 0x1400002978
mtime = Fri May 10 15:28:10 CST 2019
pZxid = 0x1400002978
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 17
numChildren = 0
[zk: localhost:2181(CONNECTED) 46] get /zookeeper/quota/test_quota_byte/zookeeper_stats
count=1,bytes=1 # 测试节点当前子节点数量为1,大小为1个字
cZxid = 0x1400002979
ctime = Fri May 10 15:28:10 CST 2019
mZxid = 0x1400002979
mtime = Fri May 10 15:28:10 CST 2019
pZxid = 0x1400002979
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 15
numChildren = 0
[zk: localhost:2181(CONNECTED) 47]
  • 在测试节点下尝试创建子节点

    每个节点数据设置为aaa(3个字节),创建*/test_quota_byte/d*节点时,子节点大小总共为12字节,超过quota 10字节,所以触发告警

[zk: localhost:2181(CONNECTED) 47] create /test_quota_byte/a aaa
Created /test_quota_byte/a
[zk: localhost:2181(CONNECTED) 48] create /test_quota_byte/b aaa
Created /test_quota_byte/b
[zk: localhost:2181(CONNECTED) 49] create /test_quota_byte/c aaa
Created /test_quota_byte/c
[zk: localhost:2181(CONNECTED) 50] create /test_quota_byte/d aaa
Created /test_quota_byte/d
[zk: localhost:2181(CONNECTED) 51] create /test_quota_byte/e aaa
Created /test_quota_byte/e
[zk: localhost:2181(CONNECTED) 52]
  • 看下日志文件zookeeper.out,当节点数量达到上限时,会有告警日志

    同样需要注意的是,这里只是告警,并不会阻止子节点的创建

2019-05-10 15:30:01,711 [myid:1] - WARN  [CommitProcessor:1:DataTree@348] - Quota exceeded: /test_quota_byte bytes=13 limit=10
2019-05-10 15:30:06,375 [myid:1] - WARN  [CommitProcessor:1:DataTree@348] - Quota exceeded: /test_quota_byte bytes=16 limit=10

ACL

zookeeper ACL策略概述

zookeeper使用ACL控制数据节点的访问权限,ACL的实现与UNIX系统的文件访问权限十分相似:使用权限位允许/禁止针对节点的各种操作。与标准的UNIX权限不同的是,ZooKeeper节点不受用户(文件所有者),组和world(其他)的三个标准范围的限制。zookeeper没有节点属主的概念,相反,ACL指定ID集与这些ID集对应的权限。

另外需要注意,一条ACL策略只属于一个特定的znode,并且不会应用到子节点。例如客户端172.16.16.1没有权限读取 /app 节点,并且*/app/status节点的权限为world,则任何人都可以读取/app/status*,ACLs并不是递归的。

当客户端连接到ZooKeeper并对其自身进行身份验证时,ZooKeeper会将与客户端对应的所有ID与客户端连接相关联。 当客户端尝试访问节点时,将根据znode的ACL检查这些ID。 ACL由*(scheme:expression,perms)对组成。 表达式的格式特定于该方案。 例如,对(ip:19.22.0.0/16,READ)为任何IP地址以19.22开头的客户端提供 READ *权限。

ACL权限

zookeeper支持以下几种权限,简称cdrwa

  • CREATE: 创建子节点
  • READ: 获取节点数据和展示子节点
  • WRITE: 节点写权限
  • DELETE: you can delete a child node 子节点删除权限
  • ADMIN: 管理权限

内置的 ACL 策略

ZooKeeeper 有以下内置策略

  • world 拥有唯一ID,任何人都能访问
  • auth 不使用ID,通过验证的用户可以访问
  • digest 使用用户名:密码 串生成MD5哈希值,该哈希值作为ACL 的ID标识。用户名和密码通过以明文形式发送。在ACL中使用时,表达式将是username:base64
  • ip 使用客户端主机IP作为ACL ID标识。 ACL表达式的形式为addr/bits,其中addr的最高有效与客户端主机IP的最高有效*位匹配。

world

默认权限,意味着*'world,'anyone*(任何人)都拥有cdrwa权限,也就是所有权限

[zk: localhost:2181(CONNECTED) 57] create /acl_world a
Created /acl_world
[zk: localhost:2181(CONNECTED) 59] getAcl /acl_world
'world,'anyone
: cdrwa

auth

[zk: localhost:2181(CONNECTED) 0] create /acl_auth aaa
Created /acl_auth
[zk: localhost:2181(CONNECTED) 1] setAcl /acl_auth auth:uuu:ppp:cdrwa
# 此处命令执行失败,需要先添加认证账户
Acl is not valid : /acl_auth
[zk: localhost:2181(CONNECTED) 2] addauth digest uuu:ppp
[zk: localhost:2181(CONNECTED) 3] setAcl /acl_auth auth:uuu:ppp:cdrwa
cZxid = 0x170000001b
ctime = Tue May 14 14:30:54 CST 2019
mZxid = 0x170000001b
mtime = Tue May 14 14:30:54 CST 2019
pZxid = 0x170000001b
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
[zk: localhost:2181(CONNECTED) 4] getAcl /acl_auth
'digest,'uuu:wKhrpTU/8O8cNLmJOA+2fXRriYE=
: cdrwa
[zk: localhost:2181(CONNECTED) 5]

digest

  • 生成密码的hash值

    我的zookeeper安装在/opt/zkCluster/zookeeper01目录下

# java -Djava.ext.dirs=/opt/zkCluster/zookeeper01/lib -cp /opt/zkCluster/zookeeper01/zookeeper-3.4.14.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider xxx:yyy

xxx:yyy->xxx:yWlnf+Vk2i3i9foVIUCXwC64/Zg=
  • 创建测试节点并设置ACL策略
[zk: localhost:2181(CONNECTED) 15] create /acl_digest1 aaa
Created /acl_digest1
[zk: localhost:2181(CONNECTED) 16] getAcl /acl_digest1
'world,'anyone
: cdrwa
# 设置create, read, delete 权限
[zk: localhost:2181(CONNECTED) 17] setAcl /acl_digest1 digest:xxx:yWlnf+Vk2i3i9foVIUCXwC64/Zg=:crd
cZxid = 0x1700000009
ctime = Tue May 14 13:36:13 CST 2019
mZxid = 0x1700000009
mtime = Tue May 14 13:36:13 CST 2019
pZxid = 0x1700000009
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

[zk: localhost:2181(CONNECTED) 18] getAcl /acl_digest1
'digest,'xxx:x # 此时acl已设置成功
: cdryWlnf+Vk2i3i9foVIUCXwC64/Zg=:cr 
  • 测试acl权限
[zk: localhost:2181(CONNECTED) 0] create /acl_digest1/aaa aaa
# create操作被限制
Authentication is not valid : /acl_digest1/aaa
# 添加认证
[zk: localhost:2181(CONNECTED) 1] addauth digest xxx:yyy
[zk: localhost:2181(CONNECTED) 2] create /acl_digest1/aaa aaa
# 操作成功
Created /acl_digest1/aaa
[zk: localhost:2181(CONNECTED) 3]

ip

基于客户端IP设置ACL

  • 创建测试节点并设置acl
[zk: localhost:2181(CONNECTED) 4] create /acl_ip aaa
Created /acl_ip
# 只允许本地连接的权限
[zk: localhost:2181(CONNECTED) 5] setAcl /acl_ip ip:127.0.0.1:cdrwa
cZxid = 0x170000000f
ctime = Tue May 14 14:11:30 CST 2019
mZxid = 0x170000000f
mtime = Tue May 14 14:11:30 CST 2019
pZxid = 0x170000000f
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

[zk: localhost:2181(CONNECTED) 0] getAcl /acl_ip
'ip,'127.0.0.1
: cdrwa
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值