文章目录

  • 1. 简介
  • 2. 安装
    • 2.1 JRE
    • 2.2 ZooKeeper
    • 2.3 ZooInspector
    • 2.4 Kazoo
  • 3. 建立连接
  • 4. 增删改查
    • 4.1 创建节点
    • 4.2 读
    • 4.3 更新
    • 4.4 删除节点
  • 5. 会话状态
  • 6. 监听器
    • 6.1 状态监听
    • 6.2 监听只读连接
  • 参考文献

1. 简介

Kazoo是一个Python库,旨在轻松简单地使用Zookeeper。

ZooKeeper是一款分布式协调服务中间件,是Apache Hadoop的一个子项目,用于构建健壮的分布式系统,提供一组API实现通用的协作任务,包括选举主节点、管理组内成员关系、管理元数据等。

ZooKeeper关注协同数据(元数据)。比如,网络邮箱用户对自己邮箱内容感兴趣,对哪台服务器处理请求不关心。那么邮箱内容就是应用数据,邮箱到某一台服务器之间的映射关系就是协同数据(原数据)。

ZooKeeper不适合作海量数据存储。

可用于模型替换。

2. 安装

2.1 JRE

运行ZooKeeper的机器需要安装JRE

2.2 ZooKeeper

ZooKeeper官方下载

建议下载ZooKeeper 3.4.14

  1. 解压后,新建文件夹datalog
  2. 复制粘贴conf文件夹下的zoo_sample.cfg,重命名为zoo.cfg
  3. 打开zoo.cfg,修改dataDir=C:\\zookeeper-3.4.14\\data,添加dataLogDir=C:\\zookeeper-3.4.14\\log
  4. Windows运行bin目录下的zkServer.cmd启动服务


类似这样就启动成功了

cmd下输入jps命令可以查看Java进程的PID

2.3 ZooInspector

ZooInspector为ZooKeeper的可视化工具,选装

下载地址

解压后运行build文件夹中的zookeeper-dev-ZooInspector.jar

2.4 Kazoo

pip install kazoo

3. 建立连接

运行ZooKeeper启动服务

使用kazoo需要实例化一个KazooClient对象并建立连接

from kazoo.client import KazooClientzk = KazooClient(hosts='127.0.0.1:2181') # 默认连接本地zookeeper服务,端口号为2181
zk.start()

KazooClient默认连接本地zookeeper服务,端口为2181

当ZooKeeper服务异常时,zk.start()会不断重连直到超时。

连接一旦建立,若发生间歇性连接丢失或ZooKeeper会话过期,KazooClient会不断重连。

中断连接使用stop命令

zk.stop()

只读连接

from kazoo.client import KazooClientzk = KazooClient(hosts='127.0.0.1:2181', read_only=True)
zk.start()

4. 增删改查

4.1 创建节点

ensure_path():递归创建节点路径,只能设置权限,不能添加数据。
create():创建节点,可添加数据和监听事件。需要父节点存在,不能递归创建。

from kazoo.client import KazooClientzk = KazooClient()
zk.start()zk.ensure_path("/my/favorite")  # 确保路径存在
zk.create("/my/favorite/node", b"Hello World!")  # 创建带数据的节点node

运行ZooInspector可看到已添加进一个新节点

!!!注意写上那个b!!!

4.2 读

exists():检查节点是否存在,存在则返回节点的ZnodeStat,不存在则返回None
get():获取节点数据和详细节点状态(ZnodeStat)
get_children():获取节点的所有子节点

from kazoo.client import KazooClientzk = KazooClient()
zk.start()if zk.exists("/my/favorite"):  # 检查节点是否存在data, stat = zk.get("/my/favorite/node")print("Version: %s, data: %s" % (stat.version, data.decode("utf-8")))  # 输出节点版本和数据children = zk.get_children("/my/favorite")print("There are %s children with names %s" % (len(children), children))  # 列出子节点
Version: 0, data: Hello World!
There are 1 children with names ['node']

4.3 更新

set():更新指定节点的数据

from kazoo.client import KazooClientzk = KazooClient()
zk.start()zk.set("/my/favorite", b"some data")data, stat = zk.get("/my/favorite/")
print("Version: %s, data: %s" % (stat.version, data.decode("utf-8")))
Version: 1, data: some data

4.4 删除节点

delete():删除指定节点

可选择递归删除节点及其子节点,默认不递归

from kazoo.client import KazooClientzk = KazooClient()
zk.start()zk.delete("/my/favorite", recursive=True)  # 递归删除if zk.exists("/my/favorite/node") == None:print('不存在node节点')
if zk.exists("/my/favorite") == None:print('不存在favorite节点')
if zk.exists("/my") != None:print('存在my节点')
不存在node节点
不存在favorite节点
存在my节点

5. 会话状态

Kazoo会话状态有三种:CONNECTEDSUSPENDEDLOST

  • CONNECTED:连接
  • SUSPENDED:暂停
  • LOST:丢失

刚创建KazooClient实例时,状态为LOST
一旦连接成功,状态切换为CONNECTED
发生网络闪断、服务异常等导致客户端与服务端出现断开,状态切换为SUSPENDED,此时KazooClient会不断尝试重连

有效状态转换

  • LOST→CONNECTED
    新连接,或之前丢失的重连
  • CONNECTED→SUSPENDED
    连接出现断开
  • CONNECTED→LOST
    只发生在建立连接后,提供的身份凭证无效的情况下
  • SUSPENDED→LOST
    重连会话过期
  • SUSPENDED→CONNECTED
    重连成功

6. 监听器

Kazoo可以在节点上设置监听器,在节点或子节点变化时触发。

Kazoo有两种方式设置监听器,第一种是Zookeeper默认支持的一次性监听事件,当节点被改或子节点被删时触发

from kazoo.client import KazooClientzk = KazooClient()
zk.start()zk.ensure_path("/my/favorite")  # 确保路径存在
zk.create("/my/favorite/node", b"Hello World!")  # 子节点nodedef watch_data(event):print(event)node = zk.get("/my/favorite", watch=watch_data)  # 当节点被改时,调用watch_data
children = zk.get_children("/my/favorite/", watch=watch_data)  # 当子节点被删,调用watch_data
zk.set("/my/favorite", b"some data")  # 修改节点触发
print(1)
zk.set("/my/favorite/node", b"Hi!")  # 修改子节点不触发
print(2)
zk.delete("/my/favorite/node")  # 删除子节点触发
print(3)
zk.delete("/my/favorite")  # 删除节点不触发
print(4)
WatchedEvent(type='CHANGED', state='CONNECTED', path='/my/favorite')
1
2
WatchedEvent(type='CHILD', state='CONNECTED', path='/my/favorite')
3
4

★第二种设置监听器的方式是利用Python修饰器,监听数据和子节点的修改

  • ChildrenWatch:子节点变化时触发
  • DataWatch:节点数据变化时触发
from kazoo.client import KazooClientzk = KazooClient()
zk.start()zk.ensure_path("/my/favorite")  # 确保路径存在@zk.ChildrenWatch("/my/favorite")
def watch_children(children):"""监听子节点"""print("Children are now: %s" % children)@zk.DataWatch("/my/favorite")
def watch_node(data, stat, event=None):"""监听节点数据"""if event==None:print("Version: %s, data: %s" % (stat.version, data.decode("utf-8")))else:print(event)print(0)
zk.create("/my/favorite/node")  # 创建子节点,触发ChildrenWatch和DataWatch
print(1)
zk.set("/my/favorite/node", b"Hello World!")  # 修改子节点,触发ChildrenWatch
print(2)
zk.delete("/my/favorite/node")  # 删除子节点,触发ChildrenWatch
print(3)
zk.set("/my/favorite", b"some data")  # 修改节点,触发DataWatch
print(4)
zk.delete("/my/favorite")  # 删除节点,触发DataWatch
print(5)
Children are now: []
Version: 0, data:
0
1
Children are now: ['node']
2
3
Children are now: []
4
WatchedEvent(type='CHANGED', state='CONNECTED', path='/my/favorite')
5
WatchedEvent(type='DELETED', state='CONNECTED', path='/my/favorite')

6.1 状态监听

from kazoo.client import KazooStatedef my_listener(state):if state == KazooState.LOST:# 会话丢失print("LOST")elif state == KazooState.SUSPENDED:# 会话断开print("SUSPENDED")else:# 会话连接print("CONNECTED")zk.add_listener(my_listener)

使用kazoo.recipe.lock.Lock和创建临时节点时,建议添加状态监听来处理连接中断和会话丢失

6.2 监听只读连接

from kazoo.client import KazooState
from kazoo.client import KeeperState@zk.add_listener
def watch_for_ro(state):if state == KazooState.CONNECTED:if zk.client_state == KeeperState.CONNECTED_RO:print("Read only mode!")else:print("Read/Write mode!")

参考文献

  1. ZooKeeper:分布式过程协同技术详解(强烈建议读一读,对理解和使用大有裨益)
  2. ZooKeeper的安装与部署
  3. kazoo使用教程
  4. kazoo文档
  5. Zookeeper接口kazoo实例解析

Python——ZooKeeper库Kazoo入门相关推荐

  1. python做数据处理软件_程序员用于机器学习编程的Python 数据处理库 pandas 入门教程...

    入门介绍 pandas适合于许多不同类型的数据,包括: · 具有异构类型列的表格数据,例如SQL表格或Excel数据 · 有序和无序(不一定是固定频率)时间序列数据. · 具有行列标签的任意矩阵数据( ...

  2. nodejs 图片处理模块 rotate_学会Pillow再也不用PS啦——Python图像处理库Pillow入门!...

    你在用什么软件进行图像处理呢?厌倦了鼠标和手指的拖拖点点,想不想用程序和代码进行图像的高效处理,Python作为简单高效又很强大的一门编程语言,对于图像的处理自然也是轻松拿下,听起来是不是很酷很极客, ...

  3. Python GUI库 Tkinter入门资料 -- 高级应用

    3. 高级用法 通过基础篇的学习,相信大家已经掌握了简单的tkinter编程,但如果想做出真正实用的程序,还需要学习一些高级用法,一些更复杂的控件. 3.1 高级控件学习 控件类 名称 简要说明 La ...

  4. python开源库dlib入门,并进行人脸检测,看看周杰伦和东尼大木到底有多相似?看完本文再不要说,周和东像。。

    重点关注:强调一下,这里没有任何侮辱周董的意思,我也是一名Jay迷.只是为了学习,大家见谅..源代码戳这里 开启dlib库的学习 第一步:首先得安装dlib库,这里建议直接下载dlib,不然用pip直 ...

  5. python unittest库的入门学习

    unittest的基本概念 创建测试用例类 unittest的使用示例 一.基本概念 Testcase是所有测试用例的基类 TestSuite是创建一个测试"容器",可以往里面加c ...

  6. python使用教程pandas-Python 数据处理库 pandas 入门教程基本操作

    pandas是一个Python语言的软件包,在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础编程库.本文是对它的一个入门教程. pandas提供了快速,灵活和富有表现力的数据结 ...

  7. 3分钟入门python_3分钟学完Python,直接从入门到精通「史上最强干货库」

    作为帅气小编,我已经把python一些模块的甩在这儿了qwq,只要你拿到这些干货,包你玩转python,直接冲向"大佬"的段位,如果已经学了C或者C++或者说如果你需要你的一段关键 ...

  8. python自然语言处理案例-Python自然语言处理 NLTK 库用法入门教程【经典】

    本文实例讲述了Python自然语言处理 NLTK 库用法.分享给大家供大家参考,具体如下: 在这篇文章中,我们将基于 Python 讨论自然语言处理(NLP).本教程将会使用 Python NLTK ...

  9. Python第三方库matplotlib(2D绘图库)入门与进阶

    文章目录 @[toc] Matplotlib 一 简介: 二 相关文档: 三 入门与进阶案例 1- 简单图形绘制 2- figure的简单使用 3- 设置坐标轴 4- 设置legend图例 5- 添加 ...

最新文章

  1. html5移动端根据百度地图api获取详细地址
  2. 逃离无声的世界,跟AI一起听叶落的声音
  3. hdu 5311 Hidden String(find,substr)
  4. keepalived(2)——配置文件
  5. 一个整数按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来。(递归)
  6. 哨兵模式原理_Redis哨兵、复制、集群的设计原理,以及区别
  7. 【数字图像处理】一种求图像边缘的方法
  8. graphpad prism8教程柱状图_Graphpad Prism 8作图教程(4):散点图
  9. c语言程序图片截取,C++实现屏幕截图功能
  10. ios 关于itunes安装ipa包的方法,一步解决
  11. android手机免费无线投屏电脑方法教程步骤AirServer7
  12. 001 MATLAB-plotyy-函数详解
  13. 360插件化方案RePlugin学习笔记-外置插件
  14. 跨平台应用开发进阶(七) :uni-app 自定义 showToast
  15. eclipse 设置全部的背景颜色
  16. 天作之合:水果与朗姆酒
  17. linux C -- ftok函数
  18. 京剧《断密涧》中李密和王伯当的唱段
  19. 【luogu P2455 [SDOI2006]线性方程组】 题解
  20. 基于JavaWeb JavaScript的根据时间段的不同,在网页中显示不同的问候语

热门文章

  1. 字节跳动(抖音)软件测试面经完整版、建议收藏【偷偷录的】
  2. vue2.0使用ttf字体不生效
  3. .data.max和torch.max的笔记
  4. Golang实现进制转换计算器
  5. 基于java web的在线电影网_视频点播系统
  6. tomcat7.0.81 linux,Linux/CentOS7.0下安装配置Tomcat8.0
  7. manjaro配置arch源_manjaro 切换国内源及软件安装
  8. 埃隆·马斯克:Facebook Sucks
  9. Win10文件夹右键卡死
  10. CANIOT系列车联网透传云网关给EPEC控制器远程升级解决特种车升级难点 云端监控,远程调试和程序上下载