ZooKeeper是一個開放源代碼的分布式協調服務。ZooKeeper的設計目標是將那些復雜且容易出錯的分布式一致性服務封裝起來,構成一個高效可靠的原語集,并以一系列簡單易用的接口提供給用戶使用。
ZooKeeper是一個典型的分布式數據一致性的解決方案,分布式應用程序可以基于它實現諸如數據發布/訂閱、負載均衡、命名服務、分布式協調/通知、集群管理、Master選舉、分布式鎖和分布式隊列等功能。ZooKeeper可以保證如下分布式一致性特性。
(1)順序一致性
從同一個客戶端發起的事務請求,最終將會嚴格地按照其發起順序被應用到ZooKeeper中去。
(2)原子性
所有事務請求的處理結果在整個集群中所有機器.上的應用情況是一致的,也就是說,要么整個集群所有機器都成功應用了某一個事務,要么都沒有應用,一定不會出現集群中部分機器應用了該事務,而另外一部分沒有應用的情況。
(3)單一視圖( Single System Image )
無論客戶端連接的是哪個ZooKeeper服務器,其看到的服務端數據模型都是一致的。
(4)可靠性
一旦服務端成功地應用了一個事務,并完成對客戶端的響應,那么該事務所引起的服務端狀態變更將會被一直保留下來,除非有另一個事務又對其進行了變更。
(5)實時性
通常人們看到實時性的第一反應是,一旦一個事務被成功應用,那么客戶端能夠立即從服務端上讀取到這個事務變更后的最新數據狀態。這里需要注意的是,ZooKeeper僅僅保證在一定的時間段內,客戶端最終一定能夠從服務端上讀取到最新的數據狀態。
ZooKeeper的設計目標
ZooKeeper致力于提供一個高性能、高可用,且具有嚴格的順序訪問控制能力(主要是寫操作的嚴格順序性)的分布式協調服務。高性能使得ZooKeeper能夠應用于那些對系統吞吐有明確要求的大型分布式系統中,高可用使得分布式的單點問題得到了很好的解決,而嚴格的順序訪問控制使得客戶端能夠基于ZooKeeper實現一些復雜的同步原語。
下面我們來具體看一下ZooKeeper的四個設計目標。
目標一:簡單的數據模型
ZooKeeper使得分布式程序能夠通過一個共享的、樹型結構的名字空間來進行相互協調。這里所說的樹型結構的名字空間,是指ZooKeeper服務器內存中的一個數據模型,其由一系列被稱為ZNode的數據節點組成,總的來說,其數據模型類似于一個文件系統,而ZNode之間的層級關系,就像文件系統的目錄結構一樣。不過和傳統的磁盤文件系統不同的是,ZooKeeper將全量數據存儲在內存中,以此來實現提高服務器吞吐、減少延遲的目的。
目標二:可以構建集群
一個ZooKeeper集群通常由一組機器組成,一般3至5臺機器就可以組成一個可用的
ZooKeeper集群了。
組成ZooKeeper集群的每臺機器都會在內存中維護當前的服務器狀態,并且每臺機器之間都互相保持著通信。值得一提的是,只要集群中存在超過一半的機器能夠正常工作,那么整個集群就能夠正常對外服務。
ZooKeeper的客戶端程序會選擇和集群中任意一臺機器共同來創建一個TCP連接,而一旦客戶端和某臺ZooKeeper服務器之間的連接斷開后,客戶端會自動連接到集群中的其他機器。
目標三:順序訪問
對于來自客戶端的每個更新請求,ZooKeeper都會分配一個全局唯一的遞增編號,這個編號反映了所有事務操作的先后順序,應用程序可以使用ZooKeeper的這個特性來實現更高層次的同步原語。
目標四:高性能
由于ZooKeeper將全量數據存儲在內存中,并直接服務于客戶端的所有非事務請求,因此它尤其適用于以讀操作為主的應用場景。