- 論壇徽章:
- 0
|
<span style="font: 7pt 'Times New Roman';"><span style="font-size: 10pt;"><font size="3"><strong>zookeeper</strong>
</font><span style=""><strong><font size="3">介紹</font><br></strong>
</span>
zookeeper<span style="">是一個(gè)為分布式應(yīng)用提供一致服務(wù)的軟件,它是開(kāi)源的</span>
Hadoop<span style="">項(xiàng)目中的一個(gè)子項(xiàng)目,并且根據(jù)</span>
google<span style="">發(fā)表的</span> 《<font color="#0000F0">The Chubby lock service for loosely-coupled distributed systems</font>》<span style="">論文來(lái)實(shí)現(xiàn)的,接下來(lái)我們首先來(lái)安裝使用下這個(gè)軟件,然后再來(lái)探索下其中比較重要一致性算法。</span>
<br><br></span></span><strong style="font-size: 10pt;">zookeeper<span style="">安裝和使用<br></span>
</strong>
<span style="font-size: 10pt;">zookeeper<span style="">的安裝基本上可以按照</span><br>http://hadoop.apache.org/zookeeper/docs/current/zookeeperStarted.html <span style="">這個(gè)頁(yè)面上的步驟完成安裝,這里主要介紹下部署一個(gè)集群的步驟,因?yàn)檫@個(gè)官方頁(yè)面似乎講得并不是非常詳細(xì)</span>
(Running Replicated Zookeeper)<span style="">。</span></span><br><br><span style="font-size: 10pt;"><span style="">由于手頭機(jī)器不足,所以在一臺(tái)機(jī)器上部署了</span>
3<span style="">個(gè)</span>
server,<span style="">如果你手頭也比較緊,也可以這么做。那么我建了</span>
3<span style="">個(gè)文件夾,如下<br></span>
</span>
<strong><span style="font-size: 10pt;"><strong>server1 server2 server3<br></strong>
</span>
</strong>
<span style=""><span style="font-size: 10pt;"><span style=""><br>
然后每個(gè)文件夾里面解壓一個(gè)</span>
zookeeper<span style="">的下載包,并且還建了幾個(gè)文件夾,總體結(jié)構(gòu)如下</span>
,<span style="">最后那個(gè)是下載過(guò)來(lái)壓縮包的解壓文件<br></span>
</span>
</span>
<strong><span style="font-size: 10pt;"><strong>data dataLog logs zookeeper-3.3.3<br></strong>
</span>
<br></strong>
<span style=""><span style="font-size: 10pt;"><span style="">那么首先進(jìn)入</span>
data<span style="">目錄,創(chuàng)建一個(gè)</span>
<font color="#0000F0">myid</font><span style="">的文件,里面寫入一個(gè)數(shù)字,比如我這個(gè)是</span>
server1,<span style="">那么就寫一個(gè)</span>
1<span style="">,</span>
server2<span style="">對(duì)應(yīng)</span>
myid<span style="">文件就寫入</span>
2<span style="">,</span>
server3對(duì)應(yīng)myid文件就<span style="">寫個(gè)</span>
3<br></span>
</span>
<br><span style=""><span style="font-size: 10pt;"><span style="">然后進(jìn)入</span>
<strong>zookeeper-3.3.3/conf</strong>
<span style="">目錄,那么如果是剛下過(guò)來(lái),會(huì)有</span>
3<span style="">個(gè)文件,</span>
<strong>configuration.xml, log4j.properties,zoo_sample.cfg</strong>
,<span style="">這</span>
3<span style="">個(gè)文件我們首先要做的就是在這個(gè)目錄創(chuàng)建一個(gè)</span>
zoo.cfg<span style="">的配置文件,當(dāng)然你可以把</span>
zoo_sample.cfg<span style="">文件改成</span>
zoo.cfg<span style="">,配置的內(nèi)容如下所示:</span>
</span>
</span>
<br><span style="color: red;"><span style="font-size: 10pt;"><span style="color: red;">tickTime=2000<br></span>
<span style="color: red;">initLimit=5<br></span>
<span style="color: red;">syncLimit=2<br></span>
<span style="color: red;">dataDir=xxxx/zookeeper/server1/data<br></span>
<span style="color: red;">dataLogDir=xxx/zookeeper/server1/dataLog<br></span>
<span style="color: red;">clientPort=<font color="#0000F0">2181</font><br></span>
</span>
</span>
<span style="font-size: 10pt;">server.1=127.0.0.1:2888:3888<br>
server.2=127.0.0.1:2889:3889<br>
server.3=127.0.0.1:2890:3890<span style=""><br></span>
</span>
<br><span style=""><span style="font-size: 10pt;"><span style="">標(biāo)紅的幾個(gè)配置應(yīng)該官網(wǎng)講得很清楚了,只是需要注意的是</span>
clientPort<span style="">這個(gè)端口如果你是在</span>
1<span style="">臺(tái)機(jī)器上部署多個(gè)</span>
server,<span style="">那么每臺(tái)機(jī)器都要不同的</span>
clientPort<span style="">,比如我</span>
server1<span style="">是</span>
2181,server2<span style="">是</span>
2182<span style="">,</span>
server3<span style="">是</span>
2183<span style="">,</span>
dataDir<span style="">和</span>
dataLogDir<span style="">也需要區(qū)分下。</span>
<br><br><span style="">最后幾行唯一需要注意的地方就是</span>
server.X <span style="">這個(gè)數(shù)字就是對(duì)應(yīng)</span>
data/myid<span style="">中的數(shù)字。你在</span>
3<span style="">個(gè)</span>
server<span style="">的</span>
myid<span style="">文件中分別寫入了</span>
1<span style="">,</span>
2<span style="">,</span>
3<span style="">,那么每個(gè)</span>
server<span style="">中的</span>
zoo.cfg<span style="">都配</span>
server.1,server.2,server.3<span style="">就</span>
OK<span style="">了。因?yàn)樵谕慌_(tái)機(jī)器上,后面連著的</span>
2<span style="">個(gè)端口</span>
3<span style="">個(gè)</span>
server<span style="">都不要一樣,否則端口沖突,其中第一個(gè)端口用來(lái)集群成員的信息交換,第二個(gè)端口是在</span>
leader<span style="">掛掉時(shí)專門用來(lái)進(jìn)行選舉</span>
leader<span style="">所用。<br><br></span>
</span>
</span>
<span style=""><span style="font-size: 10pt;"><span style="">進(jìn)入</span>
zookeeper-3.3.3/bin <span style="">目錄中<span style="">,<strong>./</strong></span></span></span></span><span style=""><span style="font-size: 10pt;"><strong>zkServer.sh start</strong>
</span>
</span>
<span style=""><span style="font-size: 10pt;"><span style="">啟動(dòng)一個(gè)</span>
server,<span style="">這時(shí)會(huì)報(bào)大量錯(cuò)誤?其實(shí)沒(méi)什么關(guān)系,因?yàn)楝F(xiàn)在集群只起了</span>
1<span style="">臺(tái)</span>
server<span style="">,</span>
zookeeper<span style="">服務(wù)器端起來(lái)會(huì)根據(jù)</span>
zoo.cfg<span style="">的服務(wù)器列表發(fā)起選舉</span>
leader<span style="">的請(qǐng)求,因?yàn)檫B不上其他機(jī)器而報(bào)錯(cuò),那么當(dāng)我們起第二個(gè)</span>
zookeeper<span style="">實(shí)例后,</span>
leader<span style="">將會(huì)被選出,從而一致**開(kāi)始可以使用,這是因?yàn)?lt;/span>
3<span style="">臺(tái)機(jī)器只要有</span>
2<span style="">臺(tái)可用就可以選出</span>
leader<span style="">并且對(duì)外提供服務(wù)</span>
(2n+1<span style="">臺(tái)機(jī)器,可以容</span>
n<span style="">臺(tái)機(jī)器掛掉</span>
)<span style="">。<br><br></span>
</span>
</span>
<span style=""><span style="font-size: 10pt;"><span style="">接下來(lái)就可以使用了,我們可以先通過(guò)</span>
zookeeper<span style="">自帶的客戶端交互程序來(lái)簡(jiǎn)單感受下</span>
zookeeper<span style="">到底做一些什么事情。進(jìn)入</span>
zookeeper-3.3.3/bin<span style="">(</span>
3<span style="">個(gè)</span>
server<span style="">中任意一個(gè))下,</span>
<strong>./zkCli.sh –server 127.0.0.1:2182</strong>
,<span style="">我連的是開(kāi)著</span>
2182<span style="">端口的機(jī)器。</span></span></span><strong><span style="font-size: 10pt;"><strong><br><br></strong></span></strong><span style=""><span style="font-size: 10pt;"><span style="">那么,首先我們隨便打個(gè)命令,因?yàn)?lt;/span>
zookeeper<span style="">不認(rèn)識(shí),他會(huì)給出命令的</span>
help,<span style="">如下圖</span>
</span>
</span>
<br>
<img src="http://www.blogjava.net/images/blogjava_net/bucketli/dddd.jpg" alt="" border="0"><br><span style="font-size: 10pt;">ls(<span style="">查看當(dāng)前節(jié)點(diǎn)數(shù)據(jù)</span>
),<br>
ls2(<span style="">查看當(dāng)前節(jié)點(diǎn)數(shù)據(jù)并能看到更新次數(shù)等數(shù)據(jù)</span>
) ,<br>
create(<span style="">創(chuàng)建一個(gè)節(jié)點(diǎn)</span>
) ,<br>
get(<span style="">得到一個(gè)節(jié)點(diǎn),包含數(shù)據(jù)和更新次數(shù)等數(shù)據(jù)</span>
),<br>
set(<span style="">修改節(jié)點(diǎn)</span>
)<br>
delete(<span style="">刪除一個(gè)節(jié)點(diǎn)</span>
)<br></span>
<span style=""><br><span style="font-size: 10pt;"><span style="">通過(guò)上述命令實(shí)踐,我們可以發(fā)現(xiàn),</span>
zookeeper<span style="">使用了一個(gè)類似文件系統(tǒng)的樹(shù)結(jié)構(gòu),數(shù)據(jù)可以掛在某個(gè)節(jié)點(diǎn)上,可以對(duì)這個(gè)節(jié)點(diǎn)進(jìn)行刪改。另外我們還發(fā)現(xiàn),當(dāng)改動(dòng)一個(gè)節(jié)點(diǎn)的時(shí)候,集群中活著的機(jī)器都會(huì)更新到一致的數(shù)據(jù)。</span>
<br></span>
</span>
<br><span style="font-size: 10pt;"><strong>zookeeper</strong>
<span style=""><strong>的數(shù)據(jù)模型<br></strong>
</span>
</span>
<span style=""><span style="font-size: 10pt;"><span style="">在簡(jiǎn)單使用了</span>
zookeeper<span style="">之后,我們發(fā)現(xiàn)其數(shù)據(jù)模型有些像操作系統(tǒng)的文件結(jié)構(gòu),結(jié)構(gòu)如下圖所示<br></span>
</span>
</span>
<img src="http://www.blogjava.net/images/blogjava_net/bucketli/XX.jpg" alt="" border="0"><br><br><br><span style="font-size: 10pt;">(1)<span style="line-height: normal; font-variant: normal; font-style: normal; font-family: 'Times New Roman'; font-weight: normal;"> </span>
<span style="">每個(gè)節(jié)點(diǎn)在</span>
zookeeper<span style="">中叫做</span>
znode,<span style="">并且其有一個(gè)唯一的路徑標(biāo)識(shí),如</span>
/SERVER2<span style="">節(jié)點(diǎn)的標(biāo)識(shí)就為</span>
/APP3/SERVER2<br>
(2)<span style="line-height: normal; font-variant: normal; font-style: normal; font-family: 'Times New Roman'; font-weight: normal;"> </span>
Znode<span style="">可以有子</span>
znode<span style="">,并且</span>
znode<span style="">里可以存數(shù)據(jù),但是</span>
EPHEMERAL<span style="">類型的節(jié)點(diǎn)不能有子節(jié)點(diǎn)<br></span>
(3)<span style="line-height: normal; font-variant: normal; font-style: normal; font-family: 'Times New Roman'; font-weight: normal;"> </span>
Znode<span style="">中的數(shù)據(jù)可以有多個(gè)版本,比如某一個(gè)路徑下存有多個(gè)數(shù)據(jù)版本,那么查詢這個(gè)路徑下的數(shù)據(jù)就需要帶上版本。<br></span>
(4)<span style="line-height: normal; font-variant: normal; font-style: normal; font-family: 'Times New Roman'; font-weight: normal;"> </span>
znode <span style="">可以是臨時(shí)節(jié)點(diǎn),一旦創(chuàng)建這個(gè)</span>
znode <span style="">的客戶端與服務(wù)器失去聯(lián)系,這個(gè)</span>
znode <span style="">也將自動(dòng)刪除,</span>
Zookeeper <span style="">的客戶端和服務(wù)器通信采用長(zhǎng)連接方式,每個(gè)客戶端和 服務(wù)器通過(guò)心跳來(lái)保持連接,這個(gè)連接狀態(tài)稱為</span>
session<span style="">,如果</span>
znode <span style="">是臨時(shí)節(jié)點(diǎn),這個(gè)</span>
session <span style="">失效,</span>
znode <span style="">也就刪除了<br></span>
(5)<span style="line-height: normal; font-variant: normal; font-style: normal; font-family: 'Times New Roman'; font-weight: normal;"> </span>
znode <span style="">的目錄名可以自動(dòng)編號(hào),如</span>
App1 <span style="">已經(jīng)存在,再創(chuàng)建的話,將會(huì)自動(dòng)命名為</span>
App2 <br>
(6)<span style="line-height: normal; font-variant: normal; font-style: normal; font-family: 'Times New Roman'; font-weight: normal;"> </span>
znode <span style="">可以被監(jiān)控,包括這個(gè)目錄節(jié)點(diǎn)中存儲(chǔ)的數(shù)據(jù)的修改,子節(jié)點(diǎn)目錄的變化等,一旦變化可以通知設(shè)置監(jiān)控的客戶端,這個(gè)功能是</span>
zookeeper<span style="">對(duì)于應(yīng)用最重要的特性,通過(guò)這個(gè)特性可以實(shí)現(xiàn)的功能包括配置的集中管理,集群管理,分布式鎖等等。</span>
</span>
<br> |
|