欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Zookeeper session机制、watcher机制、acl权限控制

程序员文章站 2022-04-15 17:04:25
session机制 zkCli、zkServer之间的连接有3种状态 connecting 正在连接。如果zkServer集群了,会连接到集群的某个节点上 conneted 已连接 closed 关闭连接 zkCli连接上zkServer后会开启一个session(会话),如何维持session?通 ......

 

session机制

zkcli、zkserver之间的连接有3种状态

  • connecting  正在连接。如果zkserver集群了,会连接到集群的某个节点上
  • conneted  已连接
  • closed  关闭连接

 

zkcli连接上zkserver后会开启一个session(会话),如何维持session?通过心跳。

zkcli每隔一定时间(默认2000ms)发送一个心跳包给zkserver,如果zkserver连续多少次没有收到某个zkcli的心跳包(默认10次),就认为该zkcli挂了,自动断开连接、销毁对应的session,销毁session时会销毁本次会话中创建的临时节点(-e)。

zkcli使用close、quit命令或者ctrl+c也会断开连接,等10个心跳包时间(默认20s)之后zkserver会自动销毁对应的session。

 

所谓心跳包就是ping一下zkserver,告诉zkserver我还活着。

 

 

 

 

watcher机制

可以给节点添加watcher,当节点发生某种变化时,自动触发watchedevent事件。

watcher有2种

#给/mall添加watcher,只监听/mall本身的数据变化,当/mall本身的数据变化时自动触发watchedevent事件。get|stat这2种设置方式等效
get  -w /mall
stat -w /mall

#只监听/mall的子节点的增删,当/mall增删子节点(子节点数量变化)时自动触发watchedevent事件。只对子节点的增删有效,对孙节点无效 ls -w /mall

 

以前的写法: get|stat|ls  /mall  watch    官方不推荐

 

watcher是观察者模式,观察到某种现象发生时自动做一些事情

 

某个zkcli给zkserver的某个节点添加watcher后,第一次触发watchedevent后watcher会通知注册监听的zkcli,之后这个watcher就被销毁,不再有效,如果后续还需要监听,需要再次添加watcher。

哪个zkcli添加的watcher,触发watchedevent事件后就只通知哪个zkclient,且watcher是一次性的。

 

 

 

 

 

acl权限控制

可以给节点设置用户权限,来限制用户对节点可以进行的操作,保证数据安全性。

 

查看某个节点的acl权限配置

getacl /mall

默认是:

'world,'anyone
: cdrwa

world下面只有1个用户anyone,表示所有用户,权限是cdrwa。

 

 

acl权限

  • c   create,可创建子节点
  • d  delete,可删除子节点
  • r  read,可读取节点数据
  • w   write,可写入|更新节点数据
  • a   admin,可管理此节点,配置acl权限

没有某个字母,就说明没有该项权限。

 

 

设置权限

#统一设置所有用户的权限,world:anyone:权限
setacl world:anyone:cdrwa



#设置某个用户的权限
#auth:用户名:密码:权限
auth:chy:abcd:cdrwa

#digest:用户名:base64(sha1(密码)):权限
digest:chy:base64(sha1(abcd)):cdrwa
#auth、digest的区别:auth在zkserver上以明文的形式存储密码,digest以密文的形式存储密码



#根据ip来设置权限
ip:192.168.1.2:cdrwa

 

super是zk的超级用户,具有acl所有权限,可以在bin/zkserver.sh中配置

vim zkserver.sh


找到下面的代码

nohup "$java" $zoo_datadir_autocreate "-dzookeeper.log.dir=${zoo_log_dir}" \
    "-dzookeeper.log.file=${zoo_log_file}" "-dzookeeper.root.logger=${zoo_log4j_prop}" \

在第二行末尾的\之前加上

super_acl="-dzookeeper.digestauthenticationprovider.superdigest=super:gg7s8t3odetiqf6dm9lli/r+9ss="

super是用户名,冒号后面是加密后的密码,此处我设置的密码是super。

 

 

流程示例

#设置权限。默认是anyone,具有所有权限,包括a,所以可配置acl权限
setacl /mall auth:chy:abcd:cdrwa

#验证用户名、密码,相当于以某个用户身份登录
addauth digest chy:abcd

 

 

acl使用场景

分离zk的开发环境跟测试环境,开发只能操作开发环境中的节点,测试只能操作测试环境中的节点。

生产环境,限制服务节点(通过ip来指定)只能访问、操作相关的节点。