更新時(shí)間:2020-10-30 來(lái)源:黑馬程序員 瀏覽量:
Master選舉是一個(gè)在分布式系統(tǒng)中非常常見(jiàn)的應(yīng)用場(chǎng)景。分布式最核心的特性就是能夠?qū)⒕哂歇?dú)立計(jì)算能力的系統(tǒng)單元部署在不同的機(jī)器上,構(gòu)成一個(gè)完整的分布式系統(tǒng)。而與此同時(shí),實(shí)際場(chǎng)景中往往也需要在這些分布在不同機(jī)器上的獨(dú)立系統(tǒng)單元中選出一個(gè)所謂的“老大”,在計(jì)算機(jī)中,我們稱之為Master。
在分布式系統(tǒng)中,Master往往用來(lái)協(xié)調(diào)集群中其他系統(tǒng)單元,具有對(duì)分布式系統(tǒng)狀態(tài)變更的決定權(quán)。例如,在一些讀寫(xiě)分離的應(yīng)用場(chǎng)景中,客戶端的寫(xiě)請(qǐng)求往往是由 Master來(lái)處理的;而在另一些場(chǎng)景中,Master則常常負(fù)責(zé)處理一些復(fù)雜的邏輯,并將處理結(jié)果同步給集群中其他系統(tǒng)單元。Master選舉可以說(shuō)是ZooKeeper最典型的應(yīng)用場(chǎng)景了,接下來(lái),我們就結(jié)合“一種海量數(shù)據(jù)處理與共享模型”這個(gè)具體例子來(lái)看看 ZooKeeper在集群Master選舉中的應(yīng)用場(chǎng)景。
在分布式環(huán)境中,經(jīng)常會(huì)碰到這樣的應(yīng)用場(chǎng)景:集群中的所有系統(tǒng)單元需要對(duì)前端業(yè)務(wù)提供數(shù)據(jù),比如一個(gè)商品
ID,或者是一個(gè)網(wǎng)站輪播廣告的廣告
ID(通常出現(xiàn)在一些廣告投放系統(tǒng)中)等,而這些商品ID或是廣告ID往往需要從一系列的海量數(shù)據(jù)處理中計(jì)算得到——這通常是一個(gè)非常耗費(fèi) I/O 和
CPU資源的過(guò)程。鑒于該計(jì)算過(guò)程的復(fù)雜性,如果讓集群中的所有機(jī)器都執(zhí)行這個(gè)計(jì)算邏輯的話,那么將耗費(fèi)非常多的資源。一種比較好的方法就是只讓集群中的部分,甚至只讓其中的一臺(tái)機(jī)器去處理數(shù)據(jù)計(jì)算,一旦計(jì)算出數(shù)據(jù)結(jié)果,就可以共享給整個(gè)集群中的其他所有客戶端機(jī)器,這樣可以大大減少重復(fù)勞動(dòng),提升性能。 這里我們以一個(gè)簡(jiǎn)單的廣告投放系統(tǒng)后臺(tái)場(chǎng)景為例來(lái)講解這個(gè)模型。
整個(gè)系統(tǒng)大體上可以分成客戶端集群、分布式緩存系統(tǒng)、海量數(shù)據(jù)處理總線和 ZooKeeper四個(gè)部分
首先我們來(lái)看整個(gè)系統(tǒng)的運(yùn)行機(jī)制。圖中的Client集群每天定時(shí)會(huì)通過(guò)ZooKeeper來(lái)實(shí)現(xiàn)Master選舉。選舉產(chǎn)生Master客戶端之后,這個(gè)Master就會(huì)負(fù)責(zé)進(jìn)行一系列的海量數(shù)據(jù)處理,最終計(jì)算得到一個(gè)數(shù)據(jù)結(jié)果,并將其放置在一個(gè)內(nèi)存/數(shù)據(jù)庫(kù)中。同時(shí),Master還需要通知集群中其他所有的客戶端從這個(gè)內(nèi)存/數(shù)據(jù)庫(kù)中共享計(jì)算結(jié)果。
接下去,我們將重點(diǎn)來(lái)看 Master 選舉的過(guò)程,首先來(lái)明確下 Master 選舉的需求:在集群的所有機(jī)器中選舉出一臺(tái)機(jī)器作為Master。針對(duì)這個(gè)需求,通常情況下,我們可以選擇常見(jiàn)的關(guān)系型數(shù)據(jù)庫(kù)中的主鍵特性來(lái)實(shí)現(xiàn):集群中的所有機(jī)器都向數(shù)據(jù)庫(kù)中插入一條相同主鍵 ID 的記錄,數(shù)據(jù)庫(kù)會(huì)幫助我們自動(dòng)進(jìn)行主鍵沖突檢查,也就是說(shuō),所有進(jìn)行插入操作的客戶端機(jī)器中,只有一臺(tái)機(jī)器能夠成功——那么,我們就認(rèn)為向數(shù)據(jù)庫(kù)中成功插入數(shù)據(jù)的客戶端機(jī)器成為Master。
借助數(shù)據(jù)庫(kù)的這種方案確實(shí)可行,依靠關(guān)系型數(shù)據(jù)庫(kù)的主鍵特性能夠很好地保證在集群中選舉出唯一的一個(gè)Master。但是我們需要考慮的另一個(gè)問(wèn)題是,如果當(dāng)前選舉出的Master掛了,那么該如何處理?誰(shuí)來(lái)告訴我Master掛了呢?顯然,關(guān)系型數(shù)據(jù)庫(kù)沒(méi)法通知我們這個(gè)事件。那么,如果使用ZooKeeper是否可以做到這一點(diǎn)呢? 那在之前,我們介紹了ZooKeeper創(chuàng)建節(jié)點(diǎn)的API接口,其中一個(gè)重要特性便是:利用ZooKeeper的強(qiáng)一致性,能夠很好保證在分布式高并發(fā)情況下節(jié)點(diǎn)的創(chuàng)建一定能夠保證全局唯一性,即ZooKeeper將會(huì)保證客戶端無(wú)法重復(fù)創(chuàng)建一個(gè)已經(jīng)存在的數(shù)據(jù)節(jié)點(diǎn)。也就是說(shuō),如果同時(shí)有多個(gè)客戶端請(qǐng)求創(chuàng)建同一個(gè)節(jié)點(diǎn),那么最終一定只有一個(gè)客戶端請(qǐng)求能夠創(chuàng)建成功。利用這個(gè)特性,就能很容易地在分布式環(huán)境中進(jìn)行Master選舉了。
在這個(gè)系統(tǒng)中,首先會(huì)在 ZooKeeper
上創(chuàng)建一個(gè)日期節(jié)點(diǎn),例如“2020-11-11
客戶端集群每天都會(huì)定時(shí)往ZooKeeper 上創(chuàng)建一個(gè)臨時(shí)節(jié)點(diǎn),例如/master_election/2020-11-11/binding。在這個(gè)過(guò)程中,只有一個(gè)客戶端能夠成功創(chuàng)建這個(gè)節(jié)點(diǎn),那么這個(gè)客戶端所在的機(jī)器就成為了Master。同時(shí),其他沒(méi)有在ZooKeeper上成功創(chuàng)建節(jié)點(diǎn)的客戶端,都會(huì)在節(jié)點(diǎn)/master_election/2020-11-11 上注冊(cè)一個(gè)子節(jié)點(diǎn)變更的 Watcher,用于監(jiān)控當(dāng)前的 Master 機(jī)器是否存活,一旦發(fā)現(xiàn)當(dāng)前的 Master 掛了,那么其余的客戶端將會(huì)重新進(jìn)行Master選舉。
從上面的講解中,我們可以看到,如果僅僅只是想實(shí)現(xiàn)Master選舉的話,那么其實(shí)只需要有一個(gè)能夠保證數(shù)據(jù)唯一性的組件即可,例如關(guān)系型數(shù)據(jù)庫(kù)的主鍵模型就是非常不錯(cuò)的選擇。但是,如果希望能夠快速地進(jìn)行集群
Master 動(dòng)態(tài)選舉,那么就可以基于 ZooKeeper來(lái)實(shí)現(xiàn)。
猜你喜歡: