Zookeeper client

當我寫完Zookeeper leader選舉後,準備看看Zookeeper的存儲和處理客戶端請求的時候發現,如果能看看Zookeeper的API是不是在理解後面的過程更好些呢。

Zookeeper的client是通過Zookeeper類提供的。前面曾經說過,Zookeeper給使用者提供的是一個類似操作系統的文件結構,只不過這個結構是分佈式的。可以理解爲一個分佈式的文件系統。我們可以通過Zookeeper來訪問這個分佈式的文件系統。

Zookeeper的client api給我們提供以下這些API:

1. create

在給定的path上創建節點,這個path就像文件系統的路徑,比如/myapp/data/1,在創建節點的時候還可以指定節點的類型:是永久節點,永久順序節點,臨時節點,臨時順序節點。這個節點類型是非常強大的。永久節點一經創建就永久保留了,就像我們在文件系統上創建一個普通文件,這個文件的生命週期跟創建它的應用沒有任何關係。而臨時節點呢,當創建這個臨時節點的應用與zookeeper之間的會話過期之後就會被zookeeper自動刪除了。這個特性是實現很多功能的關鍵。比如我們做集羣感知,我們的應用啓動的時候將自己的ip地址作爲臨時節點創建在某個節點下面。當我們的應用因爲某些原因,比如網絡斷掉或者宕機,它與zookeeper的會話就會過期了,過期後這個臨時節點就刪除了。這樣我們就可以通過這個特性來感知到我們的服務的集羣有哪些機器是活者的。那麼順序節點又是什麼呢。一般,如果我們在指定的path上創建節點,如果這個節點已經被創建了,則會拋出一個NodeExistsException的異常。如果我們在指定的路徑上創建順序節點,則Zookeeper會自動的在我們給定的path上加上一個順序編號。這個特性就是實現分佈式鎖的關鍵。假設我們有幾個節點共享一個資源,我們這幾個節點都想爭用這個資源,那我們就都向某個路徑創建臨時順序節點。然後順序最小的那個就獲得鎖,然後如果某個節點釋放了鎖,那順序第二小的那個就獲得鎖,以此類推,這樣一個分佈式的公平鎖就實現了。

除此之外,每個節點上還可以保存一些數據。

2. delete 刪除給定節點。刪除節點的時候還可以給定一個version,只有路徑和version都匹配的時候節點纔會被刪除。有了這個version在分佈式環境種我們就可以用樂觀鎖的方式來確保一致性。比如我們先讀取一下節點,獲得了節點的version,然後刪除,如果刪除成功了則說明在這之間沒有人操作過這個節點,否則就是併發衝突了。

3. exists 這個節點會返回一個Stat對象,如果給定的path不存在的話則返回null。這個方法有一個關鍵參數,可以提供一個Watcher對象。Wathcer是Zookeeper強大功能的源泉。Watcher就是一個事件處理器,一個回調。比如這個exists方法,調用後,如果別人對這個path上的節點進行操作,比如創建,刪除或設置數據,這個Wather都會接收到對應的通知。

4. setData/getData 設置或獲取節點的數據,getData也可以設置Watcher

5. getChildren 獲取子節點,可以設置Watcher

6. sync zookeeper是一個集羣,創建節點的時候只要半數以上的節點確認就認爲是創建成功了,但是如果讀取的時候正好讀取到一個落後的節點上,那就有可能讀取到舊的數據,這個時候可以執行一個sync操作,這個操作可以確保讀取到最新的數據。

zookeeper的client api基本上介紹完了。zookeeper強大的功能都是通過這些API來實現的,zookeeper通過一個簡單的文件系統數據模型對外提供服務。通過臨時節點,Watcher等手段我們可以實現一些在分佈式環境種很難做到的事情。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章