本文包含兩個部分,首先是對zookeeper的一個簡單介紹,以後會描述zookeeper集羣搭建的詳細過程,爲之後的實驗作準備。linux
隨着業務規模發展得愈來愈大,將全部的業務單元所有放到一個計算實體上已經不能知足業務發展的要求。按照不一樣的業務領域或功能職責將整個系統拆分紅多個子系統,各個子系統經過網絡進行協做共同完成一項任務,這就是分佈式系統。
在分佈式系統中,一般將一個計算任務分解成多個計算單元並分派到多個計算機中,而後對各個計算結果進行彙總獲得最終結果。分佈式系統須要解決的核心任務是如何把衆多的計算機協同起來完成計算任務。若是多個計算機之間不能很好的協做,那麼即便增長再多的計算設備,也不會提升計算性能,還可能會產生錯誤的結果。zookeeper能夠幫助咱們解決分佈式系統中的協做問題。
zookeeper是源代碼開放的分佈式協調服務,是一個高性能的分佈式數據一致性解決方案。它將那些複雜的、容易出錯的分佈式一致性服務封裝起來。構成一個可靠的原語集,並提供一系列簡單易用的接口給用戶使用。
zookeeper能夠解決下面這些分佈式數據一致性問題:apache
咱們能夠經過調用zookeeper提供的接口解決分佈式中遇到的實際問題。如:服務器
下面我將藉助virtualbox虛擬機,在fedora linux平臺上搭建一個3節點的zk集羣,爲接下來的zookeeper學習作準備。點擊這裏下載zookeeper。
以下圖所示,我用virtualbox構建了三個fedora虛擬機,這三個虛擬機的ip分別是192.168.1.10七、192.168.1.108和192.168.1.109。
網絡
經過scp命令將下載好的zookeeper上傳到3個虛擬機服務器中:
分佈式
使用命令tar -zxvf zookeeper-3.3.6.tar.gz
解壓軟件,並用命令mv zookeeper-3.3.6 zookeeper
對解壓後的目錄從新命名。
工具
cd進入到zookeeper目錄下的conf目錄中,裏面包含了一個zookeeper的樣例配置文件——zoo_sample.cfg。不要直接修改zoo_sample.cfg的內容,在其基礎上拷貝一份新的文件zoo.cfg做爲zookeeper的配置文件。
性能
下面是zookeeper默認配置文件的內容:
學習
其中dataDir是zookeeper服務器存儲快照文件的目錄,clientPort是zookeeper服務器對外提供的端口號。其它配置項咱們後續再作解釋。
除了基本的配置項外,要配置zookeeper的集羣,還須要在配置文件中增長全部zk服務器節點的信息。zk服務器節點的配置項格式:server.id=host:aport:bport
。其中id是一個整數,表明一個zk服務器的id。host是zk服務器的ip地址。aport是follower服務器和leader服務器的通訊端口。bport是在選舉leader服務器投票過程當中的通訊端口。
我這裏配置的zk集羣共有3個節點,配置信息以下圖所示。其中三臺zk服務器的id分別是一、二、3,follower服務器和leader服務器的通訊端口是2888,選取leader服務器投票時使用的端口是3888。除了增長zk集羣的配置信息外,我還修改了dataDir配置項的目錄地址。
spa
完成上述配置以後還要到dataDir配置項指定的目錄中新建一個myid文件,myid文件的內容就是zk集羣配置中指定的服務器id。例如對於192.168.1.109這臺機器,它的id是1,那麼它的myid文件中的內容就是1。另外兩臺機器的myid文件內容分別是2和3。
code
如今就已經完成了一個zk集羣的全部配置,能夠啓動zk服務器了。使用zookeeper下bin目錄中的zkServer.sh腳本執行啓動命令。./zkServer.sh start
爲啓動zk服務器,./zkServer.sh stop
爲中止zk服務器。
爲了驗證zk集羣是否啓動成功,咱們能夠經過telnet這個工具進行驗證,使用它的stat命令能夠查看zk服務器的狀態。
從stat命令的輸出結果中能夠看出,這個zookeeper實例沒有對外提供服務。這是由於咱們的zk集羣中一共有3個節點,可是目前才只啓動了一個節點。如今咱們再啓動另一個zk節點看看執行結果。
我又啓動了另一個zk服務器,如今zk集羣中已經有2個存活的zk服務器節點了。能夠看到stat的輸出結果發生了變化,192.168.1.109這個zk節點已經能夠對外提供服務了。在一個zk集羣中,只要有超過一半的zk節點能夠正常工做,那麼整個集羣就能夠正常對外提供服務。由於咱們這個集羣一共有3臺機器,目前已經有2臺機器正常工做,已經超過了半數,因此整個集羣能夠正常對外提供服務。到此爲止,咱們就配置好了一個簡單的zk集羣。