设为首页 收藏本站
查看: 814|回复: 0

[经验分享] Zookeeper详解(十):Python连接和操作Zookeeper

[复制链接]

尚未签到

发表于 2019-1-7 14:23:01 | 显示全部楼层 |阅读模式
  Python对Zookeeper的基本操作
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from kazoo.client import KazooClient

def main():
    try:
        nodePath = "/zktest"
        host = "172.16.48.171"
        port = "2181"
        timeout = 100
        zkc = KazooClient(hosts=host + ':' + port, timeout=timeout)
        zkc.start()
        # 判断节点是否存在
        if zkc.exists(nodePath+"/test111"):
            print nodePath + "/test111", "存在"
        else:
            # 建立节点,成功后返回新节点路径
            childrenPath = zkc.create(nodePath+"/test111", "test111")
            print "创建节点:", childrenPath, "成功。"
            # 创建临时节点,连接断开则节点自动删除
            zkc.create(nodePath+"/test999", "test999", ephemeral=True)
        # 获取节点数据和节点数据,返回2个值,一个是节点数据,一个是节点stat,这是个ZnodeStat对象,它其实是节点属性,一共有12个属性
        dataAndStat = zkc.get(nodePath)
        data = dataAndStat[0]
        print "数据为:", data
        stat = dataAndStat[1]
        print "数据版本号为:", stat.version
        print "数据长度为:", stat.data_length
        print "子节点数量:", stat.numChildren
        # 更新节点数据,数据最大为1MB超过则报错,成功后返回 ZnodeStat 对象
        stat = zkc.set(nodePath, value="test222")
        print "数据版本号为:", stat.version
        # 删除节点,后面的参数用于控制是否递归删除,默认是False,但是这样就会有一个问题,如果该节点下有子节点则本次删除失败,你需要先删除
        # 它下面的所有子节点才行
        if zkc.exists(nodePath+"/test111"):
            result = zkc.delete(nodePath+"/test111", recursive=False)
            if result:
                print "删除节点成功。"
        print nodePath + " 的子节点为:", zkc.get_children(nodePath)
        zkc.close()
        zkc.stop()
    except Exception as err:
        print err.message

if __name__ == "__main__":
    try:
        main()
    finally:
        sys.exit()  Watcher事件操作
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import time
from kazoo.client import KazooClient
from kazoo.client import ChildrenWatch
from kazoo.client import DataWatch
"""
Watcher可以通过两种方式设置,一种是在调用ZK客户端方法的时候传递进去,比如 zk.get_children("/node", watch=FUN),但是这种方法是一次性的
也就是触发一次就没了,如果你还想继续监听一个事件就需要再次注册。
另外一种方法是通过高级API实现,监控数据或者节点变化,它只需要我们注册一次。一次性事件关注是zookeeper默认的即便在JAVA客户端里也是,这种高级别
API在JAVA里是zkclient,而在Python里面就是kazoo。高级API其实是对低级API的封装,对用户来讲更加好用。
"""
__metaclass__ = type

class zkWatcherTest:
    def __init__(self, host, port, timeout=10):
        self._nodename = ''
        self._host = host
        self._port = port
        self._timeout = timeout
        self._zk = KazooClient(hosts=self._host + ':' + self._port, timeout=self._timeout)
        self._zk.start()
        self._lastNodeList = []
    def start(self, zkPath):
        self._lastNodeList = self._zk.get_children(zkPath)
        try:
            ChildrenWatch(client=self._zk, path=zkPath, func=self._NodeChange)
            DataWatch(client=self._zk, path=zkPath, func=self._DataChange)
            # 这里的死循环就是为了不让程序退出,你可以把时间设置长一点观察,其实即便没有到60秒的睡眠时间,如果
            # 子节点或者节点数量发生变化也会收到通知。这里的wathch底层就是在节点上设置监听器,然后捕捉事件,如果有
            # 事件触发就调用你传递的方法来处理。
            while True:
                time.sleep(60)
                print "OK"
        except Exception as err:
            print err.message
    def _NodeChange(self, children):
        """
        处理子节点变化
        :param children: 这个参数并不需要你传递进来,因为把这个方法传递进ChiledrenWatcher,会返回一个当前子节点列表
        :return:
        """
        # print children
        # 如果新节点列表长度大于上次获取的节点列表长度,说明有增加
        if len(children) > len(self._lastNodeList):
            for node in children:
                if node not in self._lastNodeList:
                    print "新增加的节点为:", str(node)
                    self._lastNodeList = children
        else:
            for node in self._lastNodeList:
                if node not in children:
                    print "删除的节点为:", str(node)
                    self._lastNodeList = children
    def _DataChange(self, data, stat):
        """
        处理节点的数据变化
        :param data:
        :param stat:
        :return:
        """
        print "数据发生变化"
        print "数据为:", data
        print "数据长度:", stat.dataLength
        print "数据版本号version:", stat.version
        print "cversion:", stat.cversion
        print "子节点数量:", stat.numChildren

def main():
    try:
        zkwt =zkWatcherTest(host="172.16.48.171", port="2181")
        zkwt.start("/zktest")
    except Exception as err:
        print err.message

if __name__ == "__main__":
    try:
        main()
    finally:
        sys.exit()  关于Watcher,网上很多帖子都是通过装饰器的方式实现的,其实我上面的方式和装饰器是一样的,只是形式不同罢了。功能都能实现,只是用装饰器有时候会不方便。





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-660412-1-1.html 上篇帖子: Zookeeper详解(八):Zookeeper数据存储 下篇帖子: 定时清除Zookeeper日志
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表