python-API开发zk客户端
前面于超老师讲完了,zk运维的基本命令行玩法,更多的还是开发需要通过代码和zk结合处理。
大多数场景是java后端去操作。
这里我们以运维更友好的python来学习。
1.kazoo模块
zookeeper是一个用于维护配置信息、命名、提供分布式同步和提供组服务。它自身是高可用的,只要宕机节点不达到半数,zookeeper服务都不会离线。zookeeper为实现分布式锁,分布式栅栏,分布式队列,安全的配置存储交换,在线状态监控,选举提供了坚实的基础。
在hadoop环境中,zookeeper被广泛应用。hadoop 高可用是依赖zookeeper的实现的。Hbase,storm,kafka都强依赖zookeeper,没有zookeeper根本都运行不起来。阿里的微服务治理框架dubbo也是依赖zookeeper的。
python访问zookeeper使用的的模块是kazoo。
模块文档
https://kazoo.readthedocs.io/en/latest/api/client.html
完成功能
1. 会话连接、恢复
2. 节点增删改查
3. watch、acl操作
kazoo获取zk服务端信息
1. 模块安装
pip3 install kazoo
# 于超老师这里的版本
kazoo==2.6.0
zookeeper==version--- (3, 5, 6)
2.链接zk
# -*- coding: UTF-8 -*-
'''
www.yuchaoit.cn with python ,zookeeper
'''
import sys
from kazoo.client import KazooClient, KazooState
import logging
logging.basicConfig(
level=logging.DEBUG
, stream=sys.stdout
, format='query ok---%(asctime)s %(pathname)s %(funcName)s%(lineno)d %(levelname)s: %(message)s')
# 创建一个客户端,可以指定多台zookeeper,
zk = KazooClient(
# hosts='10.0.0.18:2181'
hosts='10.0.0.18:2181,10.0.0.19:2181,10.0.0.20:2181'
, timeout=10.0 # 连接超时时间
,logger=logging # 传一个日志对象进行,方便 输出debug日志
)
# 开始心跳
zk.start()
# 获取子节点
znodes = zk.get_children('/')
print(znodes)
# 开始心跳
zk.start()
# 获取根节点数据和状态
data,stat=zk.get('/')
print('data---',data)
print('stat---',stat)
============
# 输出结果
data--- b''
stat--- ZnodeStat(czxid=0, mzxid=0, ctime=0, mtime=0, version=0, cversion=7, aversion=0, ephemeralOwner=0, dataLength=0, numChildren=3, pzxid=30064771073)
'''
这个是stat的输出:
ZnodeStat(czxid=0, mzxid=0, ctime=0, mtime=0, version=0, cversion=8448, aversion=0, ephemeralOwner=0, dataLength=0, numChildren=4, pzxid=30064771073)
ZnodeState的属性列表:
czxid : 创建这个节点时的zxid
mzxid : 修改这个节点时的zxid
ctime : 创建时间
mtime : 修改时间
version : 数据被修改的次数
cversion: 子节点被修改的次数
aversion: acl被改变的次数
ephemeralOwner:临时节点创建的用户,如果不是临时节点值为0
dataLength:节点数据长度
numChildren:子节点的数量
pzxid:子节点被修改的zxid
'''
#获取根节点的所有子节点,返回的是一个列表,只有子节点的名称
children = zk.get_children("/");
print(children)
#下面是根节点的返回值
#执行stop后所有的临时节点都将失效
zk.stop()
zk.close()
增删改查
增、查
# -*- coding: UTF-8 -*-
'''
www.yuchaoit.cn with python ,zookeeper
'''
import sys
from kazoo.client import KazooClient, KazooState
import logging
logging.basicConfig(
level=logging.DEBUG
, stream=sys.stdout
, format='query ok---%(asctime)s %(pathname)s %(funcName)s%(lineno)d %(levelname)s: %(message)s')
# 创建一个客户端,可以指定多台zookeeper,
zk = KazooClient(
# hosts='10.0.0.18:2181'
hosts='10.0.0.18:2181,10.0.0.19:2181,10.0.0.20:2181'
, timeout=10.0 # 连接超时时间
,logger=logging # 传一个日志对象进行,方便 输出debug日志
)
# 开始心跳
zk.start()
# 创建节点
# zk.create('/kazoo/yu1',b'good linux ,www.yuchaoit.cn',makepath=True) # 创建节点:makepath 设置为 True ,父节点不存在则创建,其他参数不填均为默认
znodes=zk.get_children('/kazoo')
print(znodes)
data=zk.get('/kazoo/yu1')
print(data)
#执行stop后所有的临时节点都将失效
zk.stop()
zk.close()
修改节点
# -*- coding: UTF-8 -*-
'''
www.yuchaoit.cn with python ,zookeeper
'''
import sys
from kazoo.client import KazooClient, KazooState
import logging
logging.basicConfig(
level=logging.DEBUG
, stream=sys.stdout
, format='query ok---%(asctime)s %(pathname)s %(funcName)s%(lineno)d %(levelname)s: %(message)s')
# 创建一个客户端,可以指定多台zookeeper,
zk = KazooClient(
# hosts='10.0.0.18:2181'
hosts='10.0.0.18:2181,10.0.0.19:2181,10.0.0.20:2181'
, timeout=10.0 # 连接超时时间
,logger=logging # 传一个日志对象进行,方便 输出debug日志
)
# 开始心跳
zk.start()
# 创建节点
# zk.create('/kazoo/yu1',b'good linux ,www.yuchaoit.cn',makepath=True) # 创建节点:makepath 设置为 True ,父节点不存在则创建,其他参数不填均为默认
# znodes=zk.get_children('/kazoo')
# print(znodes)
# data=zk.get('/kazoo/yu1')
# print(data)
zk.set('/kazoo/yu1',b'not bad linux,www.yuchaoit.cn')
data,stat=zk.get('/kazoo/yu1')
print('节点数据提取:',data)
#执行stop后所有的临时节点都将失效
zk.stop()
zk.close()
删除
# -*- coding: UTF-8 -*-
'''
www.yuchaoit.cn with python ,zookeeper
'''
import sys
from kazoo.client import KazooClient, KazooState
import logging
logging.basicConfig(
level=logging.DEBUG
, stream=sys.stdout
, format='query ok---%(asctime)s %(pathname)s %(funcName)s%(lineno)d %(levelname)s: %(message)s')
# 创建一个客户端,可以指定多台zookeeper,
zk = KazooClient(
# hosts='10.0.0.18:2181'
hosts='10.0.0.18:2181,10.0.0.19:2181,10.0.0.20:2181'
, timeout=10.0 # 连接超时时间
,logger=logging # 传一个日志对象进行,方便 输出debug日志
)
# 开始心跳
zk.start()
# 创建节点
# zk.create('/kazoo/yu1',b'good linux ,www.yuchaoit.cn',makepath=True) # 创建节点:makepath 设置为 True ,父节点不存在则创建,其他参数不填均为默认
# znodes=zk.get_children('/kazoo')
# print(znodes)
# data=zk.get('/kazoo/yu1')
# print(data)
# zk.set('/kazoo/yu1',b'not bad linux,www.yuchaoit.cn')
# data,stat=zk.get('/kazoo/yu1')
# print('节点数据提取:',data)
# 删除节点
# 不删除父节点
zk.delete('/kazoo/yu1',recursive=False)
#执行stop后所有的临时节点都将失效
zk.stop()
zk.close()
watchers事件
# -*- coding: UTF-8 -*-
'''
www.yuchaoit.cn with python ,zookeeper
'''
import sys
from kazoo.client import KazooClient, KazooState
import logging
logging.basicConfig(
level=logging.DEBUG
, stream=sys.stdout
, format='query ok---%(asctime)s %(pathname)s %(funcName)s%(lineno)d %(levelname)s: %(message)s')
# 创建一个客户端,可以指定多台zookeeper,
zk = KazooClient(
# hosts='10.0.0.18:2181'
hosts='10.0.0.18:2181,10.0.0.19:2181,10.0.0.20:2181'
, timeout=10.0 # 连接超时时间
,logger=logging # 传一个日志对象进行,方便 输出debug日志
)
# 开始心跳
zk.start()
# 创建节点
# zk.create('/kazoo/yu1',b'good linux ,www.yuchaoit.cn',makepath=True) # 创建节点:makepath 设置为 True ,父节点不存在则创建,其他参数不填均为默认
# znodes=zk.get_children('/kazoo')
# print(znodes)
# data=zk.get('/kazoo/yu1')
# print(data)
# zk.set('/kazoo/yu1',b'not bad linux,www.yuchaoit.cn')
# data,stat=zk.get('/kazoo/yu1')
# print('节点数据提取:',data)
# # 删除节点
# # 不删除父节点
# # 参数 recursive:若为 False,当需要删除的节点存在子节点,会抛异常 NotEmptyError 。若为True,则删除 此节点 以及 删除该节点的所有子节点
# zk.delete('/kazoo/yu1',recursive=False)
# 监控器
def t1(event):
print('以触发')
zk.get('/kazoo',watch=t1)
print('第一次获取value')
zk.set('/kazoo',b'www.yuchaoit.cn')
zk.get('/kazoo',watch=t1)
print('第二次获取value')
#执行stop后所有的临时节点都将失效
zk.stop()
zk.close()
'''
输出
第一次获取value
以触发
第二次获取value
'''
遍历所有子节点
import sys
from kazoo.client import KazooClient, KazooState
import logging
from importlib import reload
reload(sys)
logging.basicConfig(
level=logging.DEBUG
, stream=sys.stdout
, format='query ok---%(asctime)s %(pathname)s %(funcName)s%(lineno)d %(levelname)s: %(message)s')
# 创建一个客户端,可以指定多台zookeeper,
zk = KazooClient(
# hosts='10.0.0.18:2181'
hosts='10.0.0.18:2181,10.0.0.19:2181,10.0.0.20:2181'
, timeout=10.0 # 连接超时时间
,logger=logging # 传一个日志对象进行,方便 输出debug日志
)
#递归遍历所有节点的子节点函数,_zk是KazooClient的对象,node是节点名称字符串,func是回调函数
def zk_walk(_zk, node, func):
data, stat = _zk.get(node)
children = _zk.get_children(node)
func(node, data, stat, children)
if len(children) > 0:
for sub in children:
sub_node = ''
if node != '/':
sub_node = node + '/' + sub
else:
sub_node = '/' + sub
zk_walk(_zk, sub_node, func)
#测试zk_walk的打印回调函数,只是把所有数据都打印出来
def printZNode(node, data, stat, children):
print("node : " + node)
print("data : " + str(data))
print("stat : " + str(stat))
print("child : " + str(children))
print('-'*50)
#开始心跳
zk.start()
#遍历谋个节点的所有子节点
zk_walk(zk, '/', printZNode)
#执行stop后所有的临时节点都将失效
zk.stop()
zk.close()
python操作zk基本玩法就到这,更多的是如从事python大数据的开发工程师,需要继续看kazoo模块的官网文档,研究其他用法。
python-API开发zk客户端的更多相关文章
- 如何在 Apache Flink 中使用 Python API?
本文根据 Apache Flink 系列直播课程整理而成,由 Apache Flink PMC,阿里巴巴高级技术专家 孙金城 分享.重点为大家介绍 Flink Python API 的现状及未来规划, ...
- Python自动化开发 - RESTful API
本节内容 1. RESTful 简介 2. RESTful 设计指南 3. Django REST Framework 最佳实践 4. 理论拓展与开放平台 5. API文档化与测试 一 R ...
- BotVS开发基础—Python API
代码 import json def main(): # python API列表 https://www.botvs.com/bbs-topic/443 #状态信息 LogStatus(" ...
- Python Web 开发的十个框架【转载】
Python 是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准 库也是值得大家称赞的,Python甚至还 ...
- Python CMDB开发
Python CMDB开发 运维自动化路线: cmdb的开发需要包含三部分功能: 采集硬件数据 API 页面管理 执行流程:服务器的客户端采集硬件数据,然后将硬件信息发送到API,API负责将获取 ...
- HBase Python API
HBase Python API HBase通过thrift机制可以实现多语言编程,信息通过端口传递,因此Python是个不错的选择 吐槽 博主在Mac上配置HBase,奈何Zoomkeeper一直报 ...
- appium自动化环境搭建(python语言开发)
简述 1.安装jdk,配置环境变量 2.安装AndroidSDK,配置环境变量 3.安装Python 4.安装Python集成开发环境PyCharm 5.安装node 6.安装appium服务端 7. ...
- Python测试 ——开发工具库
Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. mechanize- Python中有状态的程序化Web浏 ...
- ZK客户端
说明:本文为读<从Paxos到Zookeeper 分布式一致性原理与实践>读书笔记 shell操作 Java客户端 原始API pom文件: <dependency> < ...
- Python API:openstack
OpenStack 是一个越来越流行的.用于部署基础架构即服务 (IaaS) 云的开源解决方案.OpenStack 附带了一个仪表板 Web 应用程序,非常适合执行手动任务,比如启动单个虚拟机 (VM ...
随机推荐
- [ARC174B] Bought Review 题解
[题目描述] 你开了一家店,有 \(A_i\) 个 \(i\) 星级评论,你可以花费 \(P_i\) 元买到一个 \(i\) 星评论,问使得这家店评论的星星平均值不小于 \(3\),最少要花多少钱. ...
- EMQX + PolarDB-X 一站式 IoT 数据解决方案
简介: 本文整理自 EMQX 产品经理李国伟,在PolarDB开源社区中关于EMQX与PolarDB-X构建一站式IoT数据解决方案的分享.本篇内容主要分为四个部分:1. IoT数据特性 2. EMQ ...
- 全链路灰度之 RocketMQ 灰度
简介:本文将以上次介绍过的<如何用 20 分钟就能获得同款企业级全链路灰度能力?>中的场景为基础,来进一步介绍消息场景的全链路灰度. 作者:亦盏 之前的系列文章中,我们已经通过全链路金丝 ...
- 技术实践第二期|Flutter异常捕获
简介:应用性能稳定是良好用户体验中非常关键的一环,为了更好保障应用性能稳定,异常捕获在保证线上产品稳定中扮演着至关重要的角色.我们团队在推出了U-APM移动应用性能监控的产品后,帮助开发者定位并解决 ...
- 2019-8-31-C#-如何引用-WshShell-类
title author date CreateTime categories C# 如何引用 WshShell 类 lindexi 2019-08-31 16:55:58 +0800 2019-3- ...
- linux Makefile 如何将生成的 .o 文件放到指定文件夹
一.Makefile文件 为了方便分析,直接上文件,Makefile 文件中的内容如下所示: # # Makefile # 编译的.o文件和.c文件在同一路径下 # $(info "star ...
- git将本地项目关联远程仓库并上传到新分支
混合项目开发,项目交接的时候没做好,新入职接手老项目的时候一脸懵逼,进入开发阶段时,越搞越不对,越搞越不对,总感觉 本地跑的项目和己方测试环境以及客户的测试环境和目标环境不一致,结果发现着手的两套代码 ...
- Python 潮流周刊#49:谷歌裁员 Python 团队,微软开源 MS-DOS 4.0
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- docker 完美部署gitea
效果: docker-compose version: "3" networks: gitea: external: false services: server: image: ...
- 那什么是URL、URI、URN?
URI Uniform Resource Identifier 统一资源标识符 URL Uniform Resource Locator 统一资源定位符 URN Uniform Resource Na ...