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

[经验分享] 使用Kazoo去增删改查zookeeper

[复制链接]

尚未签到

发表于 2019-1-8 08:10:15 | 显示全部楼层 |阅读模式
  每一次新版本开发,都会有开发频繁的要求查看以前版本里zookeeper的内部配置,由于我公司规定zookeeper的密钥是不能轻易给开发人员的,所以每次开发找过来运维就要停下手里工作去帮忙看一下,这样一来二去就搞得运维很烦。于是就萌生一个念头,通过一个工具去查询zookeeper的节点情况,然后再将这个工具嵌入到django里做成web界面,让开发苦逼直接去django里查。
  由于django是python语言写的,为了代码统一不至于看疯一个人,所以这个工具也要选择python系,那么就要使用Kazoo,因为它比较专业而且成熟。这里实验使用的python版本是2.7.5。

  安装Kazoo的方法很简单,#pip install kazoo。然后启动zookeeper的服务端,安装zookeeper的方法去看:http://blog.运维网.com/chenx1242/1889715 。
  进入python后,基本操作如下:
>>> from kazoo.client import KazooClient
>>> zk = KazooClient(hosts='Zookeeper的地址:2181')    #如果是本地那就写127.0.0.1
#zk = KazooClient(hosts='Zookeeper 1的地址:2181,Zookeeper 2的地址:2181,Zookeeper 3的地址:2181')    #如果是zookeeper集群就这么写
>>> zk.start()    #与zookeeper连接,如果是zk.start(timeout=15),就规定了超时时间
>>> zk.state
'CONNECTED'        #已经连接成功,如果是LOST就是连接失败
>>> zk.connected
True                #确认已经连接
>>> zk.stop()    #与zookeeper断开  如果出现了“kazoo.handlers.threading.KazooTimeoutError: Connection time-out”这个错误,请检查zookeeper的进程是否已经启动。这里补充一句,zk.start()是以同步的形式连接服务集群。
  如果要建立一个叫/abc/JQK/XYZ/0001的node,node里面的value是"this is my house" ,语句如下:
zk.create('/abc/JQK/XYZ/0001',b'this is my house',makepath=True)   
#makepath=True是递归创建,如果不加上中间那一段,就是建立一个空的节点
zk.ensure_path('/abc/JQK/XYZ/0001')        #这样写是创建空的node  效果如图:

  如果要删除这个/abc/JQK/XYZ/0001的子node,但是想要上一级XYZ这个node还是存在的,语句如下:
zk.delete('/abc/JQK/XYZ/0001',recursive=True)   
#recursive=True是递归删除,就是无视下面的节点是否是空,都干掉,不加上的话,会提示子节点非空,删除失败  现在假如要在0001这个node里更改value,比如改成:“this is my horse!”,语句如下:
>>> zk.set('/abc/JQK/XYZ/0001',"this is my horse!")
ZnodeStat(czxid=80, mzxid=84, ctime=1513913337850, mtime=1513913601610, version=3, cversion=0, aversion=0, ephemeralOwner=0, dataLength=17, numChildren=0, pzxid=80)  注意!set这种增加节点内容的方式是覆盖式增加,并不是在原有基础上增添。而且添加中文的话可能在ZooInspecter里出现的是乱码,现在我们来到ZooInspecter看一下效果:

我现在在'/ps/spider/dlb-receiver/'下建立两个node,一个叫0001,另一个叫0002,现在若要查看“/ps/spider/dlb-receiver/“下面有多少个子节点,语句是:

>>> zk.get_children('/ps/spider/dlb-receiver')
[u'0001', u'0002']      #可见目前只有两个子节点
>>> children = zk.get_children("/ps/spider/dlb-receiver")   
>>> print("There are %s children with names %s" % (len(children), children))
There are 2 children with names [u'0001', u'0002']假设“/ps/spider/dlb-receiver/0001”它里面的value如图:

  要查看这个“/ps/spider/dlb-receiver/0001”的value,语句是:
>>> zk.get('/ps/spider/dlb-receiver/0001')    #获得的type是tuple(元组)
('-- this is mysql\r\nmysql = {\r\n\thost = "rm-bp116dn17141tx72j.mysql.rds.aliyuncs.com",\r\n\tport = 3306,\r\n\tdatabase = "lcyy123ht",\r\n\tusername = "lcyyoalalht",\r\n\tpassword = "dvlSdJyuw2ad43fg09",\r\n}\r\n\r\n-- this is redis\r\nredis = {\r\n\thost = "127.0.0.1",\r\n\tport = 6379,\r\n}', ZnodeStat(czxid=47, mzxid=110, ctime=1513863785337, mtime=1513924538981, version=6, cversion=0, aversion=0, ephemeralOwner=0, dataLength=255, numChildren=0, pzxid=47))
>>> print(zk.get('/ps/spider/dlb-receiver/0001'))    #前面加上print也是可以的
('-- this is mysql\r\nmysql = {\r\n\thost = "rm-bp116dn17141tx72j.mysql.rds.aliyuncs.com",\r\n\tport = 3306,\r\n\tdatabase = "lcyy123ht",\r\n\tusername = "lcyyoalalht",\r\n\tpassword = "dvlSdJyuw2ad43fg09",\r\n}\r\n\r\n-- this is redis\r\nredis = {\r\n\thost = "127.0.0.1",\r\n\tport = 6379,\r\n}', ZnodeStat(czxid=47, mzxid=110, ctime=1513863785337, mtime=1513924538981, version=6, cversion=0, aversion=0, ephemeralOwner=0, dataLength=255, numChildren=0, pzxid=47))  上面这一大坨tuple看起来很头疼,那么就精简一下:
>>> print(zk.get('/ps/spider/dlb-receiver/0001')[0])    #后面添加一个[0]即可
-- this is mysql
mysql = {
host = "rm-bp116dn17141tx72j.mysql.rds.aliyuncs.com",
port = 3306,
database = "lcyy123ht",
username = "lcyyoalalht",
password = "dvlSdJyuw2ad43fg09",
}
-- this is redis
redis = {
host = "127.0.0.1",
port = 6379,
}
>>> print(zk.get('/ps/spider/dlb-receiver/0001')[1])    #这里是stat
ZnodeStat(czxid=47, mzxid=118, ctime=1513863785337, mtime=1513926132280, version=8, cversion=2, aversion=0, ephemeralOwner=0, dataLength=261, numChildren=0, pzxid=120)  或者是
>>> data,stat = zk.get('/ps/spider/dlb-receiver/0001')
>>> print (data)
-- this is mysql
mysql = {
host = "rm-bp116dn17141tx72j.mysql.rds.aliyuncs.com",
port = 3306,
database = "lcyy123ht",
username = "lcyyoalalht",
password = "dvlSdJyuw2ad43fg09",
}
-- this is redis
redis = {
host = "127.0.0.1",
port = 6379,
}  但是Kazoo也有非常蛋疼的一面,就比如上面的例子,我只想要redis而不想显示mysql的话,kazoo自带的函数是无法做到的,这就必须要自己写python,通过正则表达式来获取了。
  参考文章:https://kazoo.readthedocs.io/en/latest/index.html
  参考文章:http://izualzhy.cn/c/cpp/2016/10/05/zookeeper-python-kazoo-introduction




运维网声明 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-660538-1-1.html 上篇帖子: zookeeper简单的集群配置! 下篇帖子: zookeeper运行优化
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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