Kafka的Log Compaction原理是什么?

Kafka的Log Compaction(日志壓縮)是一種獨特的數據保留策略,其核心原理是保留每個key的最新有效記錄。以下是關鍵原理分點說明:

1. 鍵值保留機制

通過掃描所有消息的key,僅保留每個key對應的最新value值。例如:

原始日志: 
(key1, v1)(key2, v2)(key1, v3)(key2, v4)壓縮后日志:
(key1, v3)(key2, v4)

2. 壓縮觸發條件

Kafka的臟數據比例計算

數學公式

臟數據比例 = (相同key的舊版本記錄總大小) / (當前日志段總大小)

示例場景分析
假設日志段包含4條等體積記錄:

(keyA, v1) → (keyB, v2) → (keyA, v3) → (keyB, v4)
  1. 有效數據:v3(keyA最新值)+ v4(keyB最新值)= 2條記錄
  2. 臟數據:v1(keyA舊值)+ v2(keyB舊值)= 2條記錄
  3. 實際臟數據比例:2/4=50%(達到默認觸發閾值)

特殊場景驗證
當出現以下情況時比例會變化:

  • 非均勻分布
    假設段中有6條記錄:3個key各有兩個版本

    (k1,v1)→(k2,v2)→(k3,v3)→(k1,v4)→(k2,v5)→(k3,v6)
    

    臟數據 = v1+v2+v3 = 3條 → 比例3/6=50%

  • 跨段分布
    若舊版本分布在多個segment中,則單個segment可能不達閾值

監控驗證方法
通過kafka自帶工具查看具體segment狀態:

# 查看segment元數據
bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files 00000000000000000000.log --print-data-log

輸出示例:

offset: 0 key: keyA payload: v1
offset: 1 key: keyB payload: v2 
offset: 2 key: keyA payload: v3  ← 最新有效值
offset: 3 key: keyB payload: v4  ← 最新有效值

此時該segment的臟數據比例為50%。
臟數據就是指的該數據有多版本數據。

日志段含義(物理分片)

Kafka的日志段大小(Log Segment Size)指的是單個日志文件在磁盤上的物理存儲限制,其核心要點如下:

  1. 存儲單元劃分
    每個partition的日志被拆分為多個固定大小的segment文件(默認1GB),文件命名采用base offset數值:
00000000000000000000.log  // 起始offset=0的segment
00000000000005368769.log  // 起始offset=5368769的segment
  1. 配置參數
    通過server.properties控制:
# 單個segment最大字節數(默認1GB)
log.segment.bytes=1073741824# 時間維度滾動策略(默認7天)
log.roll.hours=168
  1. 滾動觸發機制
    滿足以下任一條件即創建新segment:
  • 當前segment大小超過log.segment.bytes
  • 當前segment存活時間超過log.roll.ms/log.roll.hours
  • 消息最大時間戳與創建時間差超過閾值
  1. 物理文件組成
    每個segment包含三個物理文件:
00000000000000000000.log  // 消息數據
00000000000000000000.index // 位移索引
00000000000000000000.timeindex // 時間戳索引
  1. 性能影響
  • 大segment(如5GB)→ 減少文件數,提高順序IO性能,但增加故障恢復時間
  • 小segment(如500MB)→ 加快日志壓縮和消息過期,但增加文件切換開銷

實際查看segment文件示例(Windows路徑):

# 查看segment文件列表
dir C:\kafka\data\test-topic-0
# 輸出示例:
# 00000000000000000000.log
# 00000000000000000000.index
# 00000000000000000000.timeindex

檢查log.cleaner.backoff.ms

log.cleaner.backoff.ms 配置的檢查間隔主要用于檢查以下內容:

  1. 日志段清理條件檢查
    檢查各個分區的日志段是否滿足清理條件:
  • Compact策略下消息鍵的最新值是否可合并
  • Delete策略下是否超過日志保留時間/大小限制
  • 是否有足夠可回收的磁盤空間
  1. 清理任務調度檢查
    評估當前系統的負載情況,決定是否啟動新的清理任務:
  • 檢查可用的清理線程數
  • 判斷當前CPU/IO資源使用率是否允許執行清理
  • 驗證待清理分區是否處于可操作狀態
  1. 清理進度檢查
    監控正在執行的清理任務:
  • 確認當前清理操作是否超時
  • 檢查已完成清理的分區是否需要后續處理
  • 驗證清理后的日志段索引是否有效

配置建議:

# 當需要更頻繁檢查時(如高吞吐量場景)
log.cleaner.backoff.ms=5000
# 當需要降低資源消耗時(如邊緣設備部署)
log.cleaner.backoff.ms=30000

1 Kafka官方文檔指出,該參數控制清理線程在兩次檢查之間的休眠時間,這個間隔直接影響日志清理的實時性和系統資源消耗的平衡。

當滿足以下條件時觸發壓縮:

  • 臟數據比率超過 min.cleanable.dirty.ratio(默認0.5)
  • 日志段大小達到 segment.bytes(默認1GB)
  • 達到 log.cleaner.backoff.ms 配置的檢查間隔(默認15秒)

3. 墓碑消息機制

當需要刪除某個key時,會寫入value為null的墓碑消息。該消息會保留 delete.retention.ms(默認24小時)后才會被清除。(這是約定的,開發者需要知道并配合kafka的特性來開發,可以依賴該特性進行空間優化。)

4. 物理存儲優化

采用copy-on-write機制:

  • 創建新segment文件寫入有效數據
  • 完成后原子替換舊文件
  • 舊文件異步刪除

5. 應用場景特征

適合需要維護最終狀態的場景:
? 數據庫變更捕獲(CDC)
? 配置信息更新跟蹤
? 實時物化視圖維護
? 不適合審計日志等需要完整歷史記錄的場景

實際配置示例:

cleanup.policy=compact
min.cleanable.dirty.ratio=0.3
delete.retention.ms=86400000  # 24小時
segment.bytes=1073741824      # 1GB

該機制通過空間換時間的方式,在保證最新狀態可查的同時,顯著降低存儲消耗(實測可減少50%-90%存儲空間)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79135.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79135.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79135.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在 MyBatis 中實現控制臺輸出 SQL 參數

在 MyBatis 中實現控制臺輸出 SQL 參數,可通過以下方案實現: # 一、使用 MyBatis-Plus 的 SqlLogInterceptor(推薦) ?適用場景?:項目已集成 MyBatis-Plus(3.5.3版本) ?配置步驟?&#xff…

黃金、碳排放期貨市場API接口文檔

StockTV 提供了多種期貨市場的數據接口,包括獲取K線圖表數據、查詢特定期貨的實時行情等。以下為對接期貨市場的詳細接口說明。 一、獲取K線圖表數據 通過調用/futures/kline接口,您可以獲取指定期貨合約的歷史K線數據(例如開盤價、最高價、…

“ES7+ React/Redux/React-Native snippets“常用快捷前綴

請注意,這是一個常用的列表,不是擴展提供的所有前綴。最完整和最新的列表請參考擴展的官方文檔或在 VS Code 中查看擴展的詳情頁面。 React (通常用于 .js, .jsx, .ts, .tsx): rfce: React Functional Component with Export Defaultrafce: React Arro…

[Windows] 能同時打開多個圖片的圖像游覽器JWSEE v2.0

[Windows] 能同時打開多個圖片的圖像游覽器JWSEE 鏈接:https://pan.xunlei.com/s/VOPpO86Hu3dalYLaZ1ivcTGIA1?pwdhckf# 十多年前收藏的能同時打開多個圖片的圖像游覽器JWSEE v2.0,官網已沒有下載資源。 JWSEE v2.0是烏魯木齊金維圖文信息科技有限公司…

[AI Tools] Dify 工具插件上傳指南:如何將插件發布到官方市場

Dify 作為開源的 LLM 應用開發平臺,不僅支持本地化插件開發,也提供了插件市場機制,讓開發者能夠將自己構建的插件發布并供他人使用。本文將詳細介紹如何將你開發的 Dify Tools 插件上傳至官方插件市場,包括 README 編寫、插件打包、倉庫 PR 等核心步驟。 一、準備 README 文…

gradle3.5的安裝以及配置環境變量

下載資源 Gradle |釋放 往下滑找到3.5版本,有條件的翻譯一下 這是原文點擊下載后解壓 隨后配置環境變量 變量名 GRADLE_HOME 變量值為bin路徑 配置path環境 win11直接添加%GRADLE_HOME%\bin 隨后進入命令提示符 輸入gradle -v 能看到版本號即為成功

單片機開發基礎與高效流程

單片機開發涉及硬件與軟件的緊密協作,是嵌入式系統的核心技術之一。以下從開發流程、調試技巧、代碼優化等方面詳細闡述高效開發方法。 一、開發環境搭建與配置 選擇合適的開發工具鏈是高效開發的基礎。以 STM32 為例,常用工具包括: IDE 選…

大模型系列(四)--- GPT2: Language Models are Unsupervised Multitask Learners?

論文鏈接: Language Models are Unsupervised Multitask Learners 點評: GPT-2采用了與GPT-1類似的架構,將參數規模增加到了15億,并使用大規模的網頁數據集WebText 進行訓練。正如GPT-2 的論文所述,它旨在通過無監督語…

數字孿生[IOC]常用10個技術棧(總括)

1. 什么是數字孿生? 數字孿生(Digital Twin) 是通過數字化技術對物理實體(如設備、系統或環境)進行高精度建模和實時映射的虛擬副本。其核心是通過 數據驅動 實現物理世界與虛擬世界的雙向交互,支持實時監控…

cnas軟件檢測實驗室質量管理體系文件思維導圖,快速理清全部文件

軟件檢測實驗室在申請CNAS資質時,需要根據認可文件的要求,建立實驗室質量管理體系,明晰地展示組織架構、合理地安排人員崗位職責和能力要求、全面地覆蓋認可文件要求的質量要素。這是一項非常龐大的工作,涉及到的文件類型非常多&a…

[Windows] 東芝存儲診斷工具1.30.8920(20170601)

[Windows] 東芝存儲診斷工具 鏈接:https://pan.xunlei.com/s/VOPpMjGdWZOLceIjxLNiIsIEA1?pwduute# 適用型號 東芝消費類存儲產品: 外置硬盤:Canvio 系列 內置硬盤:HDW****(E300 / N300 / P300 / S300 / V300 / X30…

C++ learning day 01

目錄 1. iostream : 2.第一個C++程序 3. 執行過程以及以上例子詳解(以上例子為參考) 1. iostream : 全稱: input/output stream library 作用: 用于處理輸入輸出操作 2.第一個C++程序 #include <iostream>int main() {std::cout << "Hello World! &qu…

單位代碼簽名證書是什么?如何申請?

軟件安全已成為企業不可忽視的核心話題&#xff0c;當用戶下載企業級軟件時&#xff0c;若遇到“未知發布者”的警告彈窗&#xff0c;很可能是由于軟件未進行數字簽名所致。這種看似簡單的提示背后&#xff0c;隱藏著巨大的安全隱患與信任危機。而單位代碼簽名證書&#xff0c;…

《Zabbix Proxy分布式監控實戰:從安裝到配置全解析》

注意&#xff1a;實驗所需的zabbix服務器的搭建可參考博客 zabbix 的docker安裝_docker安裝zabbix-CSDN博客 1.1 實驗介紹 1.1.1 實驗目的 本實驗旨在搭建一個基于Zabbix的監控系統&#xff0c;通過安裝和配置Zabbix Proxy、MySQL數據庫以及Zabbix Agent&#xff0c;實現分…

泛型設計模式實踐

學海無涯&#xff0c;志當存遠。燃心礪志&#xff0c;奮進不輟。 愿諸君得此雞湯&#xff0c;如沐春風&#xff0c;事業有成。 若覺此言甚善&#xff0c;煩請賜贊一枚&#xff0c;共勵學途&#xff0c;同鑄輝煌&#xff01; 為解決在設計框架或庫時遇到的類型安全問題&#xff…

【kafla掃盲】FROM GPT

Kafka 掃盲指南&#xff1a;分布式流處理利器 Apache Kafka 是一個分布式流處理平臺&#xff0c;最早由 LinkedIn 開發&#xff0c;后來開源并捐贈給 Apache 基金會。Kafka 專為高吞吐量、低延遲的實時數據流處理而設計&#xff0c;廣泛用于日志收集、實時分析、消息隊列、流處…

每天五分鐘深度學習框架pytorch:視覺工具包torchvison

本文重點 在pytorch深度學習框架中,torchvision是一個非常優秀的視覺工具包,我們可以使用它加載一些著名的數據集,然后我們可以使用它來加載網絡模型,比如vgg,resnet等等,還可以使用它來預處理一些圖片數據,本節課程我們將學習一下它的使用方式。 torchvision的四部分…

操作系統 第2章節 進程,線程和作業

一:多道程序設計 1-多道程設計的目的 for:提高吞吐量(作業道數/處理時間),我們可以從提高資源的利用率出發 2-單道程序設計缺點: 設備的利用率低,內存的利用率低,處理機的利用率低 比如CPU去訪問內存,CPU空轉.內存等待CPU訪問也是沒有任何操作的.要是有多個東西要去訪問不沖…

位移監測儀,精準測量,專業守護

地質災害如滑坡、泥石流、地面沉降等具有突發性強、破壞性大的特點&#xff0c;傳統人工巡查方式存在效率低、時效性差等缺陷。對人類生命財產構成嚴重威脅&#xff0c;因此需要實時、精準的位移監測手段。地質災害監測預警系統集成了多種傳感器&#xff0c;對地表及地下形變進…

dropout層

從你提供的圖片來看&#xff0c;里面討論了 Dropout 層&#xff0c;讓我為你解釋一下它的工作原理和作用。 Dropout 層是什么&#xff1f; Dropout 是一種常用的正則化技術&#xff0c;用于避免神經網絡的 過擬合&#xff08;overfitting&#xff09;。過擬合是指模型在訓練數…