Zookeeper分散式過程協同技術 - 概念及基礎
Zookeeper是什麼?
- Zookeeper是一種分散式過程協同技術,其所提供的客戶端API功能強大,其中包括:
- 保障強一致性。有序性和永續性。
- 實現通用的同步原語的能力。
- 在實際分散式系統中,併發往往導致不正確的行為。Zookeeper提供了一種簡單的併發處理機制。
關於Zookeeper名字的來源
Zookeeper由雅虎研究院開發,開發團隊原來想使用動物命名專案,在討論時大家覺得分散式系統就像一個動物園,胡亂且難以管理,而Zookeeper就是將這一切變得可控。遂起名為Zookeeper,意為動物園管理員。
Zookeeper使用場景
- 命名服務
命名服務是指通過路徑名稱來獲取服務的地址。首先zookeeper建立一個全域性路徑,服務方在全域性路徑下寫入服務的地址(或者名稱),服務消費方在啟動後watch全域性路徑的資料和變化。注意,這裡的節點均為臨時節點,在服務連線中斷或者當機時,通過臨時節點消失能夠通知訂閱方感知變化。
- 配置管理
服務分佈部署在不同的機器上,將全域性的配置資訊存放於zookeeper的節點下,客戶端通過訂閱節點的資料變化獲取到配置資訊。當節點中的配置資訊發生變化時,客戶端可以通過watch節點傳送的訊息感知,從而修改服務本地的配置管理資訊。
- 叢集管理
當有新機器加入叢集時,由新機器的客戶端在指定的目錄下新建臨時節點,服務註冊管理端通過訂閱指定目錄的變化,收到了新增節點的通知後,將新機器加入叢集服務的列表。當機器退出叢集或者當機時,臨時節點將會被刪除,同樣可以通知服務註冊管理端,有機器退出了叢集。
- 分散式鎖
zookeeper的分散式鎖可以分為2種,保持獨佔或者控制時序。
對於保持獨佔來說,可以把一個節點看做是一把鎖,通過建立節點的方式來搶佔鎖資源。如果建立節點成功,客戶端也就持有了這把鎖,如果建立失敗,則訂閱節點的變化,如果收到節點刪除訊息,再次嘗試建立節點來搶佔鎖資源。
對於控制時序來說,通過在指定目錄下建立臨時有序節點,編號最小的節點首先持有鎖資源,每個後續節點都訂閱前一個節點。擁有鎖資源的客戶端在操作完畢後,刪除自己建立的節點。後續節點收到前置節點的刪除通知後,即獲取了鎖資源,可以進行業務操作。
Zookeeper基礎
Zookeeper通過節點(znode)來實現原語的功能,並不直接暴露原語。Znode指Zookeeper操作和維護一個小型的資料節點,類似於檔案系統的層級樹狀結構進行管理。
圖:Zookeeper資料結構示例
· /作為跟目錄節點,根節點下有/workers和/tasks兩個位元組點。
· /workers節點作為父節點,其下的每一個znode子節點用於儲存系統中的可用worker,節點中儲存著worker子節點的後設資料資訊。
· /tasks節點作為父節點,其下每個znode子節點用於儲存一個代執行的任務,節點中儲存著任務的詳細資料。
API概念
ZookeeperAPI提供了以下方法來實現地znode的控制。
create /path data
建立一個名為/path的znode節點,幷包含資料data。
delete /path
刪除名為/path的znode。
exists /path
檢查是否存在名為/path的節點。
setData /path data
設定名為/path的znode節點的資料為data。
getData /path
返回名為/path節點的資料資訊。
getChildren /path
返回所有/path節點的所有子節點列表。
Znode型別
在新建znode時,需要指定該節點型別,不同的型別決定了znode節點的行為方式,Zookeeper提供了4種不同的znode型別。
持久節點和臨時節點
znode節點可以是持久(persistent)節點,還可以是臨時(ephemeral)節點。持久的znode,如/path,只能通過delete來進行刪除。臨時的znode與之相反,當建立的客戶端崩潰或者關閉了與Zookeeper的連線時,這個節點就會被刪除。
持久znode是一種非常有用的znode,可以通過持久型別znode為應用儲存一些資料,即使znode的建立者不再屬於應用系統時,資料也可以儲存下來而不丟失。例如,在主-從模式中,需要儲存從節點的任務分配情況,即使分配任務的主節點已經崩潰了。
一個臨時znode,在以下兩種情況會被刪除:
- 當建立該znode的客戶端的會話因超時或主動關閉而中止時。
- 當某個客戶端(不一定是建立者)主動刪除該節點時。
注:因為臨時的znode在其建立者的會話過期時被刪除,所以我們現在不允許臨時節點擁有子節點。
有序節點
一個有序znode節點被分配唯一一個單調遞增的整數。當建立有序節點時,一個序號會被追加到路徑之後。例如,客戶端建立一個有序znode節點,其路徑為/tasks/task-,那麼該znode節點為/tasks/task-1。有序znode通過提供了建立具有唯一名稱的znode的簡單方式。同時也通過這種方式可以直觀地檢視znode的建立順序。
Znode一共有四種:持久節點、臨時節點、持久有序節點,臨時有序節點。
監視與通知
Zookeeper提供基於通知的機制提供對節點的監視能力。客戶端向Zookeeper註冊需要接收通知的znode,通過對znode的設定監視點(watch)來接收通知。監視點是一個單次觸發的操作,每次設定只會觸發一次。為了接收多個通知,客戶端必須在每次通知後設定新的監視點。在設定新監視點前客戶端會先讀取znode中的資料,所以不同擔心會錯過狀態的變化。
Zookeeper可以定義不同型別的通知,如監控znode的資料變化、監控znode子節點的變化、監控znode的建立或刪除。