分佈式協調技術,主要用來解決分佈式環境中多個線程間的同步控制,讓他們有序的訪問某種臨界資源,防止形成「髒數據」的後果。node
分佈式環境中,經過鎖機制保證多個進程可以有序的訪問的某種臨界資源,該鎖機制稱之爲分佈式鎖。分佈式鎖是分佈式協調技術中的核心內容。數據庫
分佈式環境中,各機器經過網絡實現資源共享和數據互通。問題就出在網絡這,由於網絡是不可靠的。網絡
zookeeper,爲分佈式應用設計的高可用、高性能且一致的開源協調服務,提供了一項基本服務:分佈式鎖服務。因爲zookeeper的開源特性,在分佈式鎖的基礎上,提升了:配置維護、組服務、分佈式消息隊列、分佈式通知/協調等。數據結構
備註:異步
zookeeper提供的服務主要是經過:數據結構 + 原語 + 通知機制,三部分實現的:分佈式
Zookeeper命名空間中的Znode,兼具文件和目錄兩種特色。既像文件同樣維護着數據、元信息、ACL、時間戳等數據結構,又像目錄同樣能夠做爲路徑標識的一部分。每個Znode由3部分組成:性能
zk雖然能夠關聯一些數據,但並無被設計爲常規的數據庫或者大數據存儲,相反的是,它用來管理調度數據,好比分佈式應用中的配置文件信息、狀態信息、聚集位置等等。這些數據的共性都是很小的數據,一般以KB爲大小爲單位大數據
zk中每一個節點znode存儲的數據要被原子性的操做,即讀操做將獲取節點相關的全部數據,寫操做也將替換掉節點的全部數據。線程
此外,每個節點都擁有本身的ACL(訪問控制列表),規定了用戶的權限,限定了用戶對目標節點的可執行操做。設計
ZK的節點有兩種,分別爲臨時節點和永久節點。節點的類型在節點建立時即被肯定,而且不能被改變。
臨時節點,該節點的生命週期取決於它們的會話。一旦會話結束,臨時節點將被自動刪除,固然也能夠手動刪除。雖然每一個臨時節點都會綁定到一個客戶端會話,但它對其餘客戶端都是可見的。另外,zk的臨時節點不容許擁有子節點。
永久節點,該節點的生命週期不依賴於會話,而且只有在客戶端顯示執行刪除操做的時候,才能被刪除
建立Znode時,用戶能夠請求在zk的路徑結尾添加一個遞增的計數器。這個計數對於此節點的父節點來講是惟一的,它的格式爲「%10d」(10爲數字,沒有數值的位數用0填充,例如0000000001)。
客戶端能夠在節點上設置watcher,稱之爲監視器。當節點狀態發生改變時(znode的增刪改操做)將會觸發watcher所對應的操做。當Watcher被觸發時,zk將會向客戶端發送且僅發送一條通知,由於watcher只能被觸發一次,以減小網絡流量。
zk中有多種記錄時間的格式,其中包含如下幾個主要屬性:
Znode維護着三個Zxid,分別爲:cZxid、mZxid、pZxid * cZxid,建立節點對應的Zxid時間戳 * mZxid,修改節點對應的Zxid時間戳 * pZxid,最新修改的Zxid,貌似與mZxid重合了
實現中,Zxid是一個64位的數字,其中高32位表明epoch,用來標識leader關係是否改變,每一次leader選舉,都會有一個新的epoch;低32位是個遞增計數。
zk中每一個Znode節點擁有表示其狀態的許多重要屬性,以下圖所示:
zk中提供了9個基本操做,如圖所示:
ZK提供爲全部的讀操做設置Watch,包括exists()、getChildren()及getData()。Watch事件是一次性的觸發器,當Watch的對象狀態發生改變時,將會觸發此對象上watch事件。Watch事件被異步地發送給客戶端,而且ZK爲watch機制提供了有序的一致性保證。