第一課 Hadoop生態(tài)圈與Zookeeper應(yīng)用實(shí)踐筆記

第一課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ī)上,彼此之間通過消息傳遞進(jìn)行通信和協(xié)調(diào)的系統(tǒng)

[if !supportLists]2.[endif]腦裂

集群整體提供服務(wù),但是由于各種網(wǎng)絡(luò)原因,分裂成小單元提供同樣的服務(wù)。

3.Zookeeper簡介

一個(gè)開源的針對(duì)大型分布式系統(tǒng)的可靠協(xié)調(diào)系統(tǒng),將復(fù)雜且容易出錯(cuò)的分布式式一致性服務(wù),封裝起來,構(gòu)成一個(gè)高效可靠的原語集,并以簡單易用的接口提供給用戶使用。

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ù)更新要么成功,要么失敗。

? 單一視圖:

無論客戶端連接到哪個(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),選主過程中參與投票。

Observer接收客戶端讀請(qǐng)求,將客戶端寫請(qǐng)求轉(zhuǎn)發(fā)給Leader,不參與投票過程,只同步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,也就是說整個(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ù)指的是超過集群機(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ù)角色為Leader

?FOLLOWING:跟隨者狀態(tài),Leader已經(jīng)選舉出來,表明當(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選舉過程


在前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,誰的ZXID大誰就優(yōu)先作為leader,由于全新啟動(dòng)期間ZXID都是0,繼續(xù)進(jìn)行下一步比較,比較myid,誰的myid大誰優(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),沒有目錄和文件的概念

?Znode是Zookeeper中數(shù)據(jù)的最小單元

?Znode上可以保存數(shù)據(jù),通過掛載子節(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ù)原子性操作

? 悲觀鎖

? 樂觀鎖

? 使用version實(shí)現(xiàn)樂觀鎖機(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)安裝過程

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.通過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沒有權(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

通過ssh-copy-id命令將hadoo01這臺(tái)機(jī)器root用戶的公鑰文件(id_rsa.pub)文件內(nèi)容拷貝到hadoop02和hadoo03兩臺(tái)機(jī)器

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容