zookeeper設計上易於編碼,數據模型構建在咱們熟悉的樹形結構目錄風格的文件系統中。java
zookeeper運行在java中,同時支持java和C 語言。正確的實現協調服務是公認的難乾的差事。 他們及其容易出錯,好比資源競爭和死鎖.node
zookeeper命名空間由數據寄存器組成,zookeeper中,咱們稱他爲,znodes, 這跟文件和目錄很是相似..算法
不像一個典型的文件系統,其設計時就是爲了存儲數據.而zookeeper 數據是保存在內存中的,這也就意味着zookeeper能實現一個高吞吐量和低延遲.(由於內存操做效率高)數據庫
zookeeper是有副本的, 就像分佈式的處理協調服務同樣,zookeeper 自己就打算在服務器集羣中使用副本機制,咱們稱之爲全體.編程
組成zookeeper 服務的全部機器節點互相之間都必須感知到對方. 他們維護着當前機器狀態的內存快照,有事務日誌和持久化存儲的快照.緩存
客戶端鏈接到其中一臺zookeeper服務器,客戶端和zookeeper服務器保持一個tcp鏈接,經過tcp鏈接發送請求得到響應,服務器
獲取事件監聽,發送心跳等等. 若是TCP鏈接被中斷了,客戶端會鏈接到另一臺zookeeper服務器.網絡
zookeeper是有序的, zookeeper給每一次更新操做都賦予一個編號,他這個編號反應了對zookeeper的事務性修改順序.框架
隨後的操做可以使用這一順序去實現更高級別的抽象,好比同步原語.tcp
不像標準的文件系統,zookeeper 命名空間中的每一個節點可以有數據關聯,也有子節點.
就比如是文件系統中一個文件對象便可以是一個文件也能夠是一個文件夾.(zookeeper被設計用來存儲協調數據:
狀態信息,配置信息,位置信息等等, 所以數據存儲在每一個節點中一般很是小,從幾個字節到幾千字節之間),
咱們使用znode這個術語來使得咱們討論zookeeper數據節點相關內容時語義更加清晰明確.
znode管理着包含這一個狀態結構數據,它包含數據修改的版本號,ACL修改及時間戳, 容許緩存校驗和協調更新.
znode數據每修改一次,版本號加一. 舉個實際的例子,每次客戶端收到數據的同時,也收到當前數據的版本號.
zookeeper 也有會話級別的節點的語義支持,這些znode節點隨着會話的建立而激活,會話的結束的時候節點被刪除.
zookeeper支持監聽, 客戶端可以設置監聽znode節點. 當znode節點變動時可能觸發或者移除監聽.當監聽事件被觸發了,
客戶端將會收到數據通知包,告訴客戶端節點數據被修改了. 同時若是當前客戶端和zookeeper節點的鏈接被斷開了.
zookeeper 簡單而性能優異. 因爲他簡單快速的目標,他成爲構建許多更加複雜服務的基礎,好比同步服務,他提供了一系列的保證.
1 順序一致性: 來自客戶端的更新操做將會按照順序被做用.
2 原子性操做: 更新要麼所有成功,要麼所有失敗,沒有部分的結果.
3 統一的系統鏡像: 不管客戶端連接的是哪臺服務器,都能得到一樣的服務視圖,也就是說他是無狀態的.
4 可靠性保證: 一旦寫入操做被執行(做用到服務器),這個狀態將會被持久化,直到其餘客戶端的修改生效.
5 時間線特性:客戶端訪問服務器系統鏡像能在一個特定時間訪問內保證當前系統是實時更新的
zookeeper的設計原則之一就是提供簡單的編程接口. 所以,他僅僅提供瞭如下幾個操做.
zookeeper的編程接口 設計的很是簡單,可是用這些能實現一些其餘更高級別的操做,好比同步原語,對成員進行分組和選舉等等.
zookeeper 被設計的號稱高性能框架,可是事實狀況如何呢?
來自雅虎的zookeeper開發團隊的研究證實了這點.
(能夠查看下zookeeper 吞吐量隨着讀寫比例變化的圖表,即上圖)
在讀佔主要比例的應用中,性能尤佳,由於寫操做涉及到服務器之間狀態的同步.尤爲是在協調服務這個典型案例中表現的尤爲突出.
zookeeper 吞吐量和讀寫比例的變化關係用的是zookeeper3.2版本,運行在 雙核 2Ghz 及SATA 15k RPM 處理器配置的服務器中.
其中一個負責zookeeper 日誌設備. 快照信息寫入操做系統驅動中.
寫入請求是1Kb寫入, 讀請求也是1kb的寫入(讀寫單元都是1Kb).
servers 標示着 整個zookeeper的集羣大小, 即組成zookeeper服務的服務器數.
爲了展現下,咱們系統隨着時間的推移及錯誤出現,咱們運行了一個一個由7個機器組成的zookeeper服務中,咱們使用和此前同樣飽和度的基準測試,
這個圖中有幾個比較關鍵的觀測點.首先,若是從節點失敗並快速恢復了,即便從節點失敗了,zookeeper仍然可以承受住一個比較高的吞吐量.
可是,更爲重要的一點事,leader節點的選舉算法 能讓系統快速恢復,防止吞吐量在短期內迅速下降.觀察發現, zookeeper能在200毫秒內選舉出新的leader節點,
zookeeper 已經在許多企業級應用中得到成功,雅虎內部使用zookeeper 進行協調和失敗恢復服務,及消息中間人服務
他管理成千上萬個消息主題,能夠實現副本和數據傳輸的功能.
zookeeper在雅虎內部還用於數據抓取服務,即網絡爬蟲,同時致力於失敗恢復.