?ZooKeeper是一個(gè)分布式的卿堂,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù)连躏,是Google的Chubby一個(gè)開源的實(shí)現(xiàn)洪灯,是Hadoop和Hbase的重要組件毅访。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件掠剑,提供的功能包括:配置維護(hù)蓬推、名字服務(wù)、分布式同步澡腾、組服務(wù)等沸伏。ZooKeeper的目標(biāo)就是封裝好復(fù)雜易出錯(cuò)的關(guān)鍵服務(wù)糕珊,將簡(jiǎn)單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶毅糟。
1 概述
? ? ? ZooKeeper(動(dòng)物園管理員)红选,顧名思義,是用來(lái)管理Hadoop(大象)姆另、Hive(蜜蜂)喇肋、Pig(小豬)的管理員,同時(shí)Apache HBase迹辐、Apache Solr蝶防、LinkedIn Sensei等眾多項(xiàng)目中都采用了ZooKeeper。
??ZooKeeper是Hadoop的正式子項(xiàng)目明吩,與Hadoop密切相關(guān)但卻沒(méi)有任何依賴间学。它是一個(gè)針對(duì)大型應(yīng)用提供高可用的數(shù)據(jù)管理、應(yīng)用程序協(xié)調(diào)服務(wù)的分布式服務(wù)框架印荔,基于對(duì)Paxos算法的實(shí)現(xiàn)低葫,使該框架保證了分布式環(huán)境中數(shù)據(jù)的強(qiáng)一致性,提供的功能包括:配置維護(hù)仍律、統(tǒng)一命名服務(wù)嘿悬、狀態(tài)同步服務(wù)、集群管理等水泉。
??在分布式應(yīng)用中善涨,由于工程師不能很好地使用鎖機(jī)制,以及基于消息的協(xié)調(diào)機(jī)制不適合在某些應(yīng)用中使用草则,因此需要有一種可靠的躯概、可擴(kuò)展的、分布式的畔师、可配置的協(xié)調(diào)機(jī)制來(lái)統(tǒng)一系統(tǒng)的狀態(tài)娶靡。Zookeeper的目的就在于此。
??根據(jù)ZooKeeper官方文檔和ZooKeeper的作用看锉,ZooKeeper一般有兩種部署方式:
單機(jī)模式:運(yùn)行一個(gè)Zookeeper實(shí)例
分布式模式:在多臺(tái)機(jī)器上分別運(yùn)行Zookeeper實(shí)例用于組成ZooKeeper集群提供服務(wù)
偽分布式模式:在一臺(tái)物理機(jī)上運(yùn)行多個(gè)Zookeeper實(shí)例
2 準(zhǔn)備工作
JDK姿锭,版本大于1.6;
從官網(wǎng)下載最新的穩(wěn)定版伯铣;
ZooKeeper支持在Windows平臺(tái)上運(yùn)行呻此,但是只支持使用Windows作為開發(fā)平臺(tái),不能作為生產(chǎn)平臺(tái)腔寡;
在生產(chǎn)環(huán)境焚鲜,推薦ZooKeeper服務(wù)是最少為3個(gè)的集群,且最好運(yùn)行在獨(dú)立的物理機(jī)上。
??另外忿磅,需要注意的是糯彬,ZooKeeper集群是以宕機(jī)個(gè)數(shù)過(guò)半才會(huì)讓整個(gè)集群宕機(jī)的,所以最好部署奇數(shù)個(gè)節(jié)點(diǎn)葱她。ZooKeeper的單機(jī)模式是沒(méi)有備份的撩扒,如果ZooKeeper宕了,服務(wù)也就停了吨些,所以搓谆,在開發(fā)模式中可以使用單機(jī)模式,但是生成環(huán)境最好使用ZooKeeper集群的分布式模式豪墅。
3 單機(jī)模式
??以單機(jī)模式運(yùn)行ZooKeeper服務(wù)是最簡(jiǎn)單的泉手。因?yàn)閆ooKeeper服務(wù)包含在一個(gè)JAR文件中,所以安裝過(guò)程只要修改一個(gè)配置文件就行了偶器。
將下載好的穩(wěn)定版解壓到某個(gè)目錄斩萌,設(shè)置環(huán)境變量ZOOKEEPER_HOME指向該目錄。然后需要修改基本配置状囱,ZooKeeper的配置文件在conf目錄下术裸,這個(gè)目錄下有zoo_sample.cfg和log4j.properties倘是,先將zoo_sample.cfg改名為zoo.cfg(ZooKeeper在啟動(dòng)時(shí)會(huì)找這個(gè)文件作為默認(rèn)配置文件)亭枷,在單機(jī)模式中,可以修改為下面的內(nèi)容:
tickTime=2000
dataDir=/home/lxh/hadoop/data/zookeeper
clientPort=2181
tickTime:這個(gè)時(shí)間是作為 Zookeeper 服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時(shí)間間隔搀崭,也就是每個(gè) tickTime 時(shí)間就會(huì)發(fā)送一個(gè)心跳叨粘。
dataDir:顧名思義就是 Zookeeper 保存數(shù)據(jù)的目錄,默認(rèn)情況下瘤睹,Zookeeper 將寫數(shù)據(jù)的日志文件也保存在這個(gè)目錄里升敲。
clientPort:這個(gè)端口就是客戶端連接 Zookeeper 服務(wù)器的端口,Zookeeper 會(huì)監(jiān)聽這個(gè)端口轰传,接受客戶端的訪問(wèn)請(qǐng)求驴党,通常為2181。
現(xiàn)在使用bin/zkServer.sh腳本啟動(dòng)ZooKeeper:
$ $ZOOKEEPER_HOME/bin/zkServer.sh start
如果顯示下面內(nèi)容获茬,說(shuō)明啟動(dòng)成功:
JMX enabled by default
Using config: /home/lxh/hadoop/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
也可以通過(guò)jps命令查看:
6056 Jps
6009 QuorumPeerMain
QuorumPeerMain就是ZooKeeper的進(jìn)程名港庄。
ZooKeeper的日志信息輸出使用了log4j,默認(rèn)是控制臺(tái)打印恕曲,可以修改$ZOOKEEPER_HOME/conf/log4j.properties來(lái)控制輸出內(nèi)容和位置鹏氧。
4 分布式模式
??Zookeeper不僅可以單機(jī)提供服務(wù),同時(shí)也支持多機(jī)組成集群來(lái)提供服務(wù)佩谣。
??在單機(jī)模式中運(yùn)行ZooKeeper把还,對(duì)于測(cè)試、開發(fā)比較方便。但是在生產(chǎn)環(huán)境中吊履,為了獲得可靠的ZooKeeper服務(wù)安皱,應(yīng)該在一個(gè)集群上部署 ZooKeeper。因?yàn)閆ooKeeper集群宕機(jī)個(gè)數(shù)過(guò)半才會(huì)讓整個(gè)集群宕機(jī)率翅,所以练俐,只要集群中半數(shù)以上的ZooKeeper服務(wù)啟動(dòng)了,那么總的 ZooKeeper服務(wù)將是可用的冕臭。從而也推斷出腺晾,如果有5臺(tái)機(jī)器,可以保證2臺(tái)機(jī)器故障而不影響整個(gè)集群辜贵,ZooKeeper能繼續(xù)正常運(yùn)行悯蝉。(這里又提到關(guān)于集群中機(jī)器的數(shù)量,是因?yàn)槲乙话阆矚g雙數(shù)托慨,在做架構(gòu)設(shè)計(jì)時(shí)鼻由,極易選擇雙數(shù)作為機(jī)器數(shù)。)
??ZooKeeper的分布式模式的安裝配置幾乎跟單機(jī)模式一樣厚棵,只是需要增加幾個(gè)配置蕉世,下面是例子:
tickTime=2000
dataDir=/home/lxh/hadoop/data/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
initLimit:用來(lái)配置Zookeeper接受客戶端(此處指是Zookeeper服務(wù)器集群中連接到Leader的Follower服務(wù)器)初始化連接時(shí)最長(zhǎng)能忍受多少個(gè)心跳時(shí)間間隔數(shù)。超過(guò)這個(gè)時(shí)間婆硬,將被認(rèn)為是連接失敗狠轻。上面設(shè)置的總的時(shí)間長(zhǎng)度是5*2000毫秒。
syncLimit:限定leader與follower之間發(fā)送消息彬犯,請(qǐng)求和應(yīng)答時(shí)間長(zhǎng)度向楼,最長(zhǎng)不能超過(guò)多少個(gè)tickTime的時(shí)間長(zhǎng)度,上面設(shè)置的總時(shí)間長(zhǎng)度是2*2000毫秒谐区。
server.A=B:C:D:其中 A 是一個(gè)數(shù)字湖蜕,表示這個(gè)是第幾號(hào)服務(wù)器;B 是這個(gè)服務(wù)器的 ip 地址宋列;C 表示的是這個(gè)服務(wù)器與集群中的 Leader 服務(wù)器交換信息的端口昭抒;D 表示的是萬(wàn)一集群中的 Leader 服務(wù)器掛了,需要一個(gè)端口來(lái)重新進(jìn)行選舉炼杖,選出一個(gè)新的 Leader灭返,而這個(gè)端口就是用來(lái)執(zhí)行選舉時(shí)服務(wù)器相互通信的端口。如果是偽集群的配置方式嘹叫,由于 B 都是一樣婆殿,所以不同的 Zookeeper 實(shí)例通信端口號(hào)不能一樣,所以要給它們分配不同的端口號(hào)罩扇。
另外婆芦,在集群模式下怕磨,除了修改zoo.cfg配置文件,還要配置一個(gè)文件myid消约,這個(gè)文件在dataDir目錄下肠鲫,這個(gè)文件里面就有一個(gè)數(shù)據(jù)就是A的值,Zookeeper啟動(dòng)時(shí)會(huì)讀取這個(gè)文件或粮,拿到里面的數(shù)據(jù)與zoo.cfg里面的配置信息比較從而判斷到底是哪個(gè)server导饲。
轉(zhuǎn)載自:http://www.howardliu.cn/zookeeper-environment/