ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,它包含一個簡單的原語集,分佈式應用程序能夠基於它實現同步服務,配置維護和命名服務等。Zookeeper是hadoop的一個子項目,其發展歷程無需贅述。在分佈式應用中,因爲工程師不能很好地使用鎖機制,以及基於消息的協調機制不適合在某些應用中使用,所以須要有一種可靠的、可擴展的、分佈式的、可配置的協調機制來統一系統的狀態。Zookeeper的目的就在於此。html
通俗來說,ZooKeeper只是一個持久化存儲工具。這個存儲工提供了增刪改查之外的一些分佈式系統在進行通訊時須要的基礎特性,如具備父子關係的樹形數據節點,節點臨時性,節點順序性,節點修改事件的發佈訂閱,zk集羣高可用和強一致等等。這些特性就像是基礎的加減乘除,開發人員利用zk的這些基礎特性,與業務進行組合,能夠實現諸多分佈式系統須要的功能,如命名服務,分佈式鎖,分佈式服務的動態發佈的訂閱等等。所以,zk的應用場景是豐富的,在分佈式系統的業務開發過程當中,只要咱們有足夠的想象力,老是可以利用那些加減乘除構建出咱們須要的業務。因此說zk值得身到處處都是分佈式的互聯網時代的咱們學習和掌握。掌握zk是當代java開發同窗們必備的一個基礎技能,就像是mysql和redis同樣。
本文不會手把手教學zk的api,而是用一種俯視的姿態來理解zk。理解完了以後,寫代碼須要的就只有想象力和google了。真正作到了無招勝有招,不教api賽過教api。java
首先,zk服務端是純java實現,這一點就會讓諸多java開發同窗感到畏手畏腳,以爲zk的學習是否是要去瞅源碼啊,那豈不是很難。這種先入爲主的觀念是錯誤的。除非你想到zk項目倉庫提交代碼作貢獻,否則做爲單純使用者的你是不用去關注zk服務端的實現的。能夠類比mysql,mysqld是c語系的實現,那麼在平常工做使用中除了想要拔高學習,你有想過去看看它的源碼嗎?所以,和msyql同樣,zk服務端對於咱們普通開發人員來講實際上是透明的,咱們只須要在項目中集成zk的sdk也就是相似mysql 驅動,驅動利用傳輸層網絡協議與服務端通訊,而咱們就能夠利用驅動暴露的接口進行業務開發。
基於上面的假設,zk和mysql同樣,都是提供持久化存儲服務的工具,只是除了增刪改查外各自提供的特性不一樣。那麼接下來就很好理解了。python
zk的安裝運維不是本文的重點。這部份內容參考zookeeper安裝便可。本質上來講其實就是配置部署一個java應用,這個應用能夠集羣部署用來提升可用性。至於集羣間讀寫分離,數據同步等內容對於使用者來講是透明的,由zk集羣實例依照zab協議自動進行。其中的實例角色如領導者,觀察者,追隨者在集羣啓動過程當中自動選舉產生。如無絕對必要,那就讓子彈飛吧。mysql
和mysql同樣,zk的客戶端分爲兩個部分。一個是基於命令行的黑窗口。一個是zk鏈接驅動。zk是java實現,那麼zk命令行的啓動須要JRE。在zk的bin
目錄下,根據平臺執行cli
啓動腳本便可打開命令行客戶端,默認鏈接localhost。該客戶端有許多命令,同時支持自動補全。這部分通常在調試階段使用,用的也不多。詳細
除此以外,就是用於和本身的項目集成的zk 驅動了。和msyql同樣,雖然zk服務端是純java實現,可是zk驅動提供了多種語言的實現,如python,c,java等,能夠和多種語言生態的應用進行整合,利用tcp等傳輸層協議與服務端通訊,提供操做zk的接口。mysql也如此,給各個語言生態的應用提供了驅動,與服務端通訊,提供了操做mysql數據的接口。
本文主要講解zk在java生態中的使用。linux