• 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

  • 相关阅读:
    NOI2015刷题记录
    [WC2013][UOJ58]糖果公园 莫队算法
    啦啦啦~
    完全平方数
    构建之法
    测试更新
    程序的测试
    程序的封装
    构建之法5.5-6-7章观后感
    给徐侃童鞋的一个汉堡
  • 原文地址:https://www.cnblogs.com/well-666/p/12752630.html
Copyright © 2020-2023  润新知