Zookeeper 是 什 么?
(摘抄)有這樣一個(gè)場(chǎng)景:系統(tǒng)中有大約100w的用戶,每個(gè)用戶平 均有3個(gè)郵箱賬號(hào),每隔5分鐘,每個(gè)郵箱賬需要收取100封郵件,最多3億份郵件需要下載到服務(wù)器中(不含附件和正文)。用20臺(tái)機(jī)器劃分計(jì)算的壓力,從 多個(gè)不同的網(wǎng)路出口進(jìn)行訪問(wèn)外網(wǎng),計(jì)算的壓力得到緩解,那么每臺(tái)機(jī)器的計(jì)算壓力也不會(huì)很大了。
通過(guò)我們的討論和以往的經(jīng)驗(yàn)判斷在這場(chǎng)景中可以實(shí)現(xiàn)并行計(jì)算,但我們還期望能對(duì)并行計(jì)算的節(jié)點(diǎn)進(jìn)行動(dòng)態(tài)的添加/刪除,做到在線更新并行計(jì)算的數(shù)目并且不會(huì)影響計(jì)算單元中的其他計(jì)算節(jié)點(diǎn),但是有4個(gè)問(wèn)題需要解決,否則會(huì)出現(xiàn)一些嚴(yán)重的問(wèn)題:
- 20臺(tái)機(jī)器同時(shí)工作時(shí),有一臺(tái)機(jī)器down掉了,其他機(jī)器怎么進(jìn)行接管計(jì)算任務(wù),否則有些用戶的業(yè)務(wù)不會(huì)被處理,造成用戶服務(wù)終斷。
- 隨著用戶數(shù)量增加,添加機(jī)器是可以解決計(jì)算的瓶頸,但需要重啟所有計(jì)算節(jié)點(diǎn),如果需要,那么將會(huì)造成整個(gè)系統(tǒng)的不可用。
- 用戶數(shù)量增加或者減少,計(jì)算節(jié)點(diǎn)中的機(jī)器會(huì)出現(xiàn)有的機(jī)器資源使用率繁忙,有的卻空閑,因?yàn)橛?jì)算節(jié)點(diǎn)不知道彼此的運(yùn)行負(fù)載狀態(tài)。
- 怎么去通知每個(gè)節(jié)點(diǎn)彼此的負(fù)載狀態(tài),怎么保證通知每個(gè)計(jì)算節(jié)點(diǎn)方式的可靠性和實(shí)時(shí)性。
先不說(shuō)那么多專(zhuān)業(yè)名詞,白話來(lái)說(shuō)我們需要的是:1記錄狀態(tài),2事件通知 ,3可靠穩(wěn)定的中央調(diào)度器,4易上手、管理簡(jiǎn)單。
采用Zookeeper完全可以解決我們的問(wèn)題,分布式計(jì)算中的協(xié)調(diào)員,觀察者,分布式鎖都可以作為zookeeper的關(guān)鍵詞,在系統(tǒng)中利用Zookeeper來(lái)處理事件通知,隊(duì)列,優(yōu)先隊(duì)列,鎖,共享鎖等功能,利用這些特色在分布式計(jì)算中發(fā)揮重要的作用。
Zookeeper 的安裝
下載地址:http://www.apache.org/dyn/closer.cgi/zookeeper
首先從官網(wǎng)下載ZooKeeper壓縮包,然后解壓下載得到的ZooKeeper壓縮包,發(fā)現(xiàn)有“bin,conf,lib”等目錄?!癰in目錄”中存放有運(yùn)行腳本;“conf目錄”中存放有配置文件;“l(fā)ib目錄”中存放有運(yùn)行所需要第三方庫(kù)。
解壓文件:
tar zxvf zookeeper-3.4.8.tar.gz
Zookeeper 的配置
一、單機(jī)模式
1.1、編輯配置文件
在“conf”目錄下,新建一個(gè)名為“zoo.cfg”的文件,其中內(nèi)容如下:
tickTime=2000
dataDir= /usr/myenv/zookeeper-3.4.8/data (填寫(xiě)自己的data目錄)
dataLogDir=/usr/myenv/zookeeper-3.4.8/logs
clientPort=2181
參數(shù)說(shuō)明:
#tickTime: zookeeper中使用的基本時(shí)間單位, 毫秒值.
#dataDir: 數(shù)據(jù)目錄. 可以是任意目錄.
#dataLogDir: log目錄, 同樣可以是任意目錄. 如果沒(méi)有設(shè)置該參數(shù), 將使用和#dataDir相同的設(shè)置.
#clientPort: 監(jiān)聽(tīng)client連接的端口號(hào).
1.2、運(yùn)行ZooKeeper Server
執(zhí)行./bin/zkServer.sh start命令,運(yùn)行ZooKeeper Server進(jìn)程,得到如圖所示結(jié)果,表示后臺(tái)運(yùn)行ZooKeeper Server進(jìn)程成功。

注:命令telnet 127.0.0.1 2181 連接成功驗(yàn)證Zookeeper 是否啟動(dòng)成功
停止:./bin/zkServer.sh stop
也可以執(zhí)行bin/zkServer.sh start-foreground命令,非后臺(tái)運(yùn)行ZooKeeper Server進(jìn)程

二、集群模式
集群模式有兩種形式:
1)使用多臺(tái)機(jī)器,在每臺(tái)機(jī)器上運(yùn)行一個(gè)ZooKeeper Server進(jìn)程;
2)使用一臺(tái)機(jī)器,在該臺(tái)機(jī)器上運(yùn)行多個(gè)ZooKeeper Server進(jìn)程。
在生產(chǎn)環(huán)境中,一般使用第一種形式,在練習(xí)環(huán)境中,一般使用第二種形式。
2.1、參數(shù)配置
集群模式下,需要配置一些參數(shù),以下是常見(jiàn)的一些參數(shù)。
- data目錄
用于存放進(jìn)程運(yùn)行數(shù)據(jù)。 - data目錄下的myid文件
用于存儲(chǔ)一個(gè)數(shù)值,用來(lái)作為該ZooKeeper Server進(jìn)程的標(biāo)識(shí)。 - 監(jiān)聽(tīng)Client端請(qǐng)求的端口號(hào)
- 監(jiān)聽(tīng)同ZooKeeper集群內(nèi)其他Server進(jìn)程通信請(qǐng)求的端口號(hào)
- 監(jiān)聽(tīng)ZooKeeper集群內(nèi)“l(fā)eader”選舉請(qǐng)求的端口號(hào)
該端口號(hào)用來(lái)監(jiān)聽(tīng)ZooKeeper集群內(nèi)“l(fā)eader”選舉的請(qǐng)求。注意這個(gè)是ZooKeeper集群內(nèi)“l(fā)eader”的選舉,跟分布式應(yīng)用程序無(wú)關(guān)。
參數(shù)配置注意事項(xiàng):
1)同一個(gè)ZooKeeper集群內(nèi),不同ZooKeeper Server進(jìn)程的標(biāo)識(shí)需要不一樣,即myid文件內(nèi)的值需要不一樣
2)采用上述第2種形式構(gòu)建ZooKeeper集群,需要注意“目錄,端口號(hào)”等資源的不可共享性,如果共享會(huì)導(dǎo)致ZooKeeper Server進(jìn)程不能正常運(yùn)行,比如“data目錄,幾個(gè)監(jiān)聽(tīng)端口號(hào)”都不能被共享
| myid | Data目錄 | Client | Server | Leader | 配置文件 |
|---|---|---|---|---|---|
| 1 | /z1/data | 2181 | 2222 | 2223 | z1.cfg |
| 2 | /z2/data | 2182 | 3333 | 3334 | z2.cfg |
| 3 | /z3/data | 2183 | 4444 | 4445 | z3.cfg |
配置如下:
# zx.cfg
tickTime=2000
initLimit=10
syncLimit=2
dataDir=/usr/myenv/zookeeper-3.4.8/zx/data
clientPort=218x
# server.x中的“x”表示ZooKeeper Server進(jìn)程的標(biāo)識(shí)
server.1=127.0.0.1:2222:2225
server.2=127.0.0.1:3333:3335
server.3=127.0.0.1:4444:4445
注:
- initLimit: zookeeper集群中的包含多臺(tái)server, 其中一臺(tái)為leader, 集群中其余的server為follower. initLimit參數(shù)配置初始化連接時(shí), follower和leader之間的最長(zhǎng)心跳時(shí)間. 此時(shí)該參數(shù)設(shè)置為5, 說(shuō)明時(shí)間限制為5倍tickTime, 即5*2000=10000ms=10s.
- syncLimit: 該參數(shù)配置leader和follower之間發(fā)送消息, 請(qǐng)求和應(yīng)答的最大時(shí)間長(zhǎng)度. 此時(shí)該參數(shù)設(shè)置為2, 說(shuō)明時(shí)間限制為2倍tickTime, 即4000ms.
2.2、運(yùn)行ZooKeeper Server
分別執(zhí)行
bin/zkServer.sh start deploy/z1/z1.cfg,
bin/zkServer.sh start deploy/z2/z2.cfg
bin/zkServer.sh start deploy/z3/z3.cfg
運(yùn)行上述配置的3個(gè)ZooKeeper Server進(jìn)程。
2.3、運(yùn)行ZooKeeper命令行客戶端
執(zhí)行命令
bin/zkCli.sh -server 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
建立ZooKeeper Client端到ZooKeeper集群的連接會(huì)話。