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

@[TOC](kazoo扫盲指南)

## 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,则为账号权限导致,该账号无此节点访问权限

组件库结合kazoo场景使用

模块简介:

连接Zookeeper,获取ZK状态信息

只读方式访问对应节点最新配置信息

对配置文件增删改查(组件库目前配置模块内置账号只有组件库配置节点只读权限,无法进行其他操作)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容