前面于超老师讲完了,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. 第 7章 Python 爬虫框架 Scrapy(上)

    第 7章 Python 爬虫框架 Scrapy(上) 编写爬虫可以看成行军打仗,基本的角色有两个:士兵和将军,士兵冲锋陷阵,而将军更多地是调兵遣将.框架就像一个将军,里面包含了爬虫的全部流程.异常处理 ...

  2. 毕业两年升主管,自沉稳而后顾人 对话阿里云MVP陈琦

    所有伟大都源于一个勇敢的开始 我跟可视化结缘是一个巧合,一开始并没有很笃定要做这个方向.2015年可视化的市场还不繁荣,我在创业公司实习,跟领导层一起参加各种创业大赛路演,当时我做的主要工作就是和领导 ...

  3. 全链路灰度之 RocketMQ 灰度

    ​简介:本文将以上次介绍过的<如何用 20 分钟就能获得同款企业级全链路灰度能力?>中的场景为基础,来进一步介绍消息场景的全链路灰度. 作者:亦盏 之前的系列文章中,我们已经通过全链路金丝 ...

  4. Spring Boot Serverless 实战系列“架构篇” | 光速入门函数计算

    ​简介:如何以 Serverless 的方式运行 Spring Boot 应用? ​ 作者:西流(阿里云函数计算专家) Spring Boot 是基于 Java Spring 框架的套件,它预装了 S ...

  5. [PHP] Laravel cast array 数据库存 json 时的 unicode 编码问题

    在模型上设置 accessor 和 mutator,将数组转为 json,并设置 json 选项. class User extends Model { public function setOpti ...

  6. dotnet OpenXML 解析 PPT 里表格的样式

    在 PPT 里面的表格可以通过表格样式配置决定表格的样式,本文将和大家介绍如何获取和解析表格的样式 本文属于 OpenXML 系列博客,有一定的上下文,详细请参阅 Office 使用 OpenXML ...

  7. WPF 优化 EnsureHandle 启动性能

    本文将记录一个在 WPF 应用程序启动过程中的性能优化点.如果一个窗口需要设置 WindowStyle 属性,那么在窗口 EnsureHandle 之前,设置 WindowStyle 属性将会比在 E ...

  8. SpringBoot获取Bean的工具类

    1.beanName 默认是类名首字母小写 下面的类:beanName = bean1 @Component public class Bean1 { public String getBean1() ...

  9. 什么是SQL 语句中相关子查询与非相关子查询

    1.什么是SQL子查询 要理解相关子查询和非相关子查询,我们得首先理解什么是子查询,子查询是指在一个查询语句中嵌套的另一个查询语句. 子查询可以嵌套在其他查询语句中,如 SELECT.INSERT.U ...

  10. SAP集成技术(十一)SAP混合集成平台

    愿景 SAP产品之间实现无缝集成还需要一些时间,目前可能还存在一些技术挑战或者需要进一步的开发工作,以便在未来能够轻松地把所有SAP产品整合在一起.让SAP产品能够顺利地与非SAP的解决方案连接,这也 ...