使用python操作zookeeper


kazoo 介紹

zookeeper的開發接口以前主要以java和c為主,隨着python項目越來越多的使用zookeeper作為分布式集群實現,python的zookeeper接口也出現了很多,現在主流的純python的zookeeper接口是kazoo。因此如何使用kazoo開發基於python的分布式程序是必須掌握的。

安裝kazoo

pip3 install kazoo

基本操作

from kazoo.client import KazooClient
zk = KazooClient(hosts='192.168.91.128:2181')    #如果是本地那就寫127.0.0.1
zk.start()    #與zookeeper連接
zk.stop()    #與zookeeper斷開

創建節點

from kazoo.client import KazooClient
zk = KazooClient(hosts='192.168.91.128:2181')    #如果是本地那就寫127.0.0.1
zk.start()    #與zookeeper連接
#makepath=True是遞歸創建,如果不加上中間那一段,就是建立一個空的節點
zk.create('/abc/JQK/XYZ/0001',b'this is my house',makepath=True)
node = zk.get_children('/')  # 查看根節點有多少個子節點
print(node)
zk.stop()    #與zookeeper斷開

執行輸出:

['abc', 'zookeeper']

注意:空節點的值不能用set修改,否則執行報錯!

刪除節點

如果要刪除這個/abc/JQK/XYZ/0001的子node,但是想要上一級XYZ這個node還是存在的,語句如下:

from kazoo.client import KazooClient
zk = KazooClient(hosts='192.168.91.128:2181')    #如果是本地那就寫127.0.0.1
zk.start()    #與zookeeper連接
#recursive=True是遞歸刪除,就是無視下面的節點是否是空,都干掉,不加上的話,會提示子節點非空,刪除失敗
zk.delete('/abc/JQK/XYZ/0001',recursive=True)
node = zk.get_children('/')  # 查看根節點有多少個子節點
print(node)
zk.stop()    #與zookeeper斷開

執行輸出:

['abc', 'zookeeper']

更改節點

現在假如要在0001這個node里更改value,比如改成:"this is my horse!",

由於上面節點已經被刪除掉了,需要先創建一次。

語句如下:

from kazoo.client import KazooClient
zk = KazooClient(hosts='192.168.91.128:2181')    #如果是本地那就寫127.0.0.1
zk.start()    #與zookeeper連接
zk.create('/abc/JQK/XYZ/0001',b'this is my house',makepath=True)
zk.set('/abc/JQK/XYZ/0001',b"this is my horse!")
node = zk.get('/abc/JQK/XYZ/0001')  # 查看值
print(node)
zk.stop()    #與zookeeper斷開

執行輸出:

(b'this is my horse!', ZnodeStat(czxid=4294967449, mzxid=4294967452, ctime=1544598301273, mtime=1544598308267, version=1, cversion=0, aversion=0, ephemeralOwner=0, dataLength=17, numChildren=0, pzxid=4294967449))

注意!set這種增加節點內容的方式是覆蓋式增加,並不是在原有基礎上增添。而且添加中文的話可能在ZooInspecter里出現的是亂碼

查看節點

由於所有節點,都是在/ 節點上面的,直接查看根節點,就可以知道所有節點了

from kazoo.client import KazooClient
zk = KazooClient(hosts='192.168.91.128:2181')    #如果是本地那就寫127.0.0.1
zk.start()    #與zookeeper連接
node = zk.get_children('/')
print(node)
zk.stop()    #與zookeeper斷開

執行輸出:

['abc', 'zookeeper']

一鍵清空zookeeper

有些時候,需要將zookeeper的數據全部清空,可以使用以下代碼

from kazoo.client import KazooClient
zk = KazooClient(hosts='192.168.91.128:2181')    #如果是本地那就寫127.0.0.1
zk.start()    #與zookeeper連接
jiedian = zk.get_children('/')  # 查看根節點有多少個子節點
print(jiedian)
for i in jiedian:
    if i != 'zookeeper':  # 判斷不等於zookeeper
        print(i)
        # 刪除節點
        zk.delete('/%s'%i,recursive=True)
zk.stop()    #與zookeeper斷開

注意:默認的zookeeper節點,是不允許刪除的,所以需要做一個判斷。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM