首頁(yè)技術(shù)文章正文

ZooKeeper集群管理【黑馬程序員】

更新時(shí)間:2020-10-30 來(lái)源:黑馬程序員 瀏覽量:

隨著分布式系統(tǒng)規(guī)模的日益擴(kuò)大,集群中的機(jī)器規(guī)模也隨之變大,那如何更好地進(jìn)行集群管理也顯得越來(lái)越重要了。所謂集群管理,包括集群監(jiān)控與集群控制兩大塊,前者側(cè)重對(duì)集群運(yùn)行時(shí)狀態(tài)的收集,后者則是對(duì)集群進(jìn)行操作與控制。

在日常開(kāi)發(fā)和運(yùn)維過(guò)程中,我們經(jīng)常會(huì)有類似于如下的需求:

·如何快速的統(tǒng)計(jì)出當(dāng)前生產(chǎn)環(huán)境下一共有多少臺(tái)機(jī)器

·如何快速的獲取到機(jī)器上下線的情況

·如何實(shí)時(shí)監(jiān)控集群中每臺(tái)主機(jī)的運(yùn)行時(shí)狀態(tài)

在傳統(tǒng)的基于Agent的分布式集群管理體系中,都是通過(guò)在集群中的每臺(tái)機(jī)器上部署一個(gè) Agent,由這個(gè) Agent 負(fù)責(zé)主動(dòng)向指定的一個(gè)監(jiān)控中心系統(tǒng)(監(jiān)控中心系統(tǒng)負(fù)責(zé)將所有數(shù)據(jù)進(jìn)行集中處理,形成一系列報(bào)表,并負(fù)責(zé)實(shí)時(shí)報(bào)警,以下簡(jiǎn)稱“監(jiān)控中心”)匯報(bào)自己所在機(jī)器的狀態(tài)。在集群規(guī)模適中的場(chǎng)景下,這確實(shí)是一種在生產(chǎn)實(shí)踐中廣泛使用的解決方案,能夠快速有效地實(shí)現(xiàn)分布式環(huán)境集群監(jiān)控,但是一旦系統(tǒng)的業(yè)務(wù)場(chǎng)景增多,集群規(guī)模變大之后,該解決方案的弊端也就顯現(xiàn)出來(lái)了。

大規(guī)模升級(jí)困難

以客戶端形式存在的 Agent,在大規(guī)模使用后,一旦遇上需要大規(guī)模升級(jí)的情況,就非常麻煩,在升級(jí)成本和升級(jí)進(jìn)度的控制上面臨巨大的挑戰(zhàn)。

統(tǒng)一的Agent無(wú)法滿足多樣的需求

對(duì)于機(jī)器的CPU使用率、負(fù)載(Load)、內(nèi)存使用率、網(wǎng)絡(luò)吞吐以及磁盤(pán)容量等機(jī)器基本的物理狀態(tài),使用統(tǒng)一的Agent來(lái)進(jìn)行監(jiān)控或許都可以滿足。但是,如果需要深入應(yīng)用內(nèi)部,對(duì)一些業(yè)務(wù)狀態(tài)進(jìn)行監(jiān)控,例如,在一個(gè)分布式消息中間件中,希望監(jiān)控到每個(gè)消費(fèi)者對(duì)消息的消費(fèi)狀態(tài);或者在一個(gè)分布式任務(wù)調(diào)度系統(tǒng)中,需要對(duì)每個(gè)機(jī)器上任務(wù)的執(zhí)行情況進(jìn)行監(jiān)控。很顯然,對(duì)于這些業(yè)務(wù)耦合緊密的監(jiān)控需求,不適合由一個(gè)統(tǒng)一的Agent來(lái)提供。

編程語(yǔ)言多樣性

隨著越來(lái)越多編程語(yǔ)言的出現(xiàn),各種異構(gòu)系統(tǒng)層出不窮。如果使用傳統(tǒng)的Agent方式,那么需要提供各種語(yǔ)言的 Agent 客戶端。另一方面,“監(jiān)控中心”在對(duì)異構(gòu)系統(tǒng)的數(shù)據(jù)進(jìn)行整合上面臨巨大挑戰(zhàn)。

Zookeeper的兩大特性:

1.客戶端如果對(duì)Zookeeper的數(shù)據(jù)節(jié)點(diǎn)注冊(cè)Watcher監(jiān)聽(tīng),那么當(dāng)該數(shù)據(jù)節(jié)點(diǎn)的內(nèi)容或是其子節(jié)點(diǎn)列表發(fā)生變更時(shí),Zookeeper服務(wù)器就會(huì)向訂閱的客戶端發(fā)送變更通知。

2.對(duì)在Zookeeper上創(chuàng)建的臨時(shí)節(jié)點(diǎn),一旦客戶端與服務(wù)器之間的會(huì)話失效,那么臨時(shí)節(jié)點(diǎn)也會(huì)被自動(dòng)刪除

利用其兩大特性,可以實(shí)現(xiàn)集群機(jī)器存活監(jiān)控系統(tǒng),若監(jiān)控系統(tǒng)在/clusterServers節(jié)點(diǎn)上注冊(cè)一個(gè)Watcher監(jiān)聽(tīng),那么但凡進(jìn)行動(dòng)態(tài)添加機(jī)器的操作,就會(huì)在/clusterServers節(jié)點(diǎn)下創(chuàng)建一個(gè)臨時(shí)節(jié)點(diǎn):/clusterServers/[Hostname],這樣,監(jiān)控系統(tǒng)就能夠?qū)崟r(shí)監(jiān)測(cè)機(jī)器的變動(dòng)情況。

下面通過(guò)分布式日志收集系統(tǒng)這個(gè)典型應(yīng)用來(lái)學(xué)習(xí)Zookeeper如何實(shí)現(xiàn)集群管理。

分布式日志收集系統(tǒng):

分布式日志收集系統(tǒng)的核心工作就是收集分布在不同機(jī)器上的系統(tǒng)日志,在這里我們重點(diǎn)來(lái)看分布式日志系統(tǒng)(以下簡(jiǎn)稱“日志系統(tǒng)”)的收集器模塊。

在一個(gè)典型的日志系統(tǒng)的架構(gòu)設(shè)計(jì)中,整個(gè)日志系統(tǒng)會(huì)把所有需要收集的日志機(jī)器(我們以“日志源機(jī)器”代表此類機(jī)器)分為多個(gè)組別,每個(gè)組別對(duì)應(yīng)一個(gè)收集器,這個(gè)收集器其實(shí)就是一個(gè)后臺(tái)機(jī)器(我們以“收集器機(jī)器”代表此類機(jī)器),用于收集日志

· 變化的日志源機(jī)器

在生產(chǎn)環(huán)境中,伴隨著機(jī)器的變動(dòng),每個(gè)應(yīng)用的機(jī)器幾乎每天都是在變化的(機(jī)器硬件問(wèn)題、擴(kuò)容、機(jī)房遷移或是網(wǎng)絡(luò)問(wèn)題等都會(huì)導(dǎo)致一個(gè)應(yīng)用的機(jī)器變化),也就是說(shuō)每個(gè)組別中的日志源機(jī)器通常是在不斷變化的。

· 變化的收集器機(jī)器

日志收集系統(tǒng)自身也會(huì)有機(jī)器的變更或擴(kuò)容,于是會(huì)出現(xiàn)新的收集器機(jī)器加入或是老的收集器機(jī)器退出的情況。

無(wú)論是日志源機(jī)器還是收集器機(jī)器的變更,最終都可以歸結(jié)為如何快速、合理、動(dòng)態(tài)地為每個(gè)收集器分配對(duì)應(yīng)的日志源機(jī)器。這也成為了整個(gè)日志系統(tǒng)正確穩(wěn)定運(yùn)轉(zhuǎn)的前提,也是日志收集過(guò)程中最大的技術(shù)挑戰(zhàn)之一,在這種情況下,我們就可以引入zookeeper了,下面我們就來(lái)看ZooKeeper在這個(gè)場(chǎng)景中的使用。

使用Zookeeper的場(chǎng)景步驟如下

① 注冊(cè)收集器機(jī)器

使用ZooKeeper來(lái)進(jìn)行日志系統(tǒng)收集器的注冊(cè),典型做法是在ZooKeeper上創(chuàng)建一個(gè)節(jié)點(diǎn)作為收集器的根節(jié)點(diǎn),例如/logs/collector(下文我們以“收集器節(jié)點(diǎn)”代表該數(shù)據(jù)節(jié)點(diǎn)),每個(gè)收集器機(jī)器在啟動(dòng)的時(shí)候,都會(huì)在收集器節(jié)點(diǎn)下創(chuàng)建自己的節(jié)點(diǎn),例如/logs/collector/[Hostname]

1604040251848_集群管理.jpg

② 任務(wù)分發(fā)

待所有收集器機(jī)器都創(chuàng)建好自己對(duì)應(yīng)的節(jié)點(diǎn)后,系統(tǒng)根據(jù)收集器節(jié)點(diǎn)下子節(jié)點(diǎn)的個(gè)數(shù),將所有日志源機(jī)器分成對(duì)應(yīng)的若干組,然后將分組后的機(jī)器列表分別寫(xiě)到這些收集器機(jī)器創(chuàng)建的子節(jié)點(diǎn)(例如/logs/collector/host1)上去。這樣一來(lái),每個(gè)收集器機(jī)器都能夠從自己對(duì)應(yīng)的收集器節(jié)點(diǎn)上獲取日志源機(jī)器列表,進(jìn)而開(kāi)始進(jìn)行日志收集工作。

③ 狀態(tài)匯報(bào)

完成收集器機(jī)器的注冊(cè)以及任務(wù)分發(fā)后,我們還要考慮到這些機(jī)器隨時(shí)都有掛掉的可能。因此,針對(duì)這個(gè)問(wèn)題,我們需要有一個(gè)收集器的狀態(tài)匯報(bào)機(jī)制:每個(gè)收集器機(jī)器在創(chuàng)建完自己的專屬節(jié)點(diǎn)后,還需要在對(duì)應(yīng)的子節(jié)點(diǎn)上創(chuàng)建一個(gè)狀態(tài)子節(jié)點(diǎn),例如/logs/collector/host1/status,每個(gè)收集器機(jī)器都需要定期向該節(jié)點(diǎn)寫(xiě)入自己的狀態(tài)信息。我們可以把這種策略看作是一種心跳檢測(cè)機(jī)制,通常收集器機(jī)器都會(huì)在這個(gè)節(jié)點(diǎn)中寫(xiě)入日志收集進(jìn)度信息。日志系統(tǒng)根據(jù)該狀態(tài)子節(jié)點(diǎn)的最后更新時(shí)間來(lái)判斷對(duì)應(yīng)的收集器機(jī)器是否存活。

④ 動(dòng)態(tài)分配

如果收集器機(jī)器掛掉或是擴(kuò)容了,就需要?jiǎng)討B(tài)地進(jìn)行收集任務(wù)的分配。在運(yùn)行過(guò)程中,日志系統(tǒng)始終關(guān)注著/logs/collector這個(gè)節(jié)點(diǎn)下所有子節(jié)點(diǎn)的變更,一旦檢測(cè)到有收集器機(jī)器停止匯報(bào)或是有新的收集器機(jī)器加入,就要開(kāi)始進(jìn)行任務(wù)的重新分配。無(wú)論是針對(duì)收集器機(jī)器停止匯報(bào)還是新機(jī)器加入的情況,日志系統(tǒng)都需要將之前分配給該收集器的所有任務(wù)進(jìn)行轉(zhuǎn)移。為了解決這個(gè)問(wèn)題,通常有兩種做法:

· 全局動(dòng)態(tài)分配

這是一種簡(jiǎn)單粗暴的做法,在出現(xiàn)收集器機(jī)器掛掉或是新機(jī)器加入的時(shí)候,日志系統(tǒng)需要根據(jù)新的收集器機(jī)器列表,立即對(duì)所有的日志源機(jī)器重新進(jìn)行一次分組,然后將其分配給剩下的收集器機(jī)器。

· 局部動(dòng)態(tài)分配

全局動(dòng)態(tài)分配方式雖然策略簡(jiǎn)單,但是存在一個(gè)問(wèn)題:一個(gè)或部分收集器機(jī)器的變更,就會(huì)導(dǎo)致全局動(dòng)態(tài)任務(wù)的分配,影響面比較大,因此風(fēng)險(xiǎn)也就比較大。所謂局部動(dòng)態(tài)分配,顧名思義就是在小范圍內(nèi)進(jìn)行任務(wù)的動(dòng)態(tài)分配。在這種策略中,每個(gè)收集器機(jī)器在匯報(bào)自己日志收集狀態(tài)的同時(shí),也會(huì)把自己的負(fù)載匯報(bào)上去。請(qǐng)注意,這里提到的負(fù)載并不僅僅只是簡(jiǎn)單地指機(jī)器CPU負(fù)載(Load),而是一個(gè)對(duì)當(dāng)前收集器任務(wù)執(zhí)行的綜合評(píng)估,這個(gè)評(píng)估算法和ZooKeeper本身并沒(méi)有太大的關(guān)系,這里不再贅述。

在這種策略中,如果一個(gè)收集器機(jī)器掛了,那么日志系統(tǒng)就會(huì)把之前分配給這個(gè)機(jī)器的任務(wù)重新分配到那些負(fù)載較低的機(jī)器上去。同樣,如果有新的收集器機(jī)器加入,會(huì)從那些負(fù)載高的機(jī)器上轉(zhuǎn)移部分任務(wù)給這個(gè)新加入的機(jī)器。

上述步驟已經(jīng)完整的說(shuō)明了整個(gè)日志收集系統(tǒng)的工作流程,其中有兩點(diǎn)注意事項(xiàng):

①節(jié)點(diǎn)類型

在/logs/collector節(jié)點(diǎn)下創(chuàng)建臨時(shí)節(jié)點(diǎn)可以很好的判斷機(jī)器是否存活,但是,若機(jī)器掛了,其節(jié)點(diǎn)會(huì)被刪除,記錄在節(jié)點(diǎn)上的日志源機(jī)器列表也被清除,所以需要選擇持久節(jié)點(diǎn)來(lái)標(biāo)識(shí)每一臺(tái)機(jī)器,同時(shí)在節(jié)點(diǎn)下分別創(chuàng)建/logs/collector/[Hostname]/status節(jié)點(diǎn)來(lái)表征每一個(gè)收集器機(jī)器的狀態(tài),這樣,既能實(shí)現(xiàn)對(duì)所有機(jī)器的監(jiān)控,同時(shí)機(jī)器掛掉后,依然能夠?qū)⒎峙淙蝿?wù)還原。

② 日志系統(tǒng)節(jié)點(diǎn)監(jiān)聽(tīng)

若采用Watcher機(jī)制,那么通知的消息量的網(wǎng)絡(luò)開(kāi)銷非常大,需要采用日志系統(tǒng)主動(dòng)輪詢收集器節(jié)點(diǎn)的策略,這樣可以節(jié)省網(wǎng)絡(luò)流量,但是存在一定的延時(shí)。



猜你喜歡

Zookeeper命名服務(wù) 

ZooKeeper數(shù)據(jù)發(fā)布/訂閱使用教程 




分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!