環境:centos7 、JDK8apache
1、Zookeeper原理簡介vim
ZooKeeper是一個開放源碼的分佈式應用程序協調服務,它包含一個簡單的原語集,分佈式應用程序能夠基於它實現同步服務,配置維護和命名服務等。centos
Zookeeper設計目的服務器
Zookeeper工做原理網絡
一、在zookeeper的集羣中,各個節點共有下面3種角色和4種狀態:分佈式
角色:leader,follower,observer
狀態:leading,following,observing,looking性能
Zookeeper的核心是原子廣播,這個機制保證了各個Server之間的同步。實現這個機制的協議叫作Zab協議(ZooKeeper Atomic Broadcast protocol)。Zab協議有兩種模式,它們分別是恢復模式(Recovery選主)和廣播模式(Broadcast同步)。當服務啓動或者在領導者崩潰後,Zab就進入了恢復模式,當領導者被選舉出來,且大多數Server完成了和leader的狀態同步之後,恢復模式就結束了。狀態同步保證了leader和Server具備相同的系統狀態。centos7
爲了保證事務的順序一致性,zookeeper採用了遞增的事務id號(zxid)來標識事務。全部的提議(proposal)都在被提出的時候加上了zxid。實現中zxid是一個64位的數字,它高32位是epoch用來標識leader關係是否改變,每次一個leader被選出來,它都會有一個新的epoch,標識當前屬於那個leader的統治時期。低32位用於遞增計數。設計
每一個Server在工做過程當中有4種狀態:server
LOOKING:當前Server不知道leader是誰,正在搜尋。
LEADING:當前Server即爲選舉出來的leader。
FOLLOWING:leader已經選舉出來,當前Server與之同步。
OBSERVING:observer的行爲在大多數狀況下與follower徹底一致,可是他們不參加選舉和投票,而僅僅接受(observing)選舉和投票的結果。
Zookeeper集羣節點
搭建流程
1.Zookeeper的下載與解壓
經過後面的連接下載Zookeeper: Zookeeper下載
在此咱們下載zookeeper-3.4.8
下載後解壓至安裝目錄下,本文咱們解壓到目錄:/opt/zookeeper-3.4.8
$:tar -xzvf zookeeper-3.4.8.tar.gz -C /opt/
以下圖所示:
2.zookeeper的環境變量的配置:
爲了從此操做方便,咱們須要對Zookeeper的環境變量進行配置,方法以下:
在/etc/profile文件中加入以下的內容:
#set zookeeper environment export ZOOKEEPER_HOME=/opt/zookeeper-3.4.8 export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf
而後 source /etc/profile 刷新一下配置
-----------------------------------------------------------------------------------------------------------------------------------------
3.集羣部署:
在Zookeeper集羣環境下只要一半以上的機器正常啓動了,那麼Zookeeper服務將是可用的。所以,集羣上部署Zookeeper最好使用奇數臺機器,這樣若是有5臺機器,只要3臺正常工做則服務將正常使用。
下面咱們將對Zookeeper的配置文件的參數進行設置:
進入zookeeper-3.4.8/conf:
$:cp zoo_sample.cfg zoo.cfg $:vim zoo.cfg
可參考以下配置:
tickTime=2000 initLimit=10 syncLimit=5 dataLogDir=/opt/zookeeper-3.4.8/logs dataDir=/opt/zookeeper-3.4.8/data clientPort=2181 autopurge.snapRetainCount=500 autopurge.purgeInterval=24 server.1= master:2888:3888 server.2= slave1:2888:3888 server.3= slave2:2888:3888
#建立相關目錄,三臺節點都須要
mkdir -p /opt/zookeeper/{logs,data}
#其他zookeeper節點安裝完成以後,同步配置文件zoo.cfg。
注意上圖的配置中master,slave1,slave2分別爲主機名。
須要配置相應的hosts
192.168.1.213 master 192.168.1.216 slave1 192.168.1.217 slave2
在上面的配置文件中"server.id=host:port:port"中的第一個port是從機器(follower)鏈接到主機器(leader)的端口號,第二個port是進行leadership選舉的端口號。
4.遠程複製分發安裝文件
接下來將上面的安裝文件拷貝到集羣中的其餘機器上對應的目錄下:
root@master:~/zookeeper-3.4.8$ scp -r zookeeper-3.4.8/ slave1:/opt/zookeeper-3.4.8 root@master:~/zookeeper-3.4.8$ scp -r zookeeper-3.4.8/ slave2:/opt/zookeeper-3.4.8
拷貝完成後,在每臺機器上zoo.cfg指定的dataDir文件下添加myid文件,內容只有簡單的一行,爲對應的id號。例如修改slave1中的id以下:
root@slave1:~/opt/zookeeper-3.4.8$ echo "2" >/tmp/zookeeper-3.4.8/data/myid
5.啓動ZooKeeper集羣
在ZooKeeper集羣的每一個結點上,執行啓動ZooKeeper服務的腳本,以下所示:
haduser@master:~/opt/zookeeper-3.4.8$ bin/zkServer.sh start haduser@slave1:~/opt/zookeeper-3.4.8$ bin/zkServer.sh start haduser@slave2:~/opt/zookeeper-3.4.8$ bin/zkServer.sh start
以下圖所示:
其中,QuorumPeerMain是zookeeper進程,啓動正常。
如上依次啓動了全部機器上的Zookeeper以後能夠經過ZooKeeper的腳原本查看啓動狀態
bin/zkServer.sh status
包括集羣中各個結點的角色(或是Leader,或是Follower),以下所示,是在ZooKeeper集羣中的每一個結點上查詢的結果:
經過上面狀態查詢結果可見,slave1是集羣的Leader,其他的兩個結點是Follower。
另外,能夠經過客戶端腳本,鏈接到ZooKeeper集羣上。對於客戶端來講,ZooKeeper是一個總體(ensemble),鏈接到ZooKeeper集羣實際上感受在獨享整個集羣的服務,因此,你能夠在任何一個結點上創建到服務集羣的鏈接,例如:
6.中止zookeeper進程:zookeeper-3.4.3/bin/zkServer.sh stop