Python-ZK/Kazoo 基础使用指南:连接管理与Zookeeper操作

Python-ZK/Kazoo 基础使用指南:连接管理与Zookeeper操作

【免费下载链接】kazoo Kazoo is a high-level Python library that makes it easier to use Apache Zookeeper. 【免费下载链接】kazoo 项目地址: https://gitcode.com/gh_mirrors/kaz/kazoo

概述

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有三种主要状态:

  1. LOST:初始状态或会话过期
  2. CONNECTED:连接成功
  3. 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提供两种创建节点的方式:

  1. ensure_path():递归创建路径,不设置数据
  2. 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)来简化开发工作。

【免费下载链接】kazoo Kazoo is a high-level Python library that makes it easier to use Apache Zookeeper. 【免费下载链接】kazoo 项目地址: https://gitcode.com/gh_mirrors/kaz/kazoo

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值