Python-ZK/Kazoo 基础使用指南:连接管理与Zookeeper操作
概述
Python-ZK/Kazoo 是一个Python语言的Zookeeper客户端库,提供了对分布式协调服务Zookeeper的完整访问能力。本文将详细介绍Kazoo库的基本使用方法,包括连接管理、节点操作、监听机制等核心功能。
连接管理
建立连接
使用Kazoo的第一步是创建KazooClient对象并建立连接:
from kazoo.client import KazooClient
zk = KazooClient(hosts='127.0.0.1:2181')
zk.start()
默认情况下,客户端会尝试连接本地Zookeeper服务器的默认端口2181。如果Zookeeper服务未运行,start()方法会一直等待直到超时。
关闭连接
当不再需要连接时,应当显式关闭:
zk.stop()
日志配置
为避免"No handlers could be found for logger"警告,至少应配置基础日志:
import logging
logging.basicConfig()
连接状态管理
状态监听
Kazoo使用状态系统来管理连接状态变化,可以注册监听器来响应这些变化:
from kazoo.client import KazooState
def my_listener(state):
if state == KazooState.LOST:
print("会话已丢失")
elif state == KazooState.SUSPENDED:
print("连接已断开")
else:
print("已连接/重连")
zk.add_listener(my_listener)
状态类型
KazooClient有三种主要状态:
- LOST:初始状态或会话过期
- CONNECTED:连接成功
- SUSPENDED:连接临时中断
状态转换规则:
- LOST → CONNECTED:新连接或丢失后重连
- CONNECTED → SUSPENDED:服务器连接丢失
- CONNECTED → LOST:认证失败
- SUSPENDED → LOST:会话过期
- SUSPENDED → CONNECTED:连接恢复
只读模式
Zookeeper 3.4+支持只读模式,需在服务器端启用:
zk = KazooClient(hosts='127.0.0.1:2181', read_only=True)
zk.start()
可通过检查KeeperState判断当前是否为只读模式:
@zk.add_listener
def watch_for_ro(state):
if state == KazooState.CONNECTED:
if zk.client_state == KeeperState.CONNECTED_RO:
print("只读模式")
else:
print("读写模式")
注意:只读模式下不能使用任何recipe功能。
Zookeeper节点操作
创建节点
Kazoo提供两种创建节点的方式:
ensure_path():递归创建路径,不设置数据create():创建节点并设置数据
zk.ensure_path("/my/favorite") # 确保路径存在
zk.create("/my/favorite/node", b"a value") # 创建节点并设置数据
读取数据
主要读取方法:
exists():检查节点是否存在get():获取节点数据和元信息get_children():获取子节点列表
if zk.exists("/my/favorite"):
data, stat = zk.get("/my/favorite")
print(f"版本: {stat.version}, 数据: {data.decode('utf-8')}")
children = zk.get_children("/my/favorite")
print(f"子节点: {children}")
更新数据
使用set()方法更新节点数据:
zk.set("/my/favorite", b"new data")
删除节点
使用delete()方法删除节点,支持递归删除:
zk.delete("/my/favorite/node", recursive=True)
命令重试机制
网络问题可能导致命令失败,Kazoo提供自动重试功能:
result = zk.retry(zk.get, "/path/to/node")
也可以自定义重试策略:
from kazoo.retry import KazooRetry
kr = KazooRetry(max_tries=3, ignore_expire=False)
result = kr(client.get, "/some/path")
监听机制
一次性监听
Zookeeper原生支持的一次性监听:
def my_func(event):
print("节点变化:", event)
children = zk.get_children("/my/node", watch=my_func)
高级监听
Kazoo提供的高级监听API更易用:
@zk.ChildrenWatch("/my/node")
def watch_children(children):
print("当前子节点:", children)
@zk.DataWatch("/my/node")
def watch_node(data, stat):
print(f"数据: {data}, 版本: {stat.version}")
事务支持
Zookeeper 3.4+支持事务操作:
transaction = zk.transaction()
transaction.check('/node/a', version=3) # 检查版本
transaction.create('/node/b', b"value") # 创建节点
results = transaction.commit() # 提交事务
事务中的所有操作要么全部成功,要么全部失败。check命令是事务特有的,用于验证节点版本。
总结
本文详细介绍了Python-ZK/Kazoo库的基本使用方法,包括连接管理、节点CRUD操作、监听机制和事务支持等核心功能。掌握这些基础知识后,开发者可以基于Kazoo构建可靠的分布式应用。在实际开发中,还应当结合Kazoo提供的各种分布式协调原语(recipes)来简化开发工作。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



