第一課Hadoop生態(tài)圈與Zookeeper應(yīng)用實(shí)踐
一)相關(guān)原理以及知識(shí)點(diǎn)
1.什么是分布式系統(tǒng)
《分布式系統(tǒng)概念與設(shè)計(jì)》一書定義分布式系統(tǒng)是一個(gè)硬件或軟件組件分布在不同的網(wǎng)絡(luò)計(jì)算機(jī)上,彼此之間通過(guò)消息傳遞進(jìn)行通信和協(xié)調(diào)的系統(tǒng)
[if !supportLists]2.[endif]腦裂
集群整體提供服務(wù),但是由于各種網(wǎng)絡(luò)原因,分裂成小單元提供同樣的服務(wù)驹溃。
3.Zookeeper簡(jiǎn)介
一個(gè)開源的針對(duì)大型分布式系統(tǒng)的可靠協(xié)調(diào)系統(tǒng)纠脾,將復(fù)雜且容易出錯(cuò)的分布式式一致性服務(wù)饵筑,封裝起來(lái)捧搞,構(gòu)成一個(gè)高效可靠的原語(yǔ)集圾浅,并以簡(jiǎn)單易用的接口提供給用戶使用腹尖。
4.Zookeeper特性
最終一致性
保證最終數(shù)據(jù)能夠達(dá)到一致柳恐,這是Zookeeper最重要的功能。
?順序性
從同一個(gè)客戶端發(fā)起的事務(wù)請(qǐng)求热幔,最終會(huì)嚴(yán)格地按照其發(fā)送順序被應(yīng)用到Zookeeper中乐设。
?可靠性
一旦服務(wù)器成功的應(yīng)用一個(gè)事務(wù),并完成了客戶端的響應(yīng)绎巨,那么該事
務(wù)所引起的服務(wù)端狀態(tài)變更將會(huì)被一直保留下去近尚。
實(shí)時(shí)性
Zookeeper不能保證兩個(gè)客戶端能同時(shí)得到剛更新的數(shù)據(jù),如果需要最新數(shù)據(jù)场勤,應(yīng)該在讀數(shù)據(jù)之前調(diào)用sync()接口戈锻。
原子性:
一次數(shù)據(jù)更新要么成功,要么失敗和媳。
? 單一視圖:
無(wú)論客戶端連接到哪個(gè)服務(wù)器格遭,看到的數(shù)據(jù)模型都是一致的。
[if !supportLists]5.[endif]zookeeper角色
Leader更新系統(tǒng)狀態(tài)留瞳,處理事務(wù)請(qǐng)求拒迅,負(fù)責(zé)進(jìn)行投票的發(fā)起和決議
Leaner Follower處理客戶端非事務(wù)請(qǐng)求并向客戶端返回結(jié)果,將寫事務(wù)請(qǐng)求轉(zhuǎn)發(fā)給Leader她倘,同步Leader的狀態(tài)璧微,選主過(guò)程中參與投票。
Observer接收客戶端讀請(qǐng)求硬梁,將客戶端寫請(qǐng)求轉(zhuǎn)發(fā)給Leader前硫,不參與投票過(guò)程,只同步Leader的狀態(tài)靶溜。目的是為了擴(kuò)展系統(tǒng),提高讀取速度。
Client請(qǐng)求發(fā)起方罩息。
6.Zookeeper寫入
當(dāng)集群中的任何一個(gè)follower節(jié)點(diǎn)接收到客戶端的事務(wù)請(qǐng)求嗤详,都會(huì)轉(zhuǎn)發(fā)給leader,也就是說(shuō)整個(gè)集群只有l(wèi)eader可以處理事務(wù)請(qǐng)求瓷炮,其它角色的節(jié)點(diǎn)都不能處理葱色,當(dāng)leader處理事務(wù)請(qǐng)求的時(shí)候,就要向整個(gè)集群廣播一個(gè)提議娘香,這個(gè)提議就是告訴follower你們要?jiǎng)?chuàng)建/修改/刪除一個(gè)znode,然后follower接收到leader的提議之后苍狰,就會(huì)做相應(yīng)的操作,操作完成告訴leader完成了烘绽。當(dāng)leader接收到集群中的大多數(shù)follower的成功操作的回復(fù)之后淋昭,這里的大多數(shù)指的是超過(guò)集群機(jī)器數(shù)量的一半,當(dāng)收到大多數(shù)follower的回復(fù)之后安接,leader就認(rèn)為這次事務(wù)被成功處理了翔忽,然后再向集群通知所有的follower提交事務(wù),最后會(huì)返回給客戶端一個(gè)事務(wù)被成功處理的狀態(tài)盏檐。如果有落后的follower歇式,這些落后的follower也會(huì)從leader同步狀態(tài),保持與leader的狀態(tài)一致胡野。
7.Zookeeper選舉
服務(wù)器四種狀態(tài):
?LOOKING:尋找Leader狀態(tài)材失,處于該狀態(tài)需要進(jìn)入選舉流程
?LEADING:領(lǐng)導(dǎo)者狀態(tài),表明當(dāng)前服務(wù)角色為L(zhǎng)eader
?FOLLOWING:跟隨者狀態(tài)硫豆,Leader已經(jīng)選舉出來(lái)龙巨,表明當(dāng)前服務(wù)角色為Follower
?OBSERVER:觀察者狀態(tài),表明當(dāng)前服務(wù)角色Observer事務(wù)ID:用ZXID表示够庙,是一個(gè)64位的數(shù)字恭应,由Leader統(tǒng)一分配,全局唯一耘眨,不斷遞增昼榛。
8.關(guān)于全新啟動(dòng)期間的leader選舉過(guò)程
在前zk1和zk2啟動(dòng)的時(shí)候,兩個(gè)節(jié)點(diǎn)都會(huì)發(fā)出廣播當(dāng)leader剔难,他們發(fā)出的廣播信息內(nèi)容是(myid,ZXID)胆屿,由于是全新啟動(dòng)期ZXID是0
zk1的myid是1,zk2的myid是2偶宫,所以zk1和zk2發(fā)出的廣播消息分別是(1,0)和(2,0)非迹,在zk1和zk2分別接受到對(duì)方發(fā)出的選舉廣播消息的時(shí)候,首先對(duì)比消息中的ZXID纯趋,誰(shuí)的ZXID大誰(shuí)就優(yōu)先作為leader憎兽,由于全新啟動(dòng)期間ZXID都是0冷离,繼續(xù)進(jìn)行下一步比較,比較myid纯命,誰(shuí)的myid大誰(shuí)優(yōu)先作為laeder西剥,很明顯zk2的myid大,所以zk1會(huì)重新發(fā)出選舉的信息選zk2作為leader亿汞,然后zk2自己也選自己作為leader瞭空,集群中已經(jīng)有兩個(gè)選了zk2作為leader,所以zk2當(dāng)選為leader疗我,都選出zk2是leader了咆畏,zk3再啟動(dòng)的時(shí)候發(fā)現(xiàn)zk2已經(jīng)是leader了,那zk3自認(rèn)為自己就是follower
9.Zookeeper選舉(運(yùn)行期間)
當(dāng)集群中的leader zk2掛掉之后吴裤,所有的follower將自己的狀態(tài)調(diào)整為looking狀態(tài)旧找,集群進(jìn)入選舉階段。先比較ZXID嚼摩。如圖所示zk1和zk3發(fā)出廣播钦讳。Zk1的ZXID大于zk3,zk3會(huì)選zk1為leader,然后zk1自己也選自己作為leader.所以zk1為leader
10.數(shù)據(jù)模型Znode
?Zookeeper特有的數(shù)據(jù)節(jié)點(diǎn)Znode,視圖結(jié)構(gòu)類似
Linux文件系統(tǒng)枕面,沒(méi)有目錄和文件的概念
?Znode是Zookeeper中數(shù)據(jù)的最小單元
?Znode上可以保存數(shù)據(jù)愿卒,通過(guò)掛載子節(jié)點(diǎn)構(gòu)成一個(gè)
樹狀的層次化命名空間
?Znode樹的根由“/”斜杠開始
11.znode版本
版本類型
?dataVersion:當(dāng)前數(shù)據(jù)節(jié)點(diǎn)數(shù)據(jù)內(nèi)容的版本號(hào)
?cVersion:當(dāng)前數(shù)據(jù)節(jié)點(diǎn)子節(jié)點(diǎn)的版本號(hào)
?aVersion:當(dāng)前數(shù)據(jù)節(jié)點(diǎn)ACL權(quán)限變更版本號(hào)
如何保證分布式數(shù)據(jù)原子性操作
? 悲觀鎖
? 樂(lè)觀鎖
? 使用version實(shí)現(xiàn)樂(lè)觀鎖機(jī)制中的“寫入校驗(yàn)”
12.Znode - Watcher機(jī)制
二.其它的重點(diǎn)
1. znode是zookeeper中的一個(gè)數(shù)據(jù)節(jié)點(diǎn),znode下還可以創(chuàng)建子znode,可以理解為文件夾的構(gòu)造潮秘,一個(gè)文件夾下可以有子文件夾或者子文件琼开。
2.心跳的意思是從節(jié)點(diǎn)周期性的向leader發(fā)送消息,比如2秒鐘發(fā)送一次消息枕荞,這種有規(guī)律的通信就叫做心跳
3.臨時(shí)節(jié)點(diǎn)下是不能創(chuàng)建子節(jié)點(diǎn)
4.znode不對(duì)應(yīng)機(jī)器
5.zookeeper提供了一種存儲(chǔ)系統(tǒng)柜候。這個(gè)存儲(chǔ)系統(tǒng)里存儲(chǔ)的是znode的樹形結(jié)構(gòu)
6.每一個(gè)znode就是一個(gè)數(shù)據(jù)節(jié)點(diǎn),znode可以存數(shù)據(jù)躏精,也可以實(shí)現(xiàn)類似文件夾的功能渣刷,就是znode下可以創(chuàng)建子znode
7.leader和follower分別在單獨(dú)的機(jī)器上部署。
8.整個(gè)集群會(huì)選舉出一個(gè)leader矗烛,這個(gè)leader負(fù)責(zé)處理客戶端的事務(wù)請(qǐng)求辅柴,事務(wù)請(qǐng)求包括znode的創(chuàng)建、修改瞭吃、刪除等碌嘀,follower負(fù)責(zé)處理客戶端的讀請(qǐng)求。
11整個(gè)zookeeper集群只有一個(gè)leader負(fù)責(zé)事務(wù)處理歪架,每次接收到一個(gè)事務(wù)處理請(qǐng)求股冗,就會(huì)生成一個(gè)全局唯一,自動(dòng)遞增的事務(wù)ID
三)Zookeeper搭建與常用操作
1)安裝過(guò)程
1.安裝zookeeper-3.4.10.tar.gz
2.root創(chuàng)建軟連接,修改zookeeper軟鏈接屬主為hadoop
ln -s /home/hadoop/apps/zookeeper-3.4.10 /usr/local/zookeeper
chown -R hadoop:hadoop /usr/local/zookeeper
3.root編輯環(huán)境變量
vim /etc/profile
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:${JAVA_HOME}/bin:${ZOOKEEPER_HOME}/bin
4.重新編譯環(huán)境變量
source /etc/profile
5.切換到addop用戶
su hadoop
6..修改zookeeper配置文件
cd /usr/local/zookeeper/conf
拷貝樣例配置文件并重命名zoo.cfg
cp zoo_sample.cfg zoo.cfg
編輯zoo.cfg文件
vim zoo.cfg
添加內(nèi)容
dataDir=/usr/local/zookeeper/data ???#快照文件存儲(chǔ)目錄
dataLogDir=/usr/local/zookeeper/log ??#事務(wù)日志文件目錄
#注意node01和蚪、node02止状、node03是安裝zookeeper的主機(jī)名烹棉,根據(jù)自己的虛擬機(jī)自行修改
server.1=node01:2888:3888 (主機(jī)名,心跳端口、數(shù)據(jù)端口)
server.2=node02:2888:3888
server.3=node03:2888:3888
7.創(chuàng)建data怯疤、log目錄,只有hadoop用戶具有寫權(quán)限
在/usr/local/zookeeper目錄下創(chuàng)建
mkdir -m 755 data
mkdir -m 755 log
8.在data文件夾下新建myid文件峦耘,myid的文件內(nèi)容為該節(jié)點(diǎn)的編號(hào)
cd data
創(chuàng)建myid文件
touch myid
添加編號(hào)1
echo 1 > myid
9.通過(guò)scp將安裝包拷貝到其他兩個(gè)節(jié)點(diǎn)hadoop02和hadoop03的/home/hadoop/apps目錄下scp -r /home/hadoop/apps/zookeeper-3.4.10 hadoop@hadoop02:/home/hadoop/apps
scp -r /home/hadoop/apps/zookeeper-3.4.10 hadoop@hadoop03:/home/hadoop/apps
分別創(chuàng)軟鏈接并且添加環(huán)境變量,注意要配置SSH免密碼登錄
10.修改其他節(jié)點(diǎn)的myid
hadoop02的myid文件內(nèi)容是2
hadoop03的myid文件內(nèi)容是3
11.啟動(dòng)
/usr/local/zookeeper/bin/zkServer.sh start
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Hadoop01
/usr/local/zookeeper/bin/zkServer.sh start
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Hadoop02
/usr/local/zookeeper/bin/zkServer.sh start
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Hadoop03
查看zk狀態(tài)
zkServer.sh status
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Hadoop01
zkServer.sh status
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Hadoop02
zkServer.sh status
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Hadoop03
關(guān)閉命令
/usr/local/zookeeper/bin/zkServer.sh stop
2)注意事項(xiàng)
1.用root創(chuàng)建軟連接時(shí)旅薄,要修改軟鏈接屬主為hadoop用戶,避免后邊hadoop沒(méi)有權(quán)限
2.ssh免密碼登入(root和haddop用戶)注意用切換到hadoop用戶的時(shí)候拷貝到其它的節(jié)點(diǎn)泣崩,也要用hadoop用戶啟動(dòng)少梁,注意用戶權(quán)限。
Root用戶在/root/.ssh下執(zhí)行ssh-keygen -t rsa
Hadoop用戶(普通用戶)/home/hadoop/.ssh下執(zhí)行ssh-keygen -t rsa
通過(guò)ssh-copy-id命令將hadoo01這臺(tái)機(jī)器root用戶的公鑰文件(id_rsa.pub)文件內(nèi)容拷貝到hadoop02和hadoo03兩臺(tái)機(jī)器