想必大家都對分布式系統(tǒng)有所耳聞饵蒂,大部分人對分布式都能侃侃而談声诸,但到了真正實(shí)施的時候,才發(fā)現(xiàn)其中的不易退盯。今天帶大家一起了解一款開源軟件彼乌,ZooKeeper。它通過一些簡單好用的API渊迁,來解決分布式系統(tǒng)設(shè)計(jì)與開發(fā)中的難點(diǎn)慰照。
這篇文章主要從下幾個部分介紹:
- 什么是分布式系統(tǒng)和它的特性
- 分布式系統(tǒng)難在哪里
- ZooKeeper簡介
- 下載安裝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é)作來完成一個共同的目標(biāo)琉朽。
想要更好的判斷是否為好的分布式系統(tǒng)毒租,可以看這些特性:
- 資源共享,例如存儲空間箱叁,計(jì)算能力墅垮,數(shù)據(jù),和服務(wù)等等
- 擴(kuò)展性耕漱,從軟件和硬件上增加系統(tǒng)的規(guī)模
- 并發(fā)性 多個用戶同時訪問
- 性能 確保當(dāng)負(fù)載增加的時候算色,系統(tǒng)想要時間不會有影響
- 容錯性 盡管一些組件暫時不可用了,整個系統(tǒng)仍然是可用的
- API抽象 系統(tǒng)的獨(dú)立組件對用戶隱藏螟够,僅僅暴露服務(wù)
有了ZooKeeper灾梦,開發(fā)者可以很輕松的實(shí)現(xiàn):
- 配置管理
- 命名服務(wù)
- 分布式鎖
- 集群關(guān)系操作峡钓,檢測節(jié)點(diǎn)的加入和離開
分布式系統(tǒng)的難點(diǎn)
可以想象,假如一臺計(jì)算機(jī)的出錯概率為0.1%若河,那么1000臺服務(wù)器的出錯概率呢能岩?一旦計(jì)算機(jī)的數(shù)量增多,出錯的概率就大大的增加牡肉。
多個相互獨(dú)立的計(jì)算機(jī)捧灰,假設(shè)集群的配置信息在某個Master節(jié)點(diǎn)上,其余的節(jié)點(diǎn)從Master節(jié)點(diǎn)下載配置信息统锤。假如Master節(jié)點(diǎn)掛了呢毛俏?假設(shè)Master節(jié)點(diǎn)是故障冗余的,但是配置信息是動態(tài)的傳遞給所有的其余節(jié)點(diǎn)的饲窿,而不是直接傳過去煌寇。所有節(jié)點(diǎn)之間的信息如何保證一致呢?
服務(wù)發(fā)現(xiàn)的問題逾雄,為了增加系統(tǒng)的可靠性阀溶,我們一般會在系統(tǒng)中增加更多的服務(wù)器。讓其它機(jī)器知道新加入的節(jié)點(diǎn)在集群中的關(guān)系和服務(wù)鸦泳,這個設(shè)計(jì)也需要非常周到的考慮
機(jī)器數(shù)目眾多银锻,更容易出現(xiàn) 機(jī)器故障,軟件崩潰做鹰,網(wǎng)絡(luò)延遲击纬,拓?fù)涓淖兊鹊龋@些類型的錯誤沒有規(guī)律可循钾麸,因此在分布式系統(tǒng)更振,想實(shí)現(xiàn)高容錯性是很難的。
當(dāng)然了..ZooKeeper被設(shè)計(jì)出來的目的就是解決這種類型的問題.
ZooKeeper介紹
zookeeper實(shí)際上是yahoo開發(fā)的饭尝,用于分布式中一致性處理的框架肯腕。最初其作為研發(fā)Hadoop時的副產(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)分布式的理論也很重要囚巴,我們放到下此再講,首先有一個可以運(yùn)行的Demo,在看理論的時候才更明白是怎么回事彤叉,因?yàn)閆ooKeeper的簡單易用庶柿,幾分鐘內(nèi)就可以做出一個小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注冊和客戶端和ZooKeeper服務(wù)的心跳周期浮庐。session超時時長最小為 tickTime的兩倍
- dataDir ZooKeeper的狀態(tài)存儲位置,看名字就知道書數(shù)據(jù)目錄柬焕。在你的系統(tǒng)中檢查這個目錄是否存在审残,如果不存在手動創(chuàng)建,并且給予可寫權(quán)限斑举。
- clientPort 客戶端連接的端口搅轿。不同的服務(wù)器可以設(shè)置不同的監(jiān)聽端口,默認(rèn)是2181
- 啟動ZooKeeper
# 這里命令寫的長是為了便于知道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用法赎懦,這個屬于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的集群相對比較簡單,這里不涉及過多的篇幅励两,但會列出大概的步驟黎茎。
- 創(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文件中一定要對應(yīng)上面配置文件中server.[id]的數(shù)字伐蒋,不然ZooKeeper啟動會出錯工三。
- 啟動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可以看到有三個zookeeper啟動起來了。
連接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的簡單Demo掸读,希望幫助大家入門ZooKeeper。
參考
- 《Apache ZooKeeper Essentials》
- ZooKeeper入門系列-概述