首頁 資訊 如何解決 Kafka 冷讀副作用

如何解決 Kafka 冷讀副作用

來源:泰然健康網 時間:2024年12月27日 09:49

2024-05-24 115 發(fā)布于浙江

版權

舉報

版權聲明:

本文內容由阿里云實名注冊用戶自發(fā)貢獻,版權歸原作者所有,阿里云開發(fā)者社區(qū)不擁有其著作權,亦不承擔相應法律責任。具體規(guī)則請查看《 阿里云開發(fā)者社區(qū)用戶服務協(xié)議》和 《阿里云開發(fā)者社區(qū)知識產權保護指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內容,填寫 侵權投訴表單進行舉報,一經查實,本社區(qū)將立刻刪除涉嫌侵權內容。

簡介: AutoMQ,新一代云原生 Kafka,解決原 Kafka 的遷移復制低效、彈性不足和高成本問題。本文探討 Kafka 的冷讀(追趕讀)副作用,如硬盤 I/O 爭搶、Page Cache 污染和 Zero Copy 阻塞。Kafka 的冷讀依賴本地存儲,導致性能瓶頸。AutoMQ 通過對象存儲實現(xiàn)冷熱隔離,避免 I/O 爭搶;自主管理內存,減少 Page Cache 污染;異步 I/O 響應網絡層,提高效率。此外,AutoMQ 優(yōu)化冷讀性能,確保批處理和故障恢復時的高效運行。

背景
Apache Kafka (下文簡稱 Kafka)作為一款成功的流處理平臺已經在各行各業(yè)中有廣泛的應用,并且具備極其強大的軟件生態(tài)。但是,其一些缺點也給使用者帶來了很大的挑戰(zhàn)。AutoMQ 是基于云原生架構實現(xiàn)的新一代 Kafka ,與 Kafka 100% 完全兼容。致力于解決 Kafka 原有的遷移復制低效、缺乏彈性、成本高昂等缺點,成為新一代云原生 Kafka 解決方案。

為了讓讀者更好地理解 AutoMQ 相比 Kafka 的優(yōu)勢,我們推出了 《Kafka 痛點專題》 這個系列,幫助讀者更好地理解當前 Kafka 存在的痛點問題以及 AutoMQ 是如何解決這些問題的。今天主要分享的是 Kafka 中冷讀(也可稱追趕讀,即 Catch-up Read )副作用的產生原理,以及 AutoMQ 是如何通過云原生的架構設計來避免原 Kafka 冷讀帶來的副作用的。

冷讀是如何產生的
在消息和流系統(tǒng)中,冷讀是常見且具有重要價值的場景,包括以下幾點:

保證削峰填谷的效果:消息系統(tǒng)通常用于業(yè)務解耦和削峰填谷。在削峰填谷場景中,消息隊列可暫時保存上游數(shù)據(jù),以便下游逐步消費。這些數(shù)據(jù)通常不在內存中,而是需要進行冷讀取。因此,優(yōu)化冷讀效率對于提高削峰填谷的效果至關重要。 批處理場景廣泛應用:在與大數(shù)據(jù)分析場景結合時,Kafka 通常用于批處理。在這種情況下,任務需要從幾個小時甚至一天前的數(shù)據(jù)開始掃描計算。冷讀的效率直接影響了批處理的時效性。 故障恢復效率:在實際生產環(huán)境中,消費者由于邏輯問題或業(yè)務 BUG 導致故障宕機是常見問題。消費者恢復后,需要快速消費堆積的歷史數(shù)據(jù)。提高冷讀效率可以幫助業(yè)務更快從消費者宕機故障中恢復,減少中斷時間。 Kafka 分區(qū)遷移時數(shù)據(jù)復制引發(fā)冷讀: Kafka 在擴容時需要遷移分區(qū)數(shù)據(jù),這時候也會引發(fā)冷讀。

冷讀是 Kafka 中實際應用中必然需要面臨的正常需求。對于 AutoMQ 而言,我們并不會去嘗試消除冷讀,而是重點在于解決好 Kafka 冷讀本身帶來的副作用。
冷讀帶來的副作用
接下來我們會分析 Kafka 冷讀具體會帶來哪些副作用,以及為什么 Kafka 沒有辦法解決這些問題。
硬盤 I/O 爭搶問題
Kafka 運維中的一個重要挑戰(zhàn)是處理冷讀時對硬盤 I/O 的大量占用。硬盤或云盤的單盤 IOPS 和吞吐能力有限。冷讀會導致從硬盤大量讀取數(shù)據(jù),當某些分區(qū)數(shù)據(jù)在節(jié)點上分布不均時,容易造成熱點訪問。對大量數(shù)據(jù)的分區(qū)進行冷讀會快速占用單盤的 IOPS 和吞吐資源,直接影響節(jié)點上其他 Topic 分區(qū)數(shù)據(jù)的讀寫性能。

Kafka 沒法解決該副作用的主要原因是其本身存儲實現(xiàn)強依賴本地存儲。Kafka 的數(shù)據(jù)全部存儲在 Broker 的本地磁盤上,冷讀時消耗大量磁盤 I/O 導致其他讀寫請求需要訪問磁盤時性能受限。即使像 Kafka 商業(yè)化公司 Confluent 實現(xiàn)了 KIP-405 所描繪的分層存儲,該問題仍然沒有得到徹底的解決。在 Kafka 分層存儲的實現(xiàn)中,Kafka 仍然要求分區(qū)的最后一個 LogSegment 必須在本地磁盤上,Broker 和本地存儲仍然是強依賴的。 因此,Kafka 冷讀時則并不能完全從 S3 或者內存從讀取數(shù)據(jù),其必然有請求需要從分區(qū)的最后一個 LogSegment 中讀取數(shù)據(jù)。當 LogSegment 的數(shù)據(jù)比較大時,硬盤 I/O 的爭搶問題也將會更加嚴重??偟膩碚f,Kafka 采用分層存儲試圖一定程度去降低冷讀副作用的影響,但是并沒有在根本上解決問題。

Page Cache 污染
Kafka 冷讀時,從磁盤加載大量數(shù)據(jù)經過 Page Cache 供消費者讀取,會造成 Page Cache 的數(shù)據(jù)污染。Page Cache 的大小是比較有限的,由于本質是個緩存,當新的對象需要加入 Page Cache 時,如果其容量不足,就會驅逐一些舊的對象。

Kafka 沒有做冷熱隔離,當冷讀發(fā)生時,大量冷數(shù)據(jù)的讀取會迅速搶占 Page Cache 的容量,將其中其他 Topic 的數(shù)據(jù)驅逐出去。當其他 Topic 的消費者需要從 Page Cache 讀取數(shù)據(jù)的時候就會發(fā)生 Cache Miss,進而必須從硬盤中讀取數(shù)據(jù),此時讀取的延遲將會大大增加。在這種情況下,由于從硬盤加載數(shù)據(jù),整體的吞吐性能也會快速退化。Kafka 利用 Pache Cache 結合 sendfile 系統(tǒng)調用在沒有發(fā)生冷讀時有很好的性能表現(xiàn),但是一旦發(fā)生冷讀,其對吞吐和讀寫延遲的影響將會令人非常頭疼。

Kafka 沒法很好地解決該問題主要還是因為其讀寫模型本身設計上強依賴 Page Cache 來兌現(xiàn)其強大的性能和吞吐的。
Zero Copy 在冷讀時阻塞網絡請求
Kafka 采用零拷貝技術 sendfile 來避免內核態(tài)和用戶態(tài)交互的開銷來提升性能一直以來被大家津津樂道。但是不可否認的是,sendfile 在冷讀時,會帶來額外的副作用。

在 Kafka 的網絡線程模型中,讀寫請求會共享一個網絡線程池來處理網絡請求。在沒有冷讀的理想場景下,網絡線程經過 Kafka 的處理后,需要向網絡返回數(shù)據(jù)時,直接從 Page Cache 加載數(shù)據(jù)返回,整個請求響應在幾微秒內可以完成,整個讀寫流程是非常高效的。

但是如果產生了冷讀,Kafka 網絡線程向網絡的內核發(fā)送緩沖區(qū)寫數(shù)據(jù)時,調用 sendfile 需要先將磁盤加載到 Page Cache 中,然后再寫到網絡的內核發(fā)送緩沖區(qū)。在這個零拷貝過程中,Linux 內核態(tài)從磁盤加載數(shù)據(jù)到 Page Cache 的過程中是個同步的系統(tǒng)調用,因此網絡線程只能同步等待其關聯(lián)的數(shù)據(jù)從磁盤加載數(shù)據(jù)完成,才可以繼續(xù)去處理別的工作。

Kafka 的網絡線程池是被 Client 的讀寫網絡請求共享的。冷讀時,Kafka 網絡線程池中大量網絡線程在同步等待系統(tǒng)調用返回,這會阻塞新的網絡請求被處理,同時也使得消費者消費的延遲進一步增加。下圖演示了冷讀時,sendfile 是如何影響網絡線程的處理從而進一步拖慢整體的生產和消費效率的。

根據(jù)上文的原理分析可知,Kafka 之所以沒辦法很好的解決這個問題主要還是受限于其線程模型的設計。在 Kafka 的讀寫線程模型中,讀寫共享網絡線程池,冷讀時 sendfile 的慢操作沒有與讀寫核心流程異步解耦導致了其在冷讀時網絡線程成為瓶頸,進而造成明顯的吞吐性能下降。

AutoMQ 如何解決冷讀副作用
冷熱隔離
對象存儲是云上最具規(guī)?;?、成本和技術紅利的云服務。我們可以看到,像 Confluent, Snowflake 都在基于云對象存儲重塑自己的軟件服務來給用戶提供更低成本、更穩(wěn)定和彈性的存儲能力?;谠茖ο蟠鎯χ匦略O計基礎軟件也成為當前 Infra 領域軟件設計的新風尚。 AutoMQ 作為一款真正意義上的云原生軟件,在設計之初就確定需要將對象存儲作為其主存,從而設計了流場景中,面向對象存儲的流存儲庫 S3Stream。該流存儲庫在 Github 上也已開源,可以搜索 automq-for-kafka 關注。

AutoMQ 使用對象存儲作為主存儲,不僅帶來了極致的成本和彈性優(yōu)勢,另外一個非常重要的益處就是有效隔離了冷熱數(shù)據(jù),從根源上解決了 Kafka 硬盤 I/O 爭搶的問題。在 AutoMQ 的讀寫模型中,冷讀時數(shù)據(jù)會直接從對象存儲上加載數(shù)據(jù),而不是從本地磁盤上讀取數(shù)據(jù),這樣就天然的隔離了冷讀,自然也就不會搶占本地磁盤的 I/O 了。

此外,AutoMQ 基于對象存儲實現(xiàn)的冷讀隔離是不會有性能上的副作用的。通過并發(fā)、預讀和批量讀取等技術優(yōu)化措施,在冷讀時的吞吐性能上可以完全匹敵 Kafka。

自主管理內存不依賴 Page Cache
AutoMQ 的讀寫模型中并沒有依賴 Page Cache,因此也自然不會有 Kafka Page Cache 污染的副作用。雖然摒棄了使用 Page Cache,但是 AutoMQ 在性能上并沒有妥協(xié),主要是因為采取了如下一系列的技術手段。
使用 Direct I/O 讀寫裸設備
AutoMQ 繞過文件系統(tǒng),通過 Direct I/O 直接讀寫裸設備。這帶來的好處主要是:

避免 Page Cache 污染: 繞過文件系統(tǒng)自然也就不存在 Page Cache 污染了 減少數(shù)據(jù)復制:使用 Direct I/O 直接讀取裸設備,數(shù)據(jù)只有一次復制,從硬件直接拷貝到應用程序的用戶態(tài)。 減少文件系統(tǒng)開銷: 文件系統(tǒng)一般需要寫 Journal,管理 Metadata,在寫入上會相比實際寫入消耗更多的帶寬以及 IOPS,寫入路徑也更長,所以性能上會比裸設備差。 更快的容災恢復速度:AutoMQ 的 WAL 數(shù)據(jù)會保留在云盤上,然后異步刷出到對象存儲。當計算實例宕機時,云盤會自動漂移掛載到其他可用的機器上,由 AutoMQ 完成容災操作,即將其云盤上剩余的 WAL 刷出到對象存儲然后再刪除云盤。在這個容災過程中,由于直接操作的裸設備,可以避免文件系統(tǒng)恢復的時間開銷,提升容災的時效性。 避免 Kafka 數(shù)據(jù)丟失:AutoMQ 需要將數(shù)據(jù)持久化到云盤才返回給客戶端成功響應。在 Kafka 的默認推薦配置中,為了保證性能一般都是異步持久化數(shù)據(jù)的。當機房斷電這種場景時,文件系統(tǒng)殘留臟頁會丟失導致數(shù)據(jù)丟失。
自主管理堆外內存
利用文件系統(tǒng)的 Page Cache 提升性能是一種比較取巧的方式。對于 Kafka 而言,意味著其無需自身實現(xiàn)一套內存 Cache,也不用擔心其 JVM 的對象開銷和 GC 問題。不得不說,在非冷讀場景下,這種方式確實是有著不錯的表現(xiàn)。但是一旦出現(xiàn)冷讀,Kafka 用戶態(tài)對 Page Cache 的默認行為干預能力就很有限,沒法做一些精細化的管理。因此,像 Kafka 冷讀時 Page Cache 的污染就很難處理。

AutoMQ 在設計之初就是充分考慮到了使用 Page Cache 的利弊,在自研的 S3Strean 流存儲庫中,實現(xiàn)了 JVM 堆外內存的高效自主管理。通過設計冷熱隔離的緩存 BlockCache 和 LogCache,可以保證在各種場景下均可以完成高效的內存讀寫。在未來的迭代中,AutoMQ 也可以根據(jù)流場景對內存讀寫進行更加精細化地管理和優(yōu)化。
異步 I/O 響應網絡層
Kafka 的線程模型本質上是圍繞 Page Cache 和零拷貝技術來設計的。前文也指出了其核心問題是在冷讀時,網絡線程同步等待磁盤讀取,導致整個讀寫流程受阻,影響了性能。

AutoMQ 沒有出現(xiàn)的問題也是得益于其自主實現(xiàn)的內存管理機制。由于沒有依賴 Page Cache,AutoMQ 存儲層實現(xiàn)時會異步加載完數(shù)據(jù)再響應到網絡層,因此讀寫請求不會同步等待 磁盤I/O 完成才去處理別的工作。這使得整體的讀寫處理變得更加高效。

冷讀的性能
冷讀是 Kafka 中的常見應用場景,AutoMQ 在處理 Kafka 冷讀副作用時,不僅做到了冷熱隔離,同時也考慮到了確保冷讀性能不受影響的重要性。

AutoMQ 通過以下幾種技術手段保證了冷讀時的性能:

對象存儲讀取性能優(yōu)化:通過預讀、并發(fā)和緩存等手段直接從對象存儲讀取數(shù)據(jù),保證了整體上優(yōu)異的吞吐性能。 云原生的存儲層實現(xiàn),減少網絡開銷:AutoMQ 利用了云盤底層的多副本機制保證了數(shù)據(jù)的可靠性,因此在 Broker 層面可以減少副本復制的網絡延遲開銷。從而相比 Kafka 有更好的延遲、總體吞吐表現(xiàn)。

相關知識

如何徹底解決化療藥物的副作用 三種辦法來解決
Java技能提升:破解“技能冷卻”,高效學習攻略揭秘
藥物的副作用要怎么解決
如何緩解藥物副作用
如何減輕化療副作用
決明子的副作用 決明子的食用方法
擺地攤如何解決冰塊冷藏問題
藥物副作用肚子疼怎么解決
決明子泡茶喝有副作用嗎?
如何快速解除藥物副作用

網址: 如何解決 Kafka 冷讀副作用 http://m.u1s5d6.cn/newsview846481.html

推薦資訊