ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。其部署方式有單機部署和集羣部署,單機部署意義不大,下面主要介紹集羣部署。html
因硬件環境的限制,本次搭建Zookeeper集羣是在Windows且是單機的環境下搭建的,也就是僞集羣;不過僞集羣跟集羣區別不大,往下看就知道啦。node
1、去Zookeeper官網http://zookeeper.apache.org/把安裝包下載下來,給個3.4.10版本的連接:http://mirrors.hust.edu.cn/apache/zookeeper/stable/zookeeper-3.4.10.tar.gz。解壓縮安裝包。linux
二,在單機環境下部署集羣。算法
一、 準備節點。弄三個zookeeper節點,將安裝包拷貝三份,分別命名爲zookeeper-3.4.10_1,zookeeper-3.4.10_2,zookeeper-3.4.10_3。以下圖:apache
二、修改zoo.cfg配置文件。以zookeeper-3.4.10_1節點爲例,在conf文件夾下,將zoo_sample.cfg重命名爲zoo.cfg,同時增長如下配置信息:windows
tickTime=2000
initLimit=5
syncLimit=2
dataDir=E:\\zookeeper-3.4.10_1\\server1\\data
dataLogDir=E:\\zookeeper-3.4.10_1\\server1\\dataLog
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890服務器
標紅的幾個配置官網講得很清楚了,就不作講解了。須要注意的是clientPort這個端口,若是你是在1臺機器上部署多個server,那麼每臺機器都要不一樣的clientPort,好比我server1是2181,server2是2182,server3是2183,dataDir和dataLogDir也須要區分下,session
dataDir和dataLogDir這兩個目錄須要咱們手動建立 。
最後幾行惟一須要注意的地方就是 server.X 這個數字就是對應 data/myid中的數字。你在3個server的myid文件中分別寫入了1,2,3,那麼每一個server中的zoo.cfg都配server.1,server.2,server.3就OK了。由於在同一臺機器上,後面連着的2個端口3個server都不要 同樣,不然端口衝突,其中第一個端口用來集羣成員的信息交換,第二個端口是在leader掛掉時專門用來進行選舉leader所用。數據結構
若是將集羣的每一個節點佈置到不一樣的機器上的話,那麼全部節點的配置文件都是同樣的,這也就是僞集羣跟集羣的區別所在。下面給出配置信息:分佈式
tickTime=2000
initLimit=5
syncLimit=2
dataDir=E:\\zookeeper-3.4.10\\server\\data
dataLogDir=E:\\zookeeper-3.4.10\\server\\dataLog
clientPort=2181
server.1=192.168.10.8:2888:3888
server.2=192.168.10.15:2888:3888
server.3=192.168.10.22:2888:3888
注意:dataDir和dataLogDir的路徑要用\\分隔,要否則啓動的時候會報錯
三、啓動Zookeeper。進入到bin目錄下,點擊 zkServer.cmd命令或者經過cmd命令行方式來運行這個命令(這樣最好,啓動報錯了能看到),便可完成啓動。
啓動過程當中若是報 「$dataDir/myid file is missing」 錯誤,是由於沒有在dataDir目錄下建立myid文件致使的,zk集羣中的節點須要獲取myid文件內容來標識該節點,缺失則沒法啓動;往myid裏面寫的數字也就是配置文件zoo.cfg裏 server.1=192.168.10.8:2888:3888,server後面這個數字。
若是報Connection refused 連接類的錯誤的話不用管,這是zookeeper節點試圖連接其餘節點報的錯誤,等全部節點都啓動完畢就不會報錯了。啓動順序若是是一、二、3的話,那麼2節點是Leader哈。關於Leader的選舉算法你們去好好研究一下,後續我再出博文。
注意:這個myid文件是不帶任何擴展類型的文件,在windows下建立的文本文件,須要手動將擴展類型去掉,要否則啓動也會報上面那個錯誤。
三,Zookeeper數據模型。
Zookeeper 會維護一個具備層次關係的數據結構,它很是相似於一個標準的文件系統,以下圖所示
(1) 每一個節點在zookeeper中叫作znode,而且其有一個惟一的路徑標識,如/SERVER2節點的標識就爲/APP3/SERVER2
(2) Znode 能夠有子znode,而且znode裏能夠存數據,可是EPHEMERAL類型的節點不能有子節點
(3) Znode中的數據能夠有多個版本,好比某一個路徑下存有多個數據版本,那麼查詢這個路徑下的數據就須要帶上版本。
(4) znode 能夠是臨時節點,一旦建立這個 znode 的客戶端與服務器失去聯繫,這個 znode 也將自動刪除,Zookeeper 的客戶端和服務器通訊採用長鏈接方式,每一個客戶端和 服務器經過心跳來保持鏈接,這個鏈接狀態稱爲 session,若是 znode 是臨時節點這個 session 失效,znode 也就刪除了
(5) znode 的目錄名能夠自動編號,如 App1 已經存在,再建立的話,將會自動命名爲 App2
(6) znode 能夠被監控,包括這個目錄節點中存儲的數據的修改,子節點目錄的變化等,一旦變化能夠通知設置監控的客戶端,這個功能是zookeeper對於應用最重要的特性,經過這個特性能夠實現的功能包括配置的集中管理,集羣管理,分佈式鎖等等。
下面咱們經過zookeeper自帶的客戶端交互程序來建立、修改、刪除節點來探索zookeeper的數據結構。
進入任意一臺zookeeper節點,到bin目錄下,運行zkCli.cmd命令。出現以下圖界面:
一、ls path [watch]查看命令。 ls /
有兩個節點zookeeper,APP1
二、get path [watch]查看節點數據命令。get /APP1
三、create [-s] [-e] path data acl 建立節點命令
四、delete path [version] 刪除節點命令
注意:zookeeper集羣全部節點的數據都是一致的,若是在這個節點建立的znode在其餘節點一樣也會建立,由於zookeeper的數據是一致性的,原理請自行百度zookeeper運行原理。
4、經過Zookeeper四字命令來獲取集羣服務的當前狀態及相關信息。
ZooKeeper支持某些特定的四字命令字母與其交互。它們大可能是查詢命令,用來獲取 ZooKeeper 服務的當前狀態及相關信息。用戶在客戶端能夠經過 telnet 或 nc 向 ZooKeeper 提交相應的命令。 其中stat、srvr、cons三個命令比較相似:"stat"提供服務器 統計和客戶端鏈接的通常信息;"srvr"只有服務的統計信息,"cons"提供客戶端鏈接的更加詳細的信息。 命令詳細介紹以下:
在windows下,咱們來演示一個命令吧,mntr命令。
一、打開cmd命令行模式
二、運行,telnet 127.0.0.1 2183
三、輸入:mntr命令
輸入的命令看不到,盡情輸入便可。
四、結果:
根據zk_server_state:leader 知道該節點爲Leader節點
注意:若是運行telnet 127.0.0.1 2183命令報「沒法打開主機的鏈接,在端口23鏈接失敗」錯誤的話,請將windows的telnet服務打開。打開方法請參考:http://jingyan.baidu.com/article/cdddd41c7dd85253ca00e14e.html
在linux下部署集羣跟windows部署步驟和操做都差很少,你們有機器的話能夠到linux環境下部署一下。