您好,歡迎進(jìn)入銳速云官網(wǎng)!
售后熱線:4006-5050-10 QQ客服:2852917158 登錄 注冊(cè)
LinkedIn開源Kafka Cruise Control,旨在使Kafka實(shí)現(xiàn)大規(guī)模運(yùn)維自動(dòng)化!
在過(guò)去這幾年,Apache Kafka的人氣急劇上升。實(shí)際上,LinkedIn部署的系統(tǒng)最近每天處理的消息超過(guò)2萬(wàn)億個(gè),有 1800多臺(tái)Kafka服務(wù)器(即代理,broker)。雖然事實(shí)證明Kafka很穩(wěn)定,但是在規(guī)模如此龐大的環(huán)境下運(yùn)行Kafka還是面臨運(yùn)維方面的挑戰(zhàn)。代理每天都在失效,這導(dǎo)致我們的集群上工作負(fù)載不均衡。因而,網(wǎng)站可靠性工程師(SRE)投入大量的時(shí)間和精力來(lái)重新分配分區(qū),以便讓Kafka集群恢復(fù)均衡。
在這種情況下,智能自動(dòng)化至關(guān)重要,這就是為什么我們開發(fā)了Cruise Control(https://github.com/linkedin/cruise-control):這個(gè)通用系統(tǒng)可不斷監(jiān)控我們的集群,自動(dòng)調(diào)整分配給集群的資源,以滿足預(yù)定的性能目標(biāo)。實(shí)際上,用戶明確指定目標(biāo),Cruise Control負(fù)責(zé)監(jiān)控有無(wú)違反這些目標(biāo),分析集群上的現(xiàn)有工作負(fù)載,并自動(dòng)執(zhí)行管理運(yùn)維,以滿足那些目標(biāo)。你可以在此查看視頻(https://www.youtube.com/watch?v=lf31udm9cYY),內(nèi)容關(guān)于去年秋天的數(shù)據(jù)流處理大會(huì)上介紹的Cruise Control。
今天我們很高興宣布開源Cruise Control,現(xiàn)在它放在Github上。我們?cè)诒疚闹袑⒚枋鯟ruise Control的一般用途和其在LinkedIn的用途、體系結(jié)構(gòu),以及我們當(dāng)初開發(fā)它時(shí)面臨的一些獨(dú)特挑戰(zhàn)。想進(jìn)一步深入了解本文中使用的Kafka術(shù)語(yǔ),這份參考資料(https://github.com/jet/kafunk/wiki/Kafka-Crash-Cource)大有幫助。
設(shè)計(jì)目標(biāo)
我們當(dāng)初設(shè)計(jì)Cruise Control時(shí)想到了幾個(gè)重要的需求:
可靠的自動(dòng)化:CruiseControl應(yīng)該能夠準(zhǔn)確地分析集群工作負(fù)載,并生成執(zhí)行計(jì)劃,這些計(jì)劃可放心地運(yùn)行,根本不需要人干預(yù)。
節(jié)省資源:CruiseControl足夠智能化,在執(zhí)行操作時(shí)并不給集群處理正常工作負(fù)載的可用性帶來(lái)負(fù)面影響,
可擴(kuò)展性:Kafka用戶對(duì)于部署的Kafka系統(tǒng)在可用性和性能方面有不同的需求,會(huì)使用不同的部署工具、管理端點(diǎn)和度量指標(biāo)收集機(jī)制。Cruise Control必須能夠滿足用戶指定的隨意目標(biāo),并執(zhí)行用戶指定的操作。
通用性:我們很早就認(rèn)識(shí)到,其他分布式系統(tǒng)也能得益于需要這類可識(shí)別應(yīng)用的監(jiān)控/分析/操作周期的類似的運(yùn)維自動(dòng)化。雖然一些現(xiàn)有的產(chǎn)品有助于集群中的資源利用率實(shí)現(xiàn)均衡,但大多數(shù)與應(yīng)用無(wú)關(guān),通過(guò)遷移整個(gè)應(yīng)用過(guò)程來(lái)執(zhí)行重新均衡。雖然這適用于無(wú)狀態(tài)的系統(tǒng),不過(guò)由于與這個(gè)過(guò)程有關(guān)的大量狀態(tài),面對(duì)有狀態(tài)的系統(tǒng)(比如Kafka)時(shí),它通常無(wú)能為力。因此,我們想要Cruise Control成為一種通用框架,可以明白具體的應(yīng)用,只遷移部分狀態(tài),可以用在任何有狀態(tài)的分布式系統(tǒng)中。
LinkedIn的CruiseControl
我們目前針對(duì)Kafka部署的Cruise Control旨在解決下列重要的運(yùn)維和報(bào)告目標(biāo):
必須從磁盤、網(wǎng)絡(luò)和CPU利用率方面不斷均衡Kafka集群。
某個(gè)代理失效時(shí),我們需要自動(dòng)將該代理上的副本重新分配到集群中的其他代理,并恢復(fù)原來(lái)的復(fù)制因子(replication factor)。
我們需要能夠識(shí)別集群中耗用最多資源的主題分區(qū)。
我們需要支持低接觸(low-touch)的集群擴(kuò)展和代理停用。由于為集群添加代理或從集群刪除代理后需要手動(dòng)重新分配分區(qū),這些操作原本很費(fèi)勁。
能夠運(yùn)行配備異構(gòu)硬件的集群很有用,比如說(shuō),缺少同樣的硬件時(shí),可以迅速修復(fù)硬件故障。然而,異構(gòu)硬件加大了運(yùn)維開銷,因?yàn)镾RE在均衡這類集群時(shí),對(duì)硬件差異要非常留意。Cruise Control應(yīng)該能夠支持異構(gòu)的Kafka集群和每臺(tái)機(jī)器的多個(gè)代理。
它是如何工作的?
Cruise Control遵循監(jiān)控/分析/操作這個(gè)工作周期。下圖描述了Cruise Control的體系結(jié)構(gòu)。許多組件是可插入的,如該圖重點(diǎn)顯示的(比如度量指標(biāo)采樣器和分析器等)。
REST API
Cruise Control提供了一個(gè)REST API,讓用戶可以與之交互。REST API支持工作負(fù)載查詢和Kafka集群的優(yōu)化方案,還支持管理運(yùn)維的觸發(fā)。
負(fù)載監(jiān)控器
負(fù)載監(jiān)控器(Load Monitor)從集群收集標(biāo)準(zhǔn)的Kafka度量指標(biāo),并根據(jù)分區(qū)獲得并不直接可用的資源度量指標(biāo)(比如根據(jù)每個(gè)分區(qū)估計(jì)CPU利用率)。然后,它生成一個(gè)準(zhǔn)確記錄集群資源利用率的集群工作負(fù)載模型,資源利用率包括磁盤利用率、CPU利用率、字節(jié)輸入速率和字節(jié)輸出速率,達(dá)到了副本的精細(xì)度。然后,它將集群模型饋入到檢測(cè)器和分析器。
分析器
分析器好比是Cruise Control的“大腦”。它使用啟發(fā)式方法,基于用戶提供的優(yōu)化目標(biāo)和來(lái)自負(fù)載監(jiān)控器的集群工作負(fù)載模型來(lái)生成優(yōu)化方案。
優(yōu)化目標(biāo)擁有基于用戶配置的優(yōu)先級(jí)。優(yōu)先級(jí)較高的目標(biāo)比優(yōu)先級(jí)低的目標(biāo)更有可能達(dá)到。低優(yōu)先級(jí)目標(biāo)的優(yōu)化并不會(huì)違反高優(yōu)先級(jí)目標(biāo)。
Cruise Control還允許指定硬性目標(biāo)和軟性目標(biāo)。硬性目標(biāo)是指必須滿足的目標(biāo)(比如副本布置必須做到可識(shí)別機(jī)架)。另一方面,軟性目標(biāo)可以不用達(dá)到,如果這么做可以滿足所有的硬性目標(biāo)。如果經(jīng)過(guò)優(yōu)化的結(jié)果違反了硬性目標(biāo),優(yōu)化就會(huì)失效。硬性目標(biāo)的優(yōu)先級(jí)通常會(huì)高于軟性目標(biāo)。到目前為止,我們已實(shí)現(xiàn)了下列硬性和軟性目標(biāo):
硬性目標(biāo)
副本布置必須做到可識(shí)別機(jī)架。同一分區(qū)的副本放在不同的機(jī)架上,那樣某個(gè)機(jī)架宕機(jī)后,任何分區(qū)頂多損失一個(gè)副本。這有助于控制故障邊界,讓Kafka來(lái)得更可靠。
代理的資源利用率必須在事先定義的閾值以內(nèi)。
網(wǎng)絡(luò)利用率不得超過(guò)事先定義的容量,即便該代理上的所有副本都成為leader。在這種情況下,所有使用者流量將重定向至該代理,因而導(dǎo)致網(wǎng)絡(luò)利用率高于平常。
軟性目標(biāo)
試圖所有代理都實(shí)現(xiàn)一致的資源利用率。
試圖諸代理的leader分區(qū)都實(shí)現(xiàn)一致的字節(jié)輸入速率(即來(lái)自客戶端而不是來(lái)自復(fù)制的字節(jié)輸入速率)。
試圖將特定主題的分區(qū)均衡地分配到所有代理上。
試圖將副本(全局性)均衡地分配到所有代理上。
目標(biāo)優(yōu)化邏輯大體上如下:
異常檢測(cè)器
異常檢測(cè)器可識(shí)別兩種類型的異常:
代理故障:即非空代理離開集群,這導(dǎo)致了副本數(shù)不足的分區(qū)。由于這在正常的集群bounce過(guò)程中也會(huì)發(fā)生,異常檢測(cè)器在觸發(fā)通知器、修復(fù)集群之前提供了一段可配置的寬限期。
目標(biāo)違反:即違反優(yōu)化目標(biāo)。如果啟用了自愈功能,Cruise Control會(huì)自動(dòng)分析工作負(fù)載,執(zhí)行優(yōu)化方案,從而積極地試圖解決目標(biāo)違反問(wèn)題。
執(zhí)行器
執(zhí)行器負(fù)責(zé)執(zhí)行來(lái)自分析器的優(yōu)化方案。重新均衡Kafka集群通常需要重新分配分區(qū)。執(zhí)行器確保執(zhí)行可感知資源,并不讓任何代理不堪重負(fù)。重新分配分區(qū)還可能是個(gè)長(zhǎng)時(shí)間運(yùn)行的過(guò)程――在龐大的Kafka集群中,可能要好幾天才能完成。有時(shí)候,用戶想要停止進(jìn)行中的分區(qū)重新分配。執(zhí)行器采用了這樣的方式來(lái)設(shè)計(jì):執(zhí)行方案時(shí),可以安全地中斷。
值得關(guān)注的挑戰(zhàn)
我們?cè)陂_發(fā)和使用Cruise Control時(shí)遇到了許多值得關(guān)注的挑戰(zhàn)。下面列出了其中的幾個(gè)挑戰(zhàn)。
為Kafka打造一種可靠的集群工作負(fù)載模型
這不像聽起來(lái)那么簡(jiǎn)單。有好多細(xì)節(jié)地方要注意。比如說(shuō),從代理收集CPU利用率的度量指標(biāo)簡(jiǎn)單直觀,但是我們?nèi)绾瘟炕總€(gè)分區(qū)給CPU利用率帶來(lái)的影響?這個(gè)維基頁(yè)面(https://github.com/linkedin/cruise-control/wiki/Build-the-cluster-workload-model)解釋了我們是如何解答這個(gè)問(wèn)題的。
你愿意為優(yōu)化方案等多久?
分析器組件取得了巨大的進(jìn)展。我們最初使用了一種通用優(yōu)化器,帶有復(fù)雜的參數(shù)化損失函數(shù)。在中等大小的Kafka集群上獲得優(yōu)化方案就算不需要數(shù)年,至少也需要數(shù)周。后來(lái)我們改用了目前的啟發(fā)式優(yōu)化器解決方案,這讓我們?cè)诙潭處追昼妰?nèi)獲得了相當(dāng)好的結(jié)果。
內(nèi)存還是速度?
由于我們要將眾多的度量指標(biāo)保存一段時(shí)間(比如一周),以便分析Kafka集群中分區(qū)的流量模式,Cruise Control非常耗費(fèi)內(nèi)存。由于生成優(yōu)化方案勢(shì)必需要相應(yīng)的計(jì)算操作,它還很耗費(fèi)CPU資源。然而,那兩個(gè)方面有點(diǎn)彼此沖突。為了加快生成方案的速度,我們想要處理更多的緩存和并行方案計(jì)算,但是這么做耗用更多的內(nèi)存。我們最終做了一些設(shè)計(jì)方面的決定,以便兼顧兩者。比如說(shuō),我們預(yù)先計(jì)算優(yōu)化方案,并緩存起來(lái),那樣用戶開始查詢時(shí),可避免長(zhǎng)時(shí)間等待。另一方面,我們還錯(cuò)開內(nèi)存密集型任務(wù)(比如方案預(yù)先計(jì)算和異常檢測(cè)等)的執(zhí)行,避免同時(shí)大量耗用內(nèi)存的情況出現(xiàn)。
未來(lái)的工作
實(shí)現(xiàn)更多的Kafka集群優(yōu)化目標(biāo)!
由于Cruise Control的優(yōu)化目標(biāo)可插入,用戶可能會(huì)根據(jù)需要,提出錯(cuò)綜復(fù)雜的目標(biāo)來(lái)優(yōu)化各自的Kafka集群。比如說(shuō),我們?cè)贚inkedIn內(nèi)部使用Kafka監(jiān)控器,監(jiān)控集群可用性。由于Kafka監(jiān)控器根據(jù)每個(gè)代理向“監(jiān)控器”主題發(fā)送消息的功能,報(bào)告代理的可用性,我們需要確保該主題的分區(qū)的leader覆蓋所有代理。作為一個(gè)開源項(xiàng)目,我們還希望鼓勵(lì)用戶創(chuàng)建各自的目標(biāo),并將它們貢獻(xiàn)給社區(qū)。
與云管理系統(tǒng)(CMS)整合起來(lái)
目前,Cruise Control通過(guò)從壞掉的代理遷移分區(qū)來(lái)修復(fù)集群。我們?cè)O(shè)想,Cruise Control有望與其他CMS整合起來(lái),利用率達(dá)到某個(gè)閾值時(shí),可自動(dòng)擴(kuò)展集群,或者必要時(shí),用來(lái)自閑置代理池的新代理替換壞的代理。如上所述,我們歡迎社區(qū)獻(xiàn)計(jì)獻(xiàn)策,為這項(xiàng)未來(lái)的功能作出貢獻(xiàn)。
借助洞察力助力運(yùn)維
Cruise Control便于對(duì)從Kafka收集的度量指標(biāo)執(zhí)行深度分析。我們認(rèn)為,它將讓SRE能夠量化各個(gè)資源使用率度量指標(biāo)的影響,并獲得洞察力,從而幫助容量規(guī)劃和性能調(diào)優(yōu)。
推而廣之
我們?cè)陂_發(fā)Cruise Control時(shí)就認(rèn)識(shí)到,對(duì)任何分布式系統(tǒng)而言,動(dòng)態(tài)的負(fù)載均衡機(jī)制是一種實(shí)用的工具。Cruise Control針對(duì)度量指標(biāo)聚合、資源利用率分析和生成優(yōu)化方案的各組件同樣適用于其他分布式系統(tǒng)。從長(zhǎng)遠(yuǎn)來(lái)看,我們希望抽取那些核心組件,將它們提供給其他項(xiàng)目。我們對(duì)Cruise Control懷有的愿景是,讓人們可以與任何分布式系統(tǒng)輕松整合起來(lái),為針對(duì)特定應(yīng)用的性能分析、優(yōu)化和執(zhí)行提供便利。
粵公網(wǎng)安備 44030902000612號(hào)