首先能夠從Zookeeper Release這裏下載你須要的版本。html
Zookeeper的運行是比較簡單的,由於Zookeeper已經提供了相應的在Windows和Linux下啓動的腳本。java
下載下來以後,首先解壓到你想要的目錄。解壓以後的(Windows)目錄以下:node
圖1:Zookeeper目錄apache
而後能夠進入conf目錄下,能夠看到一個zoo_sample.cfg的文件。能夠拷貝該文件命名爲zoo.cfg這個是Zookeeper啓動時默認讀取的配置文件。服務器
能夠看到配置文件中已經有幾個參數以下:分佈式
#tickTime就是心跳時間,單位是毫秒。進一步說就是Zookeeper的客服端和服務器端通訊是#基於TCP長鏈接的, #爲了確認Zookeeper客服端還活着每隔tickTime時間長度 #Zookeeper服務器端就發送一個心跳包來檢查客戶端的狀態 tickTime=2000 #dataDir主要就是用來存放Zookeeper的數據快照和更新日誌的 #快照就是Zookeeper在運行時的內存中的數據拷貝,Zookeeper會對所用的 #跟新操做都記錄其日誌,日誌的文件就放在dataDir所指的目錄下 #值得注意的是dataDir所指定的目錄必定要是存在的,若是不存在Zookeeper服務器則啓動不了 dataDir=/tmp/zookeeper #clientPort就是Zookeeper可客服端通訊所使用的端口 clientPort=2181
上面三個是Zookeeper最基本的配置,每個Zookeeper服務器都應該有。至於initTime和syncLimit兩個參數是使用Zookeeper集羣的時候纔會使用。在後面的集羣配置時在詳細介紹。spa
配置後上面的三個參數以後就能夠啓動Zookeeper服務了。在Zookeeper的bin目錄下能夠看到有一些啓動相關的腳本,以下圖所示:日誌
圖2:Zookeeper啓動腳本code
後綴是.sh的是Linux的腳本。這裏使用Windows的腳本。首先啓動Zookeeper服務器端,直接雙擊zkServerNaNd就能夠了。若是沒有出錯,就會以下圖三所示的界面。server
圖3:Zookeeper服務端啓動
圖4:Zookeeper客戶端啓動
而後啓動Zookeeper客戶端。一樣只須要雙擊zkCliNaNd就能夠了,若是沒有出現錯誤就會出現如上圖4所示的命令窗口。接下來就能夠利用Zookeeper提供的客戶端作一些增刪改的操做。
在介紹Zookeeper的使用以前,先來了解一下Zookeeper的用途。Zookeeper是一個高可靠的分佈式協做服務。這個介紹太抽象了,至少對於當初沒有什麼經驗的我是如此。我看了n次也沒有弄明白是什麼意思,因此有時候方向是很是重要的因素,沒有相關的基礎背景知識在努力也沒有什麼效率。
咱們先來假設一個場景,咱們有不少的服務,這些服務是分佈式的。若是服務和分佈式這個概念仍是比較抽象。咱們在細化一些,如今有不少臺機器,每一臺機器上有一些配置文件,每一臺機器上有一些應用要共享這些配置文件,這些應用可能會對本身和其餘機器上的這些配置文件執行讀取、修改、添加和刪除等操做。
進一步的思考着中間涉及到的操做,首先不一樣機器之間的通訊,須要監聽不一樣機器的配置文件的數據變化,須要對操做進行同步等等。假設咱們有n臺機器,這樣每一臺機器就要和其餘的n-1臺機器通訊,代價是至關昂貴的。
轉換一下思路,想想觀察者模式。因而咱們用一臺機器來做爲中心統一管理這些配置文件假設咱們把這個中心叫作註冊中心。這樣就從不一樣機器之間的相互通訊,轉換爲了所用的機器和註冊中心的通訊。那麼問題來了當隨着機器的增多,註冊中心的壓力會也來也大。而且註冊中心可能出現故障。因而咱們須要集羣,讓多臺機器組成有一個註冊中心。可是集羣之間要對所用機器提供一致的服務。數據的一致性怎麼解決。若是本身解決這些問題的話,有太多的難點了,並且很是容易出錯。例如爲了所用的機器讀到的配置文件都是一致的,就要解決不一樣註冊中心上的配置文件的同步問題。要對註冊中心配置進行修改就要考慮到鎖的問題,由於是集羣。就要考慮分佈式鎖的問題。
Zookeeper就解決了這些問題,Zookeeper對數據進行了抽象。Zookeeper的數據組織是一個樹結構,每個節點是一個Znode。咱們只須要對咱們關心的Znode進行操做就能夠了。其餘的事情Zookeeper都幫助咱們處理好了。
下面咱們來使用Zookeeper提供給咱們的客戶端來作一些簡單的操做,能夠直接是用戶help來查看有哪一些命令:
圖5:Zookeeper help
ls / #查看有哪些節點 create /test create #建立一個名字爲test數據爲create的節點 get /test #獲取名字爲test的節點 set /test update #把名字爲test的節點的數據改成 update delete /test #刪除名字爲test的節點
Zookeeper集羣就是爲了解決鏈接到Zookeeper的機器太多,Zookeeper服務器壓力太多的問題。Zookeeper集羣仍是對外提供一致的服務。因此對於客戶端是沒有太大的區別的,至於不一樣機器的數據的一致性等問題這是Zookeeper解決的。
下面就簡單的介紹一些Zookeeper的僞集羣的配置,首先是上面提到過的intiTime和synLimit:
#initTime 就是集羣中的Leader與Follower直接的心跳時間,這個和集羣的管理相關的 #syncLimi是Leader和Follower直接發送信息的最大時間長度,注意initTime和syncLimit #都是tickTime的倍數。例如initLimit=5 ,那麼intiLimit的值就是5給tickTime的時間 initLimit=10 syncLimit=5 而後就是每一臺服務器的一些信息: #其中server.x x就是爲了標識每一臺服務器的id。而後是該服務器對應的ip地址,以後是 #zookeeper服務器 Leader與Follower之間通訊的端口 #最後是從新選取Leader的端口server.1=127.0.0.1:8881:7771 server.2=127.0.0.1:8882:7772 server.3=127.0.0.1:8883:7773
配置集羣還有很重要的一點就是要在所配置的dataDir目錄下創建一個myid的文件裏面放上該服務器的id就是配置文件server.x對應的x的值。
咱們把Zookeeper拷貝三份以下圖所示:
圖6:Zookeeper僞集羣
而後三個Zookeeper鐘的配置分別對應爲:
zk1: tickTime=2000 dataDir=D:/zookeeper/data/zk1 clientPort=2181 initLimit=10 syncLimit=5 server.1=127.0.0.1:8881:7771 server.2=127.0.0.1:8882:7772 server.3=127.0.0.1:8883:7773
zk2: tickTime=2000 dataDir=D:/zookeeper/data/zk2 clientPort=2182 initLimit=10 syncLimit=5 server.1=127.0.0.1:8881:7771 server.2=127.0.0.1:8882:7772 server.3=127.0.0.1:8883:7773
zk3: tickTime=2000 dataDir=D:/zookeeper/data/zk3 clientPort=2183 initLimit=10 syncLimit=5 server.1=127.0.0.1:8881:7771 server.2=127.0.0.1:8882:7772 server.3=127.0.0.1:8883:7773
注意由於這裏配置的是在一臺機器上的僞集羣,因此所用的端口號纔不一致,在真正的集羣中最好吧這些端口號配爲一致,方便管理。
接下來要作的事情就是啓動對應機器的啓動腳本就能夠了,Zookeeper集羣對於客戶端是透明的,若是在java程序中使用的能夠利用Zookeeper提供的zookeeper.jar包來連接Zookeeper服務器。
參考:
http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html
http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html