1怒坯、master-worker架構(gòu)
master-work是一個(gè)廣泛使用的分布式架構(gòu)哗总。master-work架構(gòu)中有一個(gè)master負(fù)責(zé)監(jiān)控worker的狀態(tài)朗鸠,并為worker分配任務(wù)秒拔。
- 在任何時(shí)刻婿脸,系統(tǒng)中最多只能有一個(gè)master粱胜,不可以出現(xiàn)兩個(gè)master的情況,多個(gè)master共存會(huì)導(dǎo)致腦裂狐树。
- 系統(tǒng)中除了處于active狀態(tài)的master還有一個(gè)backup master焙压,如果active master失敗了,backup master可以很快的進(jìn)入active狀態(tài)。
-
master實(shí)時(shí)監(jiān)控worker的狀態(tài)涯曲,能夠及時(shí)收集worker成員變化的通知野哭。master在收到worker成員變化時(shí),通常重新進(jìn)行任務(wù)的重新分配幻件。
2拨黔、master-worker架構(gòu)實(shí)例- HBase
HBase 采用的是mater-worker的架構(gòu),HMBase是系統(tǒng)中的master绰沥,HRegionServer是系統(tǒng)中的worker篱蝇。
HMBase監(jiān)控HBase Cluster中的worker的成員變化,把region分配給各個(gè)HRegionServer.系統(tǒng)中有一個(gè)HMaster處于active狀態(tài)徽曲,其他HMaster處于備用狀態(tài)零截。
3、master-worker架構(gòu)實(shí)例-Kafka
一個(gè)Kafka集群是有多個(gè)broker組成疟位,這些broker是系統(tǒng)中的worker瞻润,Kafka會(huì)從這些worker選舉出一個(gè)controller,這個(gè)controller是系統(tǒng)中的master甜刻,負(fù)責(zé)把topic partition分配給各個(gè)broker绍撞。
4、master-worker架構(gòu)實(shí)例- HDFS
HDFS采用的也是一個(gè)master-worker的架構(gòu)得院,NameNode是系統(tǒng)中的master,DataNode是系統(tǒng)中的worker傻铣。NameNode用來保存整個(gè)分布式文件系統(tǒng)的metadata,并把數(shù)據(jù)塊分配給cluster中的DataNode進(jìn)行保存。
5祥绞、如何使用ZooKeeper實(shí)現(xiàn)master-worker
- 使用一個(gè)臨時(shí)節(jié)點(diǎn)/master表示master非洲。master在行駛master的職能之前,首先要?jiǎng)?chuàng)建這個(gè)znode.如果能創(chuàng)建成功蜕径,進(jìn)入active狀態(tài)两踏,開始行駛master職能。否則的話兜喻,進(jìn)入backup狀態(tài)梦染,使用watch機(jī)制監(jiān)控/master。假設(shè)系統(tǒng)中有一個(gè)active master和一個(gè)backup master朴皆,如果active master失敗帕识,它創(chuàng)建的/master就會(huì)被Zookeeper自動(dòng)刪除。這時(shí)backup master就會(huì)收到通知遂铡,通過再次創(chuàng)建/master節(jié)點(diǎn)成為新的active master肮疗。
- worker通過在/workers下面創(chuàng)建臨時(shí)節(jié)點(diǎn)來加入集群。
-
處于active狀態(tài)的master會(huì)通過watch機(jī)制監(jiān)控/workers下面的znode列表來實(shí)時(shí)獲取worker成員的變化扒接。
6伪货、通過zkCli.sh模擬實(shí)現(xiàn)master-worker
1) 通過命令 ls -R / 查看znode狀態(tài)
2)創(chuàng)建 workers们衙,并退出
create /workers
quit
3)創(chuàng)建master1并配置主機(jī)名和端口號(hào)
create -e /master "m1:2223"
創(chuàng)建成功,此時(shí)處于active狀態(tài)超歌,可以行使master職能
4)另啟動(dòng)一個(gè)客戶端砍艾,創(chuàng)建master2并配置主機(jī)名和端口號(hào)
create -e /master "m2:2223"
此時(shí)會(huì)創(chuàng)建失敗,只能處于backup狀態(tài)
通過stat命令巍举,來監(jiān)控master節(jié)點(diǎn)的變化
stat -w /master
5)假設(shè)master1失敶嗪伞(quit退出)
此時(shí)master2 會(huì)收到一個(gè)通知,然后再去創(chuàng)建master的znode節(jié)點(diǎn)懊悯,則會(huì)創(chuàng)建成功
create -e /master "m2:2223"
6)如果master創(chuàng)建成功蜓谋,通過命令
ls -w /workers
來監(jiān)控workers目錄下znode 節(jié)點(diǎn)的變化
7)另啟動(dòng)客戶端,在workers目錄下創(chuàng)建一個(gè)znode節(jié)點(diǎn)
create -e /workers/w1 "w1:2224"
此時(shí)master會(huì)收到一個(gè)通知:type:NodeChildrenChanged path:/workers
8)在master中炭分,再次監(jiān)控workers目錄變化:
ls -w /workers
9)另啟動(dòng)客戶端桃焕,再創(chuàng)建一個(gè)workers節(jié)點(diǎn)
create -e /workers/w2 "w2:2224"
此時(shí)master又收到一個(gè)通知:type:NodeChildrenChanged path:/workers
10)在master中,通過命令:
ls -w /workers
查看workers目錄下的節(jié)點(diǎn)狀況
11)此時(shí)退出(quit)w2節(jié)點(diǎn)來假設(shè)w2節(jié)點(diǎn)失敗捧毛,此時(shí)master節(jié)點(diǎn)也會(huì)收到一個(gè)通知:
type:NodeChildrenChanged path:/workers
12)在master中观堂,通過命令
ls -w /workers
查看workers目錄下節(jié)點(diǎn)情況
以上說明master可以實(shí)時(shí)監(jiān)控workers目錄下節(jié)點(diǎn)的變化,從而來做出相應(yīng)的反應(yīng)呀忧。
7师痕、 其他問題
1)ZooKeeper的watch是one-time trigger。一個(gè)Watch收一次通知而账。
2)ls -w 和 stat -w 的區(qū)別胰坟。
ls列出一個(gè)znode下的子znode列表,stat是返回一個(gè)znode的stat信息泞辐。
-w選項(xiàng)是用來一個(gè)設(shè)置一個(gè)watch笔横,適用于ls和stat。
3)
1.為什么第一個(gè)創(chuàng)建的znode:m1會(huì)成為master咐吼?這跟創(chuàng)建順序有關(guān)系嗎吹缔?
2.如果創(chuàng)建了兩個(gè)znode來監(jiān)聽/workers下的worker,兩個(gè)znode都收到了監(jiān)聽消息锯茄,是否跟唯一master監(jiān)聽worker相悖了涛菠?
在ZooKeeper上面創(chuàng)建/master這個(gè)znode,如果/master這個(gè)znode已經(jīng)存在撇吞,這個(gè)創(chuàng)建就會(huì)失敗。只有一個(gè)節(jié)點(diǎn)創(chuàng)建/master節(jié)點(diǎn)成功了礁叔,它才可以確認(rèn)自已成了master牍颈。因?yàn)閙aster1節(jié)點(diǎn)先做的創(chuàng)建,所以它的創(chuàng)建成功了琅关,它就成了master煮岁。因?yàn)閙aster2后做的創(chuàng)建讥蔽,它的創(chuàng)建就會(huì)失敗,它就知道自己沒能成為master画机。
多個(gè)節(jié)點(diǎn)必須遵循先成功創(chuàng)建/master這個(gè)znode冶伞,再監(jiān)聽/workers下的worker才能能保證master的唯一性。