python模块篇06-zk

官方文档:https://kazoo.readthedocs.io/en/latest/api/client.html

一、安装
 这个简单,使用 pip 命令安装
pip3 install kazoo
 
二、连接 ZooKeeper 
可通过 KazooClient 类直接连接 ZooKeeper ,支持多个 host ,端口默认 2181
import json
from kazoo.client import KazooClient

zk = KazooClient(hosts='10.1.44.55')
zk.start()
 
三、创建节点
先看下 create() 方法定义:
def create(self, path, value=b"", acl=None, ephemeral=False,
               sequence=False, makepath=False):
 
        :param path: Path of node.
        :param value: Initial bytes value of node.
        :param acl: :class:`~kazoo.security.ACL` list.
        :param ephemeral: Boolean indicating whether node is ephemeral
                          (tied to this session).
        :param sequence: Boolean indicating whether path is suffixed
                         with a unique index.
        :param makepath: Whether the path should be created if it
                         doesn't exist.

 我们来解释下这些参数:
path:          节点路径
value:         节点对应的值,注意值的类型是 bytes
ephemeral: 若为 True 则创建一个临时节点,session 中断后自动删除该节点。默认 False
sequence:     若为 True 则在你创建节点名后面增加10位数字(例如:你创建一个 testplatform/test 节点,实际创建的是 testplatform/test0000000003,这串数字是顺序递增的)。默认 False
makepath:  若为 False 父节点不存在时抛 NoNodeError。若为 True 父节点不存在则创建父节点。默认 False
 
 举个例子:
from kazoo.client import KazooClient

zk = KazooClient(hosts='10.1.44.55')
zk.start()
# 创建节点:makepath 设置为 True ,父节点不存在则创建,其他参数不填均为默认
zk.create('/testplatform/test',b'this is test!',makepath=True)
# 操作完后,别忘了关闭zk连接
zk.stop()
print(value)
 
四、查看节点
KazooClient 类用提供 get_children() 和 get() 方法获取 子节点 和 节点对应的值
from kazoo.client import KazooClient

zk = KazooClient(hosts='10.1.44.55')
zk.start()
# 获取某个节点下所有子节点
node = zk.get_children('/testplatform')
# 获取某个节点对应的值,bytes类型
value = zk.get('/testplatform/mssql')
# 操作完后,别忘了关闭zk连接
zk.stop()
print(node,value)

str转bytes:  'N'.encode("utf-8")
bytes转str:  b'N'.decode("utf-8")
 
 五、更改节点
更改上文创建的 node 值,使用 set() 方法

from kazoo.client import KazooClient

zk = KazooClient(hosts='10.1.44.55')
zk.start()
# 更改节点对应的value
zk.set('/testplatform/test',b'this is not test')
# 获取某个节点对应的值
value = zk.get('/testplatform/test')
zk.stop()
print(value)
 
 六、删除节点
 删除上文创建的节点,使用 delete() 方法

from kazoo.client import KazooClient

zk = KazooClient(hosts='10.1.44.55')
zk.start()
# 删除节点对应的value
zk.delete('/testplatform/test',recursive=False)
zk.stop()

 参数 recursive:若为 False,当需要删除的节点存在子节点,会抛异常 NotEmptyError 。若为True,则删除 此节点 以及 删除该节点的所有子节点
 
七、watches 事件
zookeeper 所有读操作都有设置 watch 选项(get_children() 、get() 和 exists())。watch 是一个触发器,当检测到 zookeeper 有子节点变动 或者 节点value发生变动时触发。下面以 get() 方法为例。
from kazoo.client import KazooClient

zk = KazooClient(hosts='10.1.44.55')
zk.start()
def test(event):
    print('触发事件')

if __name__ == "__main__":
    zk.get('/testplatform/test',watch = test)
    print("第一次获取value")
    zk.set('/testplatform/test',b'hello')
    zk.get('/testplatform/test',watch = test)
    print("第一次获取value")

#输出
#第一次获取value
#触发事件
#第二次获取value

八、一键清空zookeeper
有些时候,需要将zookeeper的数据全部清空,可以使用以下代码

from kazoo.client import KazooClient
zk = KazooClient(hosts='192.168.91.128:2181') 
zk.start() 
jiedian = zk.get_children('/')  # 查看根节点有多少个子节点
print(jiedian)
for i in jiedian:
    if i != 'zookeeper':  # 判断不等于zookeeper
        print(i)
        # 删除节点
        zk.delete('/%s'%i,recursive=True)
zk.stop()
posted @ 2020-01-09 11:15  为你编程  阅读(298)  评论(0)    收藏  举报