前面于超老师讲完了,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客户端的更多相关文章

  1. 如何在 Apache Flink 中使用 Python API?

    本文根据 Apache Flink 系列直播课程整理而成,由 Apache Flink PMC,阿里巴巴高级技术专家 孙金城 分享.重点为大家介绍 Flink Python API 的现状及未来规划, ...

  2. Python自动化开发 - RESTful API

    本节内容 1.  RESTful 简介 2.  RESTful 设计指南 3.  Django REST Framework 最佳实践 4.  理论拓展与开放平台 5.  API文档化与测试 一  R ...

  3. BotVS开发基础—Python API

    代码 import json def main(): # python API列表 https://www.botvs.com/bbs-topic/443 #状态信息 LogStatus(" ...

  4. Python Web 开发的十个框架【转载】

    Python 是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准 库也是值得大家称赞的,Python甚至还 ...

  5. Python CMDB开发

    Python CMDB开发   运维自动化路线: cmdb的开发需要包含三部分功能: 采集硬件数据 API 页面管理 执行流程:服务器的客户端采集硬件数据,然后将硬件信息发送到API,API负责将获取 ...

  6. HBase Python API

    HBase Python API HBase通过thrift机制可以实现多语言编程,信息通过端口传递,因此Python是个不错的选择 吐槽 博主在Mac上配置HBase,奈何Zoomkeeper一直报 ...

  7. appium自动化环境搭建(python语言开发)

    简述 1.安装jdk,配置环境变量 2.安装AndroidSDK,配置环境变量 3.安装Python 4.安装Python集成开发环境PyCharm 5.安装node 6.安装appium服务端 7. ...

  8. Python测试 ——开发工具库

    Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. mechanize- Python中有状态的程序化Web浏 ...

  9. ZK客户端

    说明:本文为读<从Paxos到Zookeeper 分布式一致性原理与实践>读书笔记 shell操作 Java客户端 原始API pom文件: <dependency> < ...

  10. Python API:openstack

    OpenStack 是一个越来越流行的.用于部署基础架构即服务 (IaaS) 云的开源解决方案.OpenStack 附带了一个仪表板 Web 应用程序,非常适合执行手动任务,比如启动单个虚拟机 (VM ...

随机推荐

  1. OpenYurt v1.1.0: 新增 DaemonSet 的 OTA 和 Auto 升级策略

    简介: 在 OpenYurt v1.1.0 版本中,我们提供了 Auto 和 OTA 的升级策略.Auto 的升级策略重点解决由于节点 NotReady 而导致 DaemonSet升级阻塞的问题,OT ...

  2. Java 应用压测性能问题定位经验分享

    简介: 问题千千万,但只要修练了足够深厚的内功,形成一套属于自己的排查问题思路和打法,再加上一套支撑问题排查的工具,凭借已有的经验还有偶发到来的那一丝丝灵感,相信所有的问题都会迎刃而解. 作者:凡勇 ...

  3. 可观测告警运维系统调研——SLS告警与多款方案对比

    简介: 本文介绍对比多款告警监控运维平台方案,覆盖阿里云SLS.Azure.AWS.自建系统(ELK.Prometheus.TICK)等方案. 前言 本篇是SLS新版告警系列宣传与培训的第三篇,后续我 ...

  4. Flow vs Jenkins 实操对比,如何将Java应用快速发布至ECS

    ​简介:Jenkins 由于其开源特性以及丰富插件能力,长久以来都是中小企业搭建 CICD 流程的首选.不过 Jenkins 存在维护成本高.配置复杂等缺点,云效 Flow 较好地解决了这些问题. 本 ...

  5. 技术干货 | Native 页面下如何实现导航栏的定制化开发?

    ​简介: 通过不同实际场景的描述,供大家参考完成 Native 页面的定制化开发. ​ 很多 mPaaS Coder 在接入 H5 容器后都会对容器的导航栏进行深度定制,本文旨在通过不同实际场景的描述 ...

  6. Pull or Push?监控系统如何选型

    ​简介: 对于建设一套公司内部使用的监控系统平台,相对来说可选的方案还是非常多的,无论是用开源方案自建还是使用商业的SaaS化产品,都有比较多的可选项.但无论是开源方案还是商业的SaaS产品,真正实施 ...

  7. [Tools] Kali Linux 高清屏扩大系统字体、BurpSuite、OpenVAS

    系统检索 Setting Manager,Appearance -> Settings,选择 Window Scaling:2x Terminal fonts: linux terminal 快 ...

  8. SQL server 批量删除表

    select 'drop table '+name+';' from sys.tables declare c cursor forselect NAME from sysobjects where ...

  9. CF877F Ann and Books (分类统计贡献+普通莫队)

    CF877F Ann and Books 题意: 商店里有 \(n\) 本书,每本书中有 \(a_i\) 个 \(t_i=1/2\) 类问题. \(m\) 次询问,每次询问给出一个区间,求有多少个符合 ...

  10. spire.Doc -Index was out of the range

    一直以来用的好好的,突然有一天出现:Index was out of the range   ED04211_邵武市易逸行软件技术服务有限公司(万顺出行)_其他 升级后问题: 1.合并单元格出现问题 ...