Zookeeper-Zookeeper client

橫刀天笑發表於2014-11-23

當我寫完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等手段我們可以實現一些在分散式環境種很難做到的事情。

相關文章