【python使用kazoo连ZooKeeper基础使用】

python 复制代码
from kazoo.client import KazooClient, KazooState
from kazoo.exceptions import NoNodeError,NodeExistsError,NotEmptyError
import json

# 创建 KazooClient 实例,连接到 ZooKeeper 服务器
zk = KazooClient(hosts='127.0.0.1:2181')
zk.start()

# 定义节点路径
path = "/main_node/sub_node"

# 确保父路径存在
def ensure_path_exists(zk, path):
    parts = path.strip('/').split('/')
    for i in range(1, len(parts)):
        current_path = '/'.join(parts[:i])
        try:
            zk.get(current_path)
        except NoNodeError:
            # 创建父节点
            zk.create(current_path, b"")



def create_node(zk, path, data):
    """
    创建一个 ZooKeeper 节点。

    :param zk: KazooClient 实例
    :param path: 节点路径
    :param data: 节点数据
    """
    try:
        # 如果节点已存在,则抛出 NodeExistsError 异常
        ensure_path_exists(zk, path)
        zk.create(path, data)
        print(f"Node {path} created successfully with data: {data.decode('utf-8')}")
    except NodeExistsError:
        print(f"Node {path} already exists.")

def update_node(zk, path, data):
    """
    更新一个 ZooKeeper 节点的数据。

    :param zk: KazooClient 实例
    :param path: 节点路径
    :param data: 新的节点数据
    """
    try:
        # 更新节点数据
        zk.set(path, data)
        print(f"Node {path} updated successfully with new data: {data.decode('utf-8')}")
    except NoNodeError:
        print(f"Node {path} does not exist. Cannot update non-existing node.")

def delete_node(zk, path, recursive=False):
    """
    删除一个 ZooKeeper 节点。

    :param zk: KazooClient 实例
    :param path: 节点路径
    :param recursive: 是否递归删除节点及其所有子节点
    """
    try:
        # 删除节点,recursive=True表示递归删除
        zk.delete(path, recursive=recursive)
        print(f"Node {path} deleted successfully")
    except NoNodeError:
        print(f"Node {path} does not exist.")
    except NotEmptyError:
        print(f"Node {path} is not empty. Use recursive=True to delete it and its children.")
    except Exception as e:
        print(f"An error occurred: {e}")

def read_node(zk, path):
    """
    读取一个 ZooKeeper 节点的数据。

    :param zk: KazooClient 实例
    :param path: 节点路径
    """
    try:
        data, stat = zk.get(path)
        print(f"Node {path} data: {data.decode('utf-8')}")
        return data.decode('utf-8'), stat
    except NoNodeError:
        print(f"Node {path} does not exist.")
        return None, None

def write_json_to_node(zk, path, data):
    """
    将 JSON 数据写入 ZooKeeper 节点。

    :param zk: KazooClient 实例
    :param path: 节点路径
    :param data: 要写入的字典或对象
    """
    try:
        # 将数据对象序列化为 JSON 字符串
        json_data = json.dumps(data)
        
        # 检查节点是否存在,如果不存在则创建节点
        if not zk.exists(path):
            zk.create(path, json_data.encode('utf-8'))
            print(f"Node {path} created and JSON data written.")
        else:
            # 节点存在,更新节点数据
            zk.set(path, json_data.encode('utf-8'))
            print(f"JSON data written to node {path}")
    except TypeError:
        print("Provided data is not serializable to JSON.")
    except NodeExistsError:
        print(f"Node {path} already exists, but was expected to be created.")

def read_json_from_node(zk, path):
    """
    从 ZooKeeper 节点读取 JSON 数据。

    :param zk: KazooClient 实例
    :param path: 节点路径
    :return: 反序列化后的 JSON 数据对象
    """
    try:
        # 读取节点数据
        data, stat = zk.get(path)
        # 反序列化 JSON 数据
        json_data = json.loads(data.decode('utf-8'))
        print(f"JSON data read from node {path}: {json_data}")
        return json_data
    except NoNodeError:
        print(f"Node {path} does not exist.")
        return None
    except json.JSONDecodeError:
        print("Failed to decode JSON from node data.")
        return None
相关推荐
wj3055853788 小时前
课程 9:模型测试记录与 Prompt 策略
linux·人工智能·python·comfyui
为何创造硅基生物8 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
吃好睡好便好8 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
星寂樱易李8 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
仰泳之鹅8 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
qingfeng154158 小时前
企业微信机器人开发:如何实现自动化与智能运营?
人工智能·python·机器人·自动化·企业微信
之歆9 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
cen__y10 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
AI人工智能+电脑小能手10 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm