python 操做zookeeper詳解

ZooKeeper 簡介

  ZooKeeper 是一個分佈式的、開放源碼的分佈式應用程序協調服務,是 Google 的 Chubby 一個開源的實現,是 Hadoop 和 Hbase 的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。ZooKeeper 支持大部分開發語言,除了某些特定的功能只支持 Java 和 C。python 經過 kazoo 能夠實現操做 ZooKeeper 。html

 

1、安裝

 這個簡單,使用 pip 命令安裝node

pip3 install kazoo

 

2、鏈接 ZooKeeper 

 可經過 KazooClient 類直接鏈接 ZooKeeper ,支持多個 host ,端口默認 2181。python

import json
from kazoo.client import KazooClient

zk = KazooClient(hosts='10.1.44.55')
zk.start()

 

3、建立節點

 先看下 create() 方法定義sql

def create(self, path, value=b"", acl=None, ephemeral=False,
               sequence=False, makepath=False):
 
        :param path: Path of node.
        :param value: Initial bytes value of node.
        :param acl: :class:`~kazoo.security.ACL` list.
        :param ephemeral: Boolean indicating whether node is ephemeral
                          (tied to this session).
        :param sequence: Boolean indicating whether path is suffixed
                         with a unique index.
        :param makepath: Whether the path should be created if it
                         doesn't exist.

 咱們來解釋下這些參數:json

  • path:           節點路徑
  • value:         節點對應的值,注意值的類型是 bytes
  • ephemeral: 若爲 True 則建立一個臨時節點,session 中斷後自動刪除該節點。默認 False
  • sequence:     若爲 True 則在你建立節點名後面增長10位數字(例如:你建立一個 testplatform/test 節點,實際建立的是 testplatform/test0000000003,這串數字是順序遞增的)。默認 False
  • makepath:  若爲 False 父節點不存在時拋 NoNodeError。若爲 True 父節點不存在則建立父節點。默認 False

 

 舉個例子:api

from kazoo.client import KazooClient

zk = KazooClient(hosts='10.1.44.55')
zk.start()
# 建立節點:makepath 設置爲 True ,父節點不存在則建立,其餘參數不填均爲默認
zk.create('/testplatform/test',b'this is test!',makepath=True)
# 操做完後,別忘了關閉zk鏈接
zk.stop()
print(value)

 

4、查看節點

 KazooClient 類用提供 get_children() 和 get() 方法獲取 子節點 和 節點對應的值session

from kazoo.client import KazooClient

zk = KazooClient(hosts='10.1.44.55')
zk.start()
# 獲取某個節點下全部子節點
node = zk.get_children('/testplatform')
# 獲取某個節點對應的值
value = zk.get('/testplatform/mssql')
# 操做完後,別忘了關閉zk鏈接
zk.stop()
print(node,value)

 

 5、更改節點

 更改上文建立的 node 值,使用 set() 方法分佈式

from kazoo.client import KazooClient

zk = KazooClient(hosts='10.1.44.55')
zk.start()
# 更改節點對應的value
zk.set('/testplatform/test',b'this is not test')
# 獲取某個節點對應的值
value = zk.get('/testplatform/test')
zk.stop()
print(value)

 

 6、刪除節點

  刪除上文建立的節點,使用 delete() 方法oop

from kazoo.client import KazooClient

zk = KazooClient(hosts='10.1.44.55')
zk.start()
# 刪除節點對應的value
zk.delete('/testplatform/test',recursive=False)
zk.stop()

 參數 recursive:若爲 False,當須要刪除的節點存在子節點,會拋異常 NotEmptyError 。若爲True,則刪除 此節點 以及 刪除該節點的全部子節點this

 

7、watches 事件

 zookeeper 全部讀操做都有設置 watch 選項(get_children() 、get() 和 exists())。watch 是一個觸發器,當檢測到 zookeeper 有子節點變更 或者 節點value發生變更時觸發。下面以 get() 方法爲例。

from kazoo.client import KazooClient

zk = KazooClient(hosts='10.1.44.55')
zk.start()

def test(event):
    print('觸發事件')

if __name__ == "__main__":
    zk.get('/testplatform/test',watch = test)
    print("第一次獲取value")
    zk.set('/testplatform/test',b'hello')
    zk.get('/testplatform/test',watch = test)
    print("第一次獲取value")



# 輸出
#第一次獲取value
#觸發事件
#第二次獲取value

 

 

須要更多高階方法使用的同窗,請參考kazoo官方文檔:https://kazoo.readthedocs.io/en/latest/api/client.html

相關文章
相關標籤/搜索