kazoo扫盲指南,简述ZK ACL权限控制及使用方式

kazoo是什么?

Python版Zookeeper客户端工具,可以利用Python能够轻松、便捷的使用zookeeper,与之产生交互

官方文档

https://kazoo.readthedocs.io/en/latest/install.html

基本用法

使用kazoo,首先需要实例化一个KazooClient对象并建立连接,代码如下:

from kazoo.client import KazooClient

zk = KazooClient(hosts=“127.0.0.1:2181”)
zk.start()

zk.stop() # 调用结束,显式断开与Zookeeper连接

会话状态

Kazoo的客户端在与zookeeper服务会话的过程中,通常会在以下三种状态之间相互切换:CONNECTED、 SUSPENDED、LOST。

def connection_listener(state):
if state == “LOST”:
# Register somewhere that the session was lost
pass
elif state == “SUSPENDED”:
# Handle being disconnected from Zookeeper
pass
else:
# Handle being connected/reconnected to Zookeeper
pass
zk = KazooClient(hosts=“127.0.0.1:2181”)
zk.add_listener(connection_listener) # 监听Session状态

zookeeper的增删改查

方法:

ensure_path():递归创建节点路径,只能设置权限,不能添加数据。
create():创建节点,并同时可以添加数据和监听事件,前提是其父节点必须存在,不能递归创建。
用法:

zk.ensure_path("/china/henan")
zk.create("/china", b"this is china node.")

读取数据

方法:

exists():检查节点是否存在
get():获取节点数据以及节点状态的详细信息
get_children():获取指定节点的所有子节点

更新数据

方法:

set():更新指定节点的信息。

删除节点

方法:

delete():删除指定节点。

监听器

kazoo可以在节点上添加监听,使得在节点或节点的子节点发生变化时进行触发。

kazoo支持两种类型的添加监听器的方式,一种是zookeeper原生支持的,其用法如下:

def test_watch_data(event):
print(“this is a watcher for node data.”)
zk.get_children("/china", watch=test_watch_children)
另一种方式是通过python修饰器的原理实现的,支持该功能的方法有:

ChildrenWatch:当子节点发生变化时触发
DataWatch:当节点数据发生变化时触发
其用法如下:

@zk.ChildrenWatch("/china")
def watch_china_children(children):
print(“this is watch_china_children %s” % children)

@zk.DataWatch("/china")
def watch_china_node(data, state):
print(“china node is %s” % data)

kazoo事务

自v3.4以后,zookeeper支持一次发送多个命令,这些命令作为一个原子进行提交,要么全部执行成功,要么全部失败。

使用方法如下:

transaction = zk.transaction()
transaction.check(’/china/hebei’, version=3)
transaction.create(’/china/shanxi’, b"thi is shanxi.")
results = transaction.commit()

Zookeeper权限控制之ACL

总体来说,ZK的节点有5种操作权限:
CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)

注:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限

身份的认证有4种方式:
world:默认方式,相当于全世界都能访问
auth:代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)
digest:即用户名:密码这种方式认证,这也是业务系统中最常用的,组件库中配置管理模块所采用ACL权限管控认证均采用digest方式
ip:使用Ip地址认证

创建ACL权限认证:

方式一:

from kazoo import security

user_name_read = ‘ajsql’ # 设置账号
password_read = ‘ajsql’ # 设置密码

acl_read = security.make_digest_acl(username=user_name_read, password=password_read, read=True, admin=True) # 创建ACL对象 权限为只读
zk = KazooClient(hosts=“localhost:2181”, default_acl=[acl_read]) # 建立Zookeeper客户端,账号默认为acl_read
zk.start() # 开始连接

zk.stop() # 关闭连接

方式二:

from kazoo import security

user_name_read = ‘ajsql’ # 设置账号
password_read = ‘ajsql’ # 设置密码

acl_read= security.make_acl(‘digest’, ‘ajsql:ajsql’, read=True, admin=True) # 创建ACL对象 权限为只读

zk = KazooClient(hosts=“localhost:2181”, default_acl=[acl_read]) # 建立Zookeeper客户端,账号默认为acl_read
zk.start() # 开启连接

zk.stop() # 关闭连接

查看节点ACL权限:

from kazoo.client import KazooClient

zk = KazooClient(hosts=“localhost:2181”, default_acl=[acl_read])
zk.start()

zk_acls = zk.get_acls(path="/test_node") # 查看当前节点ACL权限信息

zk.stop()

访问有权限的Zookeeper节点:

from kazoo.client import KazooClient

zk= KazooClient(hosts=“localhost:2181”, auth_data=[(“digest”, “ajsql_read:ajsql_read”)]) # 添加账号, 此处入参格式数组,数组内账号为元组
zk.start() # 开启连接

data, state = zk.get("/test_node") # 访问权限节点

zk.stop() # 关闭连接

PS: 如添加账号后访问某个节点,报错AutoError,则为账号权限导致,该账号无此节点访问权限

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值