zoukankan      html  css  js  c++  java
  • python 操作zookeeper详解

    ZooKeeper 简介

      ZooKeeper 是一个分布式的、开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 Hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper 支持大部分开发语言,除了某些特定的功能只支持 Java 和 C。python 通过 kazoo 可以实现操作 ZooKeeper 。

     

    一、安装

     这个简单,使用 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')
    # 获取某个节点对应的值
    value = zk.get('/testplatform/mssql')
    # 操作完后,别忘了关闭zk连接
    zk.stop()
    print(node,value)

     五、更改节点

     更改上文创建的 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

    需要更多高阶使用的同学,请参考 kazoo 官方文档:https://kazoo.readthedocs.io/en/latest/api/client.html

  • 相关阅读:
    2021NUAA暑假集训 Day3 题解
    2021NUAA暑假集训 Day2 题解
    2021NUAA暑期模拟赛部分题解
    CodeForces 1038D Slime
    UVA 11149 Power of Matrix
    UVA 10655 Contemplation! Algebra
    UVA 10689 Yet another Number Sequence
    HDU 4549 M斐波那契数列
    HDU 4990 Reading comprehension
    CodeForces 450B Jzzhu and Sequences
  • 原文地址:https://www.cnblogs.com/shenh/p/11891878.html
Copyright © 2011-2022 走看看