kazoo--zookeeper的python驱动

本文详细介绍了Kazoo——一个用于Zookeeper的Python驱动,包括核心类的功能,如连接管理、监听事件、会话保持、watcher机制、事务处理和chroot功能。KazooClient类提供了丰富的接口,支持创建、删除节点,监听节点变化等,同时也支持连接状态的监听和管理,确保在会话期间能维持连接。此外,还介绍了如何通过chroot改变连接的根节点,实现不同应用之间的隔离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     

核心类讲解
kazoo.client.KazooClient(hosts='127.0.0.1:2181', 
                         timeout=10.0, 
                         client_id=None, 
                         handler=None, 
                         default_acl=None, 
                         auth_data=None, 
                         read_only=None, 
                         randomize_hosts=True, 
                         connection_retry=None, 
                         command_retry=None, 
                         logger=None, 
                         **kwargs)          

该类是kazoo模块的最主要的一个类,用于连接zookeeper服务器,参数:

  • `hosts`:指定ZooKeeper的ip和端口,可以是以逗号分隔的多个ZooKeeper服务器IP和端口,客户端会随机选择一个来连接。
  • `timeout`:会话超时时间,在连接断开后就开始计算,如果在此会话时间内重新连接上的话,该连接创建的临时节点就不会移除。默认会话超时最小是2倍的tickTime(在zk服务器配置文件中设置),最大是20倍的tickTime。会话过期由ZooKeeper集群,而不是客户端来管理。客户端与集群建立会话时提供该超时值,集群使用这个值来确定客户端会话何时过期,集群在指定的超时时间内没有得到客户端的消息时发生会话过期,会话过期时集群将删除会话的所有临时节点,立即通知所有(观察节点)客户端。
  • `client_id`:传递一个双元素数组:[会话id, 密码]。客户端取得ZooKeeper服务句柄时,ZooKeeper创建一个会话,由一个64位数标识,这个数将返回给客户端。如果连接到其他服务器,客户端将在连接握手时发送会话ID。出于安全考虑,服务器会为会话ID创建一个密码,ZooKeeper服务器可以校验这个密码。这个密码将在创建会话时与会话ID一同发送给客户端。与新的服务器重新建立会话的时候,客户端会和会话ID一同发送这个密码。
  • `read_only`:创建一个只读的连接。
  • `randomize_hosts`:随机选择zk服务器连接。

类实例属性及方法:

zk.start(timeout=15)
初始化到zookeeper服务器的连接,超过timeout时间没连接到zk服务器则会产生timeout_exception异常

In [1]: from kazoo.client import KazooClient
In [2]: zk = KazooClient(hosts="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183")
In [3]: zk.start()       #到这一步没生成异常就说明正常连接到zk服务器了

zk.stop()
一旦连接上,客户端会尽力保持连接,不管间歇性的连接丢失。如果要主动丢弃连接,就使用该方法,该方法会断开连接和关闭该连接的session,此时该连接创建的所有临时节点都会立即移除,并触发这些临时节点的DataWatch和这些临时节点的父节点的ChildrenWatch

zk.restart() 
重启连接会话

zk.state 
当前连接状态,值为如下三个之一:LOST、CONNECTED、SUSPENDED。当实例化一个KazooClient连接时处于LOST状态;然后使用start()真正建立连接后处于CONNECTED状态;如果此时连接出现问题或客户端切换到另一台zk服务器,此时将处于SUSPENDED状态;在会话有效期内重新连接上又变回CONNECTED状态,如果重连上但是会话过期,则变为LOST状态。

In [57]: zk1 = KazooClient(hosts="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183")
In [58]: zk1.state
Out[58]: 'LOST'
In [59]: zk1.start()
In [60]: zk1.state
Out[60]: 'CONNECTED'
In [62]: zk1.stop()
In [63]: zk1.state
Out[63]: 'LOST'
In [64]: zk1.close()
In [65]: zk1.state
Out[65]: 'LOST'

zk.connected 
客户端是否已连接到zk服务器,已连接上返回True

zk.add_listener(listener) 
添加一个函数对象作为回调函数,当连接状态改变时,就会自动调用该回调函数,具体看后面的“监听连接事件”。

zk.remove_listener(listener) 
移除一个listener

zk.state_listeners 
listener状态

zk.create(path, value=’’, acl=None, ephemeral=False, sequence=False, makepath=False) 
创建一个节点,ephemeral表示改节点是临时节点,sequence表示该节点为顺序节点,默认当节点的父节点或祖先节点不存在时,创建该节点会失败,可以使用makepath设置为True来自动创建缺少的祖先节点。
zk节点(znode)可以分为如下四类:

  • `PERSISTENT`:持续的,相比于EPHEMERAL,不会随着client session的close/expire而消失
  • `PERSISTENT_SEQUENTIAL`:顺序的,会自动在节点名后面添加一个自增计数,格式为%010d
  • `EPHEMERAL`:临时节点,生命周期依赖于client session,对应session close/expire后其znode也会消失,临时节点不能有子节点
  • `EPHEMERAL_SEQUENTIAL`

该方法可能触发如下异常:

  • `NodeExistsError`:当要创建的节点已经存在时
  • `NoNodeError`:当makepath为False且祖先节点不存在时
  • `NoChildrenForEphemeralsError`:父节点为临时节点,在一个临时节点下面创建子节点会报该异常
  • `ZookeeperError`:节点值太大,zk默认节点值限制为1M
  • `ZookeeperError`:服务器返回一个非0状态码

zk.get_children(path, watch=None, include_data=False)
获取指定节点的所有子节点,以列表返回。如果include_data为True,则还会返回该节点的ZnodeStat状态

zk.get(path, watch=None) 
获取指定节点的值,节点不存在触发NoNodeError异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值