kazoo是一個(gè)提供訪問(wèn)調(diào)用zookeeper方法的一個(gè)python包蚌父。kazoo的官方文檔如下:
https://kazoo.readthedocs.io/en/latest/
from kazoo.client import KazooClient
import configparser
import logging
import socket
hostname = socket.gethostname()
logging.basicConfig(filename="test.log",format='%(asctime)s %(levelname)s \
%(message)s',level=logging.DEBUG)
#獲取zookpeer的hosts配置
cf = configparser.ConfigParser()
cf.read("test.conf")
zkhosts = cf.get("test-zk","zk_hosts")
#啟動(dòng)zk鏈接
zk = KazooClient(hosts=zkhosts)
zk.start()
#創(chuàng)建znode,如果節(jié)點(diǎn)不存在流椒,則創(chuàng)建
if not zk.exists("/zk_ha"):
zk.create("/zk_ha")
if not zk.exists("/zk_ha/conf"):
zk.create("/zk_ha/conf")
if not zk.exists("/zk_ha/nodes"):
zk.create("/zk_ha/nodes")
#創(chuàng)建臨時(shí)有序文件并寫入數(shù)據(jù)hostname
zk.create("/zk_ha/nodes/node",bytes(hostname,\
encoding="utf-8"),ephemeral=True,sequence=True)
while True:
#獲取children節(jié)點(diǎn)中最小編號(hào)的節(jié)點(diǎn)
child = zk.get_children("/zk_ha/nodes")
child_list = sorted(child)
min_child = child_list[0]
min_child_path = "/zk_ha/nodes/" + min_child
#讀取最小children節(jié)點(diǎn)的數(shù)據(jù)
if zk.exists(min_child_path):
try:
data,stat = zk.get(min_child_path)
x = data.decode("utf-8")
except Exception as emsg:
break
#獲取狀態(tài)信息
datac,statc = zk.get("/zk_ha/conf")
i = datac.decode("utf-8")
#如果若果最小children節(jié)點(diǎn)為本節(jié)點(diǎn)所創(chuàng)建的,
#則使用conf中的數(shù)據(jù)開(kāi)始處理任務(wù)
if x == hostname:
print("test ok %s"%i)
if i:
i = int(i) + 1
else:
i =1
zk.set("/zk_ha/conf",bytes(str(i),encoding="utf-8"))
else:
continue
zk.stop()