kazoo

kazoo 是一个更优雅的 Zookeeper 库,用法更简单,也不容易出错。

安装

开始使用 kazoo 之前,你需要先装好它。推荐从 PYPI 安装:

  1. $ pip install kazoo

连接处理

建立连接

开始操作 Zookeeper 之前,需要先创建 KazooClient 对象并与 Zookeeper 建立连接:

  1. from kazoo.client import KazooClient
  2.  
  3. zk = KazooClient(hosts='127.0.0.1:2181')
  4. zk.start()

默认,客户端通过本地端口( 2181 )连接 Zookeeper 服务器。这种情况下,需要先确保 Zookeeper 已在本地运行,否则 start 方法将一直等待直到超时。

一旦成功连接,客户端会尝试保持连接状态,自动处理 间歇性连接中断 以及 会话过期 等问题。如果需要放弃当前连接,需要调用 stop 方法:

  1. zk.stop()

鉴权

如果 Zookeeper 设置了用户密码,则需要额外指定:

  1. zk = KazooClient(
  2. hosts='127.0.0.1:2181',
  3. auto_data=[
  4. ('digest', 'user:password'),
  5. ],
  6. )

监听连接事件

掌握连接状态非常重要,用户需要知晓 连接中断重连 以及 会话过期 等事件。为了简化处理逻辑, kazoo 将其抽象成一个状态系统。用户可以在上面注册监听函数,监听函数在连接状态发生变化时得到调用。

  1. from kazoo.client import KazooState
  2.  
  3. def my_listener(state):
  4. if state == KazooState.LOST:
  5. # 连接丢失
  6. elif state == KazooState.SUSPENDED:
  7. # 连接断开
  8. else:
  9. # 连接建立或重连
  10.  
  11. zk.add_listener(my_listener)

在使用 kazoo.recipe.lock.Lock 或者创建临时节点等场景,强烈建议添加状态监听函数,以便程序在连接中断或者会话丢失时可以正确应对。

理解连接状态

日志设置

如果应用代码未设置 logging ,则可能出现以下错误信息:

  1. No handlers could be found for logger "kazoo.client"

为了避免这个问题,你可以添加以下两行代码:

  1. import logging
  2. logging.basicConfig()

增删改查

读取数据

相关方法:

  • exists() ,检查路径节点是否存在;
  • get() ,读取节点数据以及节点详情信息( ZnodeStat 对象);
  • get_children() ,获取指定节点下所有子节点;

判断路径节点是否存在:

  1. if zk.exists('/path/to/given/node'):
  2. # do something

读取节点数据以及版本:

  1. data, stat = zk.get('/path/to/given/node')
  2. print('Version:', stat.version)
  3. print('Data:', data.decode('utf-8'))

列举子节点:

  1. children = zk.get_children('/path/to/given/node')
  2. for child in children:
  3. print('Child:', child)

下一步

订阅更新,获取更多学习资料,请关注我们的 微信公众号

../_images/wechat-mp-qrcode.png小菜学编程

参考文献