Python 使用 Kazoo 操作 ZooKeeper 完整指南
本文详细介绍如何在 Python 中使用 Kazoo 库连接 ZooKeeper。内容涵盖安装、建立连接、创建(含临时与序列节点)、读取、更新及删除节点的具体代码示例,并解析关键参数如 ephemeral 和 sequence。此外,还讲解了如何利用 get 方法设置 watch 监听节点变化,帮助开发者快速掌握 ZooKeeper 的基础 API 使用。
ZooKeeper 简介
ZooKeeper 是一款开源的分布式协调服务框架,其设计灵感源自 Google 的 Chubby 系统,已成为 Hadoop 和 HBase 等大数据生态系统的核心组件。它主要为分布式应用提供高可用的协调服务,功能涵盖配置管理、命名服务、分布式锁同步以及群组管理等。虽然 ZooKeeper 支持多种开发语言,但部分高级功能仅对 Java 和 C 语言原生支持。在 Python 生态中,开发者可以通过 kazoo 库来调用 ZooKeeper 的相关接口。
一、安装
安装过程十分简便,只需通过 pip 命令即可获取库文件。
pip3 install kazoo
二、连接 ZooKeeper
使用 KazooClient 类即可建立与 ZooKeeper 集群的连接。该客户端支持指定多个主机地址以增强可用性,默认连接端口为 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,则创建临时节点,当客户端会话断开时,该节点会被 ZooKeeper 自动删除;默认值为 False。
- sequence:布尔值。若设为 True,ZooKeeper 会在节点路径末尾自动追加一个 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')
# 获取某个节点对应的值
value = zk.get('/testplatform/mssql')
# 操作完后,别忘了关闭zk连接
zk.stop()
print(node,value)
五、更改节点
若要修改之前创建的节点数据,可以使用 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 的所有读操作(包括 get_children()、get() 和 exists())均支持设置 watch 机制。Watch 是一种触发器,用于监听 ZooKeeper 中子节点的变化或节点数据的变更。以下以 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
如需了解更多高阶用法,建议参考 kazoo 官方文档:https://kazoo.readthedocs.io/en/latest/api/client.html
以上就是 Python 操作 ZooKeeper 的核心内容,更多相关技术资料请关注本站后续文章。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









