一.概述
ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。
ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。
ZooKeeper包含一個簡單的原語集,提供Java和C的接口。
ZooKeeper代碼版本中,提供了分佈式獨享鎖、選舉、隊列的接口,代碼在$zookeeper_home\src\recipes。其中分佈鎖和隊列有Java和C兩個版本,選舉只有Java版本。
二.原理
ZooKeeper是以Fast Paxos算法爲基礎的,Paxos 算法存在活鎖的問題,即當有多個proposer交錯提交時,有可能互相排斥導致沒有一個proposer能提交成功,而Fast Paxos作了一些優化,通過選舉產生一個leader (領導者),只有leader才能提交proposer,具體算法可見Fast Paxos。因此,要想弄懂ZooKeeper首先得對Fast Paxos有所瞭解。
ZooKeeper的基本運轉流程:
1、選舉Leader。
2、同步數據。
3、選舉Leader過程中算法有很多,但要達到的選舉標準是一致的。
4、Leader要具有最高的執行ID,類似root權限。
5、集羣中大多數的機器得到響應並接受選出的Leader。
三.特點
在Zookeeper中,znode是一個跟Unix文件系統路徑相似的節點,可以往這個節點存儲或獲取數據。如果在創建znode時Flag設置爲EPHEMERAL,那麼當創建這個znode的節點和Zookeeper失去連接後,這個znode將不再存在在Zookeeper裏,Zookeeper使用Watcher察覺事件信息。當客戶端接收到事件信息,比如連接超時、節點數據改變、子節點改變,可以調用相應的行爲來處理數據。Zookeeper的Wiki頁面展示瞭如何使用Zookeeper來處理事件通知,隊列,優先隊列,鎖,共享鎖,可撤銷的共享鎖,兩階段提交。
四.安裝
下載地址:http://mirror.bit.edu.cn/apache/zookeeper/
下載完成後解壓到指定目錄(我是解壓到:D:\zookeeper),如下圖所示:
解壓完畢後還需要簡單修改一下配置才能啓動,具體配置如下:
- 在conf下修改zoo_sample.cfg 文件名爲 zoo.cfg
- tickTime=2000
- initLimit=10
- syncLimit=5
- dataDir=D:\\zookeeper\\data
- dataLogDir=D:\\zookeeper\\log
- clientPort=2181
名詞解釋:
1、tickTime:這個時間是Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,每隔 tickTime 時間就會發送一個心跳。
2、dataDir:Zookeeper 保存數據的目錄,默認情況下Zookeeper 將寫數據的日誌文件也保存在這個目錄裏。
3、dataLogDir:Zookeeper 保存日誌文件的目錄
4、clientPort:客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。
五.啓動
進入到bin目錄,並且啓動zkServer.cmd,這個腳本中會啓動一個java進程,如下圖所示:
簡單測試一下,在bin目錄下找到zkCli.cmd客戶端點擊啓動,如下圖所示:
像這樣就算安裝啓動成功了,是不是很簡單,快去試試吧。
六.注意事項
在啓動ZooKeeper時,會有窗口一閃而過的情況,出現這種情況的原因如下:
1.可能是jdk環境變量有空格或者沒配置jdk環境變量
2.可能是zk的dataDir路徑不對或者沒配置dataDir路徑