溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么打造規(guī)模大的Kafka集群

發(fā)布時(shí)間:2021-11-22 09:49:58 來(lái)源:億速云 閱讀:210 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“怎么打造規(guī)模大的Kafka集群”,在日常操作中,相信很多人在怎么打造規(guī)模大的Kafka集群?jiǎn)栴}上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”怎么打造規(guī)模大的Kafka集群”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

- Uber 的 Kafka 生態(tài)系統(tǒng) -

Uber 擁有世界上最大的 Kafka 集群,每天處理數(shù)萬(wàn)億條消息和幾個(gè) PB 的數(shù)據(jù)。如圖 1 所示,Kafka 現(xiàn)在成了 Uber 技術(shù)棧的基石,我們基于這個(gè)基石構(gòu)建了一個(gè)復(fù)雜的生態(tài)系統(tǒng),為大量不同的工作流提供支持。其中包含了一個(gè)用于傳遞來(lái)自乘客和司機(jī) App 事件數(shù)據(jù)的發(fā)布/訂閱消息總線、為流式分析平臺(tái)(如 Apache Samza、Apache Flink)提供支持、將數(shù)據(jù)庫(kù)變更日志流到下游訂閱者,并將各種數(shù)據(jù)接收到 Uber 的 Hadoop 數(shù)據(jù)湖中。

怎么打造規(guī)模大的Kafka集群

圖 1:Uber 的 Kafka 生態(tài)系統(tǒng)

為了能夠基于 Kafka 構(gòu)建一個(gè)可伸縮、可靠、高性能、易于使用的消息傳遞平臺(tái),我們克服了許多挑戰(zhàn)。在這篇文章中,我們將著重介紹在進(jìn)行災(zāi)難恢復(fù)(因集群宕機(jī)導(dǎo)致)時(shí)所面臨的一個(gè)挑戰(zhàn),并分享我們?nèi)绾螛?gòu)建一個(gè)多區(qū)域的 Kafka 基礎(chǔ)設(shè)施。

- Uber 的 Kafka 多區(qū)域部署 -

提供業(yè)務(wù)彈性和連續(xù)性是 Uber 的首要任務(wù)。我們制定了詳細(xì)的災(zāi)難恢復(fù)計(jì)劃,盡量減少自然和人為災(zāi)難(如停電、災(zāi)難性軟件故障和網(wǎng)絡(luò)中斷)對(duì)業(yè)務(wù)的影響。我們采用多區(qū)域部署策略,將服務(wù)與備份一起部署在分布式的數(shù)據(jù)中心中。當(dāng)一個(gè)區(qū)域的物理基礎(chǔ)設(shè)施不可用時(shí),服務(wù)仍然可以在其他區(qū)域運(yùn)行。

我們構(gòu)建了一個(gè)多區(qū)域 Kafka 架構(gòu),實(shí)現(xiàn)了數(shù)據(jù)冗余,為區(qū)域故障轉(zhuǎn)移提供支持。Uber 技術(shù)棧中的很多服務(wù)都依賴 Kafka 來(lái)實(shí)現(xiàn)區(qū)域級(jí)故障轉(zhuǎn)移。這些服務(wù)是 Kafka 的下游,并假定 Kafka 中的數(shù)據(jù)是可用且可靠的。

圖 2 描繪了多區(qū)域 Kafka 架構(gòu)。我們有兩種集群:生產(chǎn)者在本地向區(qū)域集群發(fā)布消息,將來(lái)自區(qū)域集群的消息復(fù)制到聚合集群,以此來(lái)提供全局視圖。為簡(jiǎn)單起見,圖 2 只顯示了兩個(gè)區(qū)域的集群。

怎么打造規(guī)模大的Kafka集群

圖 2:兩個(gè)區(qū)域之間的 Kafka 復(fù)制拓?fù)?/p>

在每個(gè)區(qū)域,生產(chǎn)者總是在本地生產(chǎn)消息,以便獲得更好的性能,當(dāng) Kafka 集群不可用時(shí),生產(chǎn)者會(huì)轉(zhuǎn)移到另一個(gè)區(qū)域,然后向該區(qū)域的區(qū)域集群生產(chǎn)消息。

這個(gè)架構(gòu)中的一個(gè)關(guān)鍵部分是消息復(fù)制。消息從區(qū)域集群異步復(fù)制到其他區(qū)域的聚合集群。

- 從多區(qū)域 Kafka 集群消費(fèi)消息 -

從多區(qū)域集群消費(fèi)消息比生產(chǎn)消息更為復(fù)雜。多區(qū)域 Kafka 集群支持兩種類型的消費(fèi)模式。

· 雙活模式

一種常見的類型是雙活(Active/Active)消費(fèi)模式,消費(fèi)者在各自區(qū)域中消費(fèi)聚合集群的主題。Uber 的很多應(yīng)用程序使用這種模式消費(fèi)多區(qū)域 Kafka 集群里的消息,而不是直接連接到其他區(qū)域。當(dāng)一個(gè)區(qū)域發(fā)生故障時(shí),如果 Kafka 流在兩個(gè)區(qū)域都可用,并且包含了相同的數(shù)據(jù),那么消費(fèi)者就會(huì)切換到另一個(gè)區(qū)域。

例如,圖 3 顯示了 Uber 的動(dòng)態(tài)定價(jià)服務(wù)(即峰時(shí)定價(jià))如何使用雙活模式來(lái)構(gòu)建災(zāi)備計(jì)劃。價(jià)格是根據(jù)附近地區(qū)最近一系列打車數(shù)據(jù)來(lái)計(jì)算的。所有的打車事件都被發(fā)送到 Kafka 區(qū)域集群,然后聚合到聚合集群中。然后,在每個(gè)區(qū)域,一個(gè)復(fù)雜的、占用大量?jī)?nèi)存的 Flink 作業(yè)負(fù)責(zé)計(jì)算不同區(qū)域的價(jià)格。接下來(lái),一個(gè)全活服務(wù)負(fù)責(zé)協(xié)調(diào)各個(gè)區(qū)域的更新服務(wù),并分配一個(gè)區(qū)域作為主區(qū)域。主區(qū)域的更新服務(wù)將定價(jià)結(jié)果保存到雙活數(shù)據(jù)庫(kù)中,以便進(jìn)行快速查詢。

怎么打造規(guī)模大的Kafka集群

圖 3:雙活消費(fèi)模式架構(gòu)

當(dāng)主區(qū)域發(fā)生災(zāi)難時(shí),雙活服務(wù)會(huì)將另一個(gè)區(qū)域作為主區(qū)域,峰時(shí)價(jià)格計(jì)算會(huì)轉(zhuǎn)移到另一個(gè)區(qū)域。需要注意的是,F(xiàn)link 作業(yè)的計(jì)算狀態(tài)規(guī)模太大了,無(wú)法在區(qū)域之間同步復(fù)制,因此必須使用聚合集群的輸入消息來(lái)計(jì)算其狀態(tài)。

我們從實(shí)踐中獲得了一個(gè)很關(guān)鍵的經(jīng)驗(yàn),可靠的多區(qū)域基礎(chǔ)設(shè)施服務(wù)(如 Kafka)可以極大地簡(jiǎn)化應(yīng)用程序針對(duì)業(yè)務(wù)連續(xù)性計(jì)劃的開發(fā)工作。應(yīng)用程序可以將狀態(tài)存儲(chǔ)在基礎(chǔ)設(shè)施層中,從而變成無(wú)狀態(tài)的,將狀態(tài)管理的復(fù)雜性(如跨區(qū)域的同步和復(fù)制)留給基礎(chǔ)設(shè)施服務(wù)。

· 主備模式

另一種多區(qū)域消費(fèi)模式是主備模式(Active/Passive):一次只允許一個(gè)消費(fèi)者(通過唯一名稱標(biāo)識(shí))從一個(gè)區(qū)域(即主區(qū)域)的聚合集群中消費(fèi)消息。多區(qū)域 Kafka 集群跟蹤主區(qū)域的消費(fèi)進(jìn)度(用偏移量表示),并將偏移量復(fù)制到其他區(qū)域。在主區(qū)域出現(xiàn)故障時(shí),消費(fèi)者可以故障轉(zhuǎn)移到另一個(gè)區(qū)域并恢復(fù)消費(fèi)進(jìn)度。主備模式通常被支持強(qiáng)一致性的服務(wù)(如支付處理和審計(jì))所使用。

在使用主備模式時(shí),區(qū)域間消費(fèi)者的偏移量同步是一個(gè)關(guān)鍵問題。當(dāng)用戶故障轉(zhuǎn)移到另一個(gè)區(qū)域時(shí),它需要重置偏移量,以便恢復(fù)消費(fèi)進(jìn)度。由于 Uber 的很多服務(wù)不能接受數(shù)據(jù)丟失,所以消費(fèi)者無(wú)法從高水位(即最新消息)恢復(fù)消費(fèi)。另外,為了避免過多的積壓,消費(fèi)者也不能從低水位(即最早的消息)恢復(fù)消費(fèi)。此外,從區(qū)域集群聚合到聚合集群的消息可能會(huì)變得無(wú)序。由于跨區(qū)域復(fù)制延遲,消息從區(qū)域集群復(fù)制到本地聚合集群的速度比遠(yuǎn)程聚合集群要快。因此,聚合集群中的消息順序可能會(huì)不一樣。例如,在圖 4a 中,消息 A1、A2、B1、B2 幾乎是同時(shí)發(fā)布到區(qū)域 A 和區(qū)域 B 的區(qū)域集群中,但經(jīng)過聚合后,它們?cè)趦蓚€(gè)聚合集群中的順序是不一樣的。

怎么打造規(guī)模大的Kafka集群

圖 4:a.跨區(qū)域消息復(fù)制 b.消息復(fù)制檢查點(diǎn)

為了管理這些區(qū)域的偏移量映射,我們開發(fā)了一個(gè)復(fù)雜的偏移量管理服務(wù),架構(gòu)如圖 5 所示。當(dāng) uReplicator 將消息從源集群復(fù)制到目標(biāo)集群時(shí),它會(huì)定期檢查從源到目標(biāo)的偏移量映射。例如,圖 4b 顯示了圖 4a 消息復(fù)制的偏移量映射。表的第一行記錄了區(qū)域 A 區(qū)域集群的消息 A2(在區(qū)域集群中的偏移量是 1)映射到區(qū)域 A 聚合集群的消息 A2(在聚合集群中的偏移量是 1)。同樣,其余行記錄了其他復(fù)制路線的檢查點(diǎn)。

偏移量管理服務(wù)將這些檢查點(diǎn)保存在雙活數(shù)據(jù)庫(kù)中,并用它們來(lái)計(jì)算給定的主備消費(fèi)者的偏移量映射。同時(shí),一個(gè)偏移量同步作業(yè)負(fù)責(zé)定期同步兩個(gè)區(qū)域之間的偏移量。當(dāng)一個(gè)主備消費(fèi)者從一個(gè)區(qū)域轉(zhuǎn)移到另一個(gè)區(qū)域時(shí),可以獲取到最新的偏移量,并用它來(lái)恢復(fù)消費(fèi)。

怎么打造規(guī)模大的Kafka集群

圖 5:偏移量管理服務(wù)架構(gòu)

偏移量映射算法的工作原理如下:在活躍的消費(fèi)者正在消費(fèi)的聚合集群中找到每個(gè)區(qū)域集群的最近檢查點(diǎn)。然后,對(duì)于每個(gè)區(qū)域檢查點(diǎn)的源偏移量,找到它們?cè)诹硪粋€(gè)區(qū)域聚合集群對(duì)應(yīng)的檢查點(diǎn)。最后,在另一個(gè)區(qū)域的聚合集群中取最小的那個(gè)偏移量。

在圖 6 中,假設(shè)活躍消費(fèi)者目前的進(jìn)度是區(qū)域 B 的 A3 消息(偏移量為 6)。根據(jù)右邊的表檢查點(diǎn),最近的兩個(gè)檢查點(diǎn)分別是偏移量為 3(藍(lán)色)的 A2 和偏移量為 5(紅色)的 B4,分別對(duì)應(yīng)區(qū)域集群 A 中偏移量 1(藍(lán)色)和區(qū)域集群 B 的偏移量 3(紅色)。這些源偏移量映射到區(qū)域 A 聚合集群的偏移量 1(藍(lán)色)和偏移量 7(紅色)。根據(jù)算法,被動(dòng)消費(fèi)者(黑色)取兩者中較小的偏移量,即偏移量 1。

怎么打造規(guī)模大的Kafka集群

圖 6:主備消費(fèi)者從一個(gè)區(qū)域失效轉(zhuǎn)移到另一個(gè)區(qū)域 

到此,關(guān)于“怎么打造規(guī)模大的Kafka集群”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI