想必大家都對(duì)分布式系統(tǒng)有所耳聞,大部分人對(duì)分布式都能侃侃而談,但到了真正實(shí)施的時(shí)候,才發(fā)現(xiàn)其中的不易。今天帶大家一起了解一款開源軟件,ZooKeeper。它通過一些簡(jiǎn)單好用的API,來解決分布式系統(tǒng)設(shè)計(jì)與開發(fā)中的難點(diǎn)。

這篇文章主要從下幾個(gè)部分介紹:
- 什么是分布式系統(tǒng)和它的特性
- 分布式系統(tǒng)難在哪里
- ZooKeeper簡(jiǎn)介
- 下載安裝ZooKeeper
- 客戶端操作ZooKeeper
- ZooKeeper集群配置
分布式系統(tǒng)定義
A distributed system is de ned as a software system that is composed of independent computing entities linked together by a computer network whose components communicate and coordinate with each other to achieve a common goal.
分布式系統(tǒng)是由獨(dú)立的計(jì)算機(jī)通過網(wǎng)絡(luò)連接在一起,并且通過一些組件來相互交流和協(xié)作來完成一個(gè)共同的目標(biāo)。
想要更好的判斷是否為好的分布式系統(tǒng),可以看這些特性:
- 資源共享,例如存儲(chǔ)空間,計(jì)算能力,數(shù)據(jù),和服務(wù)等等
- 擴(kuò)展性,從軟件和硬件上增加系統(tǒng)的規(guī)模
- 并發(fā)性 多個(gè)用戶同時(shí)訪問
- 性能 確保當(dāng)負(fù)載增加的時(shí)候,系統(tǒng)想要時(shí)間不會(huì)有影響
- 容錯(cuò)性 盡管一些組件暫時(shí)不可用了,整個(gè)系統(tǒng)仍然是可用的
- API抽象 系統(tǒng)的獨(dú)立組件對(duì)用戶隱藏,僅僅暴露服務(wù)
有了ZooKeeper,開發(fā)者可以很輕松的實(shí)現(xiàn):
- 配置管理
- 命名服務(wù)
- 分布式鎖
- 集群關(guān)系操作,檢測(cè)節(jié)點(diǎn)的加入和離開
分布式系統(tǒng)的難點(diǎn)
可以想象,假如一臺(tái)計(jì)算機(jī)的出錯(cuò)概率為0.1%,那么1000臺(tái)服務(wù)器的出錯(cuò)概率呢?一旦計(jì)算機(jī)的數(shù)量增多,出錯(cuò)的概率就大大的增加。
多個(gè)相互獨(dú)立的計(jì)算機(jī),假設(shè)集群的配置信息在某個(gè)Master節(jié)點(diǎn)上,其余的節(jié)點(diǎn)從Master節(jié)點(diǎn)下載配置信息。假如Master節(jié)點(diǎn)掛了呢?假設(shè)Master節(jié)點(diǎn)是故障冗余的,但是配置信息是動(dòng)態(tài)的傳遞給所有的其余節(jié)點(diǎn)的,而不是直接傳過去。所有節(jié)點(diǎn)之間的信息如何保證一致呢?
服務(wù)發(fā)現(xiàn)的問題,為了增加系統(tǒng)的可靠性,我們一般會(huì)在系統(tǒng)中增加更多的服務(wù)器。讓其它機(jī)器知道新加入的節(jié)點(diǎn)在集群中的關(guān)系和服務(wù),這個(gè)設(shè)計(jì)也需要非常周到的考慮
機(jī)器數(shù)目眾多,更容易出現(xiàn) 機(jī)器故障,軟件崩潰,網(wǎng)絡(luò)延遲,拓?fù)涓淖兊鹊?,而這些類型的錯(cuò)誤沒有規(guī)律可循,因此在分布式系統(tǒng),想實(shí)現(xiàn)高容錯(cuò)性是很難的。
當(dāng)然了..ZooKeeper被設(shè)計(jì)出來的目的就是解決這種類型的問題.
ZooKeeper介紹
zookeeper實(shí)際上是yahoo開發(fā)的,用于分布式中一致性處理的框架。最初其作為研發(fā)Hadoop時(shí)的副產(chǎn)品。由于分布式系統(tǒng)中一致性處理較為困難,其他的分布式系統(tǒng)沒有必要費(fèi)勁重復(fù)造輪子,故隨后的分布式系統(tǒng)中大量應(yīng)用了zookeeper,以至于zookeeper成為了各種分布式系統(tǒng)的基礎(chǔ)組件,其地位之重要,可想而知。著名的hadoop、kafka、dubbo 都是基于zookeeper而構(gòu)建。
安裝ZooKeeper
有關(guān)分布式的理論也很重要,我們放到下此再講,首先有一個(gè)可以運(yùn)行的Demo,在看理論的時(shí)候才更明白是怎么回事,因?yàn)閆ooKeeper的簡(jiǎn)單易用,幾分鐘內(nèi)就可以做出一個(gè)小demo。
從ZooKeeper官網(wǎng)下載
下載地址:https://archive.apache.org/dist/zookeeper/解壓配置
tar -xf /usr/local/src/zookeeper-3.4.9.tar.gz -C /usr/local/src/
ln -sv /usr/local/src/zookeeper-3.4.9/ /usr/local/zookeeper
cd /usr/local/zookeeper/
- 配置ZooKeeper
vim zoo.cfg
# zoo.cfg文件中內(nèi)容如下
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
- tickTime 單位為微秒,用于session注冊(cè)和客戶端和ZooKeeper服務(wù)的心跳周期。session超時(shí)時(shí)長(zhǎng)最小為 tickTime的兩倍
- dataDir ZooKeeper的狀態(tài)存儲(chǔ)位置,看名字就知道書數(shù)據(jù)目錄。在你的系統(tǒng)中檢查這個(gè)目錄是否存在,如果不存在手動(dòng)創(chuàng)建,并且給予可寫權(quán)限。
- clientPort 客戶端連接的端口。不同的服務(wù)器可以設(shè)置不同的監(jiān)聽端口,默認(rèn)是2181
- 啟動(dòng)ZooKeeper
# 這里命令寫的長(zhǎng)是為了便于知道ZooKeeper是如何使用配置文件的。
/usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zoo.cfg
# 查看ZooKeeper是否運(yùn)行
ps –ef | grep zookeeper
# 也可以使用jps ,可以看到j(luò)ava進(jìn)程中有QuorumPeerMain列出來。
# 查看ZooKeeper的狀態(tài)
zkServer.sh status
# 常用的ZooKeeper用法,這個(gè)屬于Linux基礎(chǔ)的部分,就不過多說明了
./zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
- 使用zkCli連接ZooKeeper
/usr/local/zookeeper/bin/zkCli.sh -server localhost:2181
連接成功后可以使用如下命令:

ZooKeeper集群配置
ZooKeeper的集群相對(duì)比較簡(jiǎn)單,這里不涉及過多的篇幅,但會(huì)列出大概的步驟。
- 創(chuàng)建配置文件
cd /usr/local/zookeeper
touch zoo1.cfg zoo2.cfg zoo3.cfg

注意 端口不要沖突,dataDir不要相同
- 配置數(shù)據(jù)目錄與數(shù)據(jù)存放目錄內(nèi)容
cd /tmp/zookeeper
mkdir {zoo1,zoo2,zoo3}
echo 1 > zoo1/myid
echo 2 > zoo2/myid
echo 3 > zoo3/myid
這里的myid文件中一定要對(duì)應(yīng)上面配置文件中server.[id]的數(shù)字,不然ZooKeeper啟動(dòng)會(huì)出錯(cuò)。
- 啟動(dòng)ZooKeeper
zkServer.sh start /usr/local/zookeeper/conf/zoo1.cfg
zkServer.sh start /usr/local/zookeeper/conf/zoo2.cfg
zkServer.sh start /usr/local/zookeeper/conf/zoo3.cfg
- 查看效果
使用ps -ef | grep zoo可以看到有三個(gè)zookeeper啟動(dòng)起來了。
連接ZooKeeper
# 192.168.8.250是ZooKeeper服務(wù)器的地址
zkCli.sh -server 192.168.8.250:2181,192.168.8.250:2182,192.168.8.250:2183

可以看到連接成功,也就是集群配置成功了。
最后
這篇文章,主要介紹了一下什么是分布式系統(tǒng)和分布式系統(tǒng)的的基本特性,然后又做了ZooKeeper的簡(jiǎn)單Demo,希望幫助大家入門ZooKeeper。
參考
- 《Apache ZooKeeper Essentials》
- ZooKeeper入門系列-概述