Kafka的高水位、低水位是什么概念?

Kafka 的 高水位(High Watermark, HW)低水位(Low Watermark, LW) 是和數據存儲、消費進度、日志清理等密切相關的重要概念。我們用一個 “蓄水池” 的比喻來形象地解釋它們的作用。


1. Kafka 里的數據像一個蓄水池

Kafka 的數據存儲在 日志(log segment) 里,每個分區(partition)就像一個不斷增長的日志文件,數據會隨著生產者(producer)的發送不斷增加,消費者(consumer)從中讀取數據。你可以把它想象成一個 不斷注水的蓄水池


2. 高水位(HW):消費安全線

高水位(HW) 就像是蓄水池里的 “最低可見水位”,只有水面之下的水(數據)才是消費者能喝(消費)到的

  • Kafka 是分布式的,每個分區的消息可能被多個副本(replica)存儲在不同的機器上。
  • 只有當 所有 ISR(In-Sync Replicas,即同步副本)都確認收到了某個消息,這個消息才被認為是“穩定的”并可以被消費者消費。
  • 高水位(HW)指的就是最早的 ISR 共同確認的那條消息的偏移量(offset),消費者只能消費到這個位置的數據,再往后的數據還不能保證穩定,不能消費。

類比:

  • 你可以想象蓄水池里有一根透明的管子,管子以下的水可以喝(已經被多個副本確認)。
  • 但管子上面的水(新寫入但未完全確認的消息)還在“沉淀”過程中,可能會被回滾(刪除)。

作用:

  • 保證數據一致性,確保所有消費者只能消費已經被多個副本確認的數據,避免數據丟失。

3. 低水位(LW):清理水池底部的陳舊數據

低水位(LW) 就是 “蓄水池的排水口”,用來刪除過舊的數據,防止池子被塞滿

Kafka 會根據 日志清理策略(Log Retention Policy) 來刪除舊數據,比如:

  • 按時間刪除(log.retention.hours):只保留最近 X 小時的數據。
  • 按大小刪除(log.retention.bytes):當日志文件超過一定大小后,刪除最早的數據。

低水位(LW)指的就是最早還能被 Kafka 保留的偏移量(offset),更早的數據都會被清理掉,防止日志無限增長。

類比:

  • 如果池子太滿,底部的水就要排走,以騰出空間給新的水(數據)。
  • 低水位(LW)以下的數據(offset)會被 Kafka 自動清理,消費者也無法再讀取這些數據。

作用:

  • 避免日志文件無限增長,節省存儲空間
  • 提高 Kafka 性能,防止查詢過大數據時變慢。

4. 高水位和低水位的關系

  • 高水位(HW)不斷上升,確保數據可以安全消費
  • 低水位(LW)也在上升,確保老數據及時清理
  • 高水位 - 低水位之間的數據就是 Kafka 當前可消費的數據,消費者只能消費這個范圍的數據。

5. 總結

概念作用類比
高水位(HW)保障消費者只能消費到安全的數據透明管子以下的水,可安全飲用
低水位(LW)觸發日志清理,避免存儲爆炸水池排水口,定期排掉老水

6. 延伸思考

  • 如果 ISR 副本少了(比如機器故障),高水位就不會提升,導致消費者無法消費新數據。
  • 如果低水位設得太低,可能會讓消費者還沒消費就被刪數據,導致數據丟失。
  • Kafka 通過合理調整 log.retention.* 和副本同步策略,來平衡存儲和消費的可靠性。

這樣理解的話,Kafka 高低水位的原理是不是就清晰很多了?

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

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

相關文章

基于JAVA+Spring+mysql_快遞管理系統源碼+設計文檔

文末獲取源碼數據庫文檔 感興趣的可以先收藏,有畢設問題,項目以及論文撰寫等問題都可以和博主溝通,盡最大努力幫助更多的人! 摘 要 隨著物流行業信息化的深入使得物流過程中貨物的狀態和變化透明化,現代信息化的接入使…

Python----數據分析(Numpy:安裝,數組創建,切片和索引,數組的屬性,數據類型,數組形狀,數組的運算,基本函數)

一、 Numpy庫簡介 1.1、概念 NumPy(Numerical Python)是一個開源的Python科學計算庫,旨在為Python提供 高性能的多維數組對象和一系列工具。NumPy數組是Python數據分析的基礎,許多 其他的數據處理庫(如Pandas、SciPy)都依賴于Num…

【SQL】MySQL中的字符串處理函數:concat 函數拼接字符串,COALESCE函數處理NULL字符串

MySQL中的字符串處理函數:concat 函數 一、concat ()函數 1.1、基本語法1.2、示例1.3、特殊用途 二、COALESCE()函數 2.1、基本語法2.2、示例2.3、用途 三、進階練習 3.1 條件和 SQL 語句3.2、解釋 一、concat &…

windows下適用msvc編譯ffmpeg 適用于ffmpeg-7.1

需要的工具: visual studio 2019 (可以是其他版本,只是本人電腦上裝的為2019) msys2 ffmpeg-7.1源碼 1. 修改msys2_shell.cmd 在msys2目錄修改msys2_shell.cmd 打開后找到行set MSYS2_PATH_TYPEinherit 刪除開頭的rem 2. 運行msys2 運行x64 Native Tools Command …

2025年軟考報名費用是多少?全國費用匯總!

軟考報名時間終于確定了!想要參加2025年軟考的同學們注意啦!特別是那些一年只有一次考試機會的科目,千萬不要錯過哦!這里為大家整理了各地的報名時間、科目、費用等信息,快來看看吧! 一、2025年軟考時間安…

【LeetCode459】重復的子字符串

題目描述 給定一個非空的字符串 s ,檢查是否可以通過由它的一個子串重復多次構成。 思路與算法 關鍵詞:利用字符串的重復性質;字符串的拼接技巧;逆推法假設原始字符串 s 是由某個子串 sub 重復多次構成的。也就是說&#xff0c…

JAVA面試常見題_基礎部分_Dubbo面試題(上)

Dubbo 支持哪些協議,每種協議的應用場景,優缺點? ? dubbo: 單一長連接和 NIO 異步通訊,適合大并發小數據量的服務調用,以及消費者遠大于提供者。傳輸協議 TCP,異步,Hessian 序列化…

掌握Git:從入門到精通的完整指南

Git是什么? Git是一個分布式版本控制系統,最初由Linus Torvalds在2005年為管理Linux內核開發而創建 它的主要功能是跟蹤文件的更改,協調多個開發者之間的工作,并幫助團隊高效地管理項目代碼。Git不僅適用于大型開源項目&#xf…

數據安全_筆記系列05:數據合規與隱私保護(GDPR、CCPA、中國《數據安全法》)深度解析

數據安全_筆記系列05:數據合規與隱私保護(GDPR、CCPA、中國《數據安全法》)深度解析 在全球數據跨境流動和隱私保護強監管的背景下,企業需同時滿足多法域合規要求。以下從 法規要點、核心差異、實施策略、跨境傳輸、典型案例 等維…

StableDiffusion打包 項目遷移 項目分發 1

文章目錄 SD項目遷移前置知識webui-user.batwebui.batlaunch_utils.py 下一篇開始實踐 SD項目遷移 顯卡驅動更新:https://www.nvidia.cn/geforce/drivers/ 下載安裝三個程序: python3.10.6: https://www.python.org/downloads/release/python-3106/gi…

Leetcode2414:最長的字母序連續子字符串的長度

題目描述: 字母序連續字符串 是由字母表中連續字母組成的字符串。換句話說,字符串 "abcdefghijklmnopqrstuvwxyz" 的任意子字符串都是 字母序連續字符串 。 例如,"abc" 是一個字母序連續字符串,而 "ac…

FFmpeg+vvenc實現H.266的視頻編解碼教程

Linux系統:FFmpegvvenc實現H.266的視頻編解碼教程(視頻壓縮) 關鍵網址 ffmpeg目前支持libvvenc,因此配置好libvvenc只會在一些make、sudo make install命令時遇到問題,例如默認安裝或配置路徑指定錯誤、ffmpeg版本、v…

vscode使用豆包MARSCode----集成doubao1.5 DeepSeekR1 DeepseekV3模型的ai編程插件

引入擴展 打開VSCode擴展窗口,在搜索窗口搜索MarsCode,找到MarsCode 插件單擊「install」,完成安裝,登錄即可使用MarsCode 編程助手。 主要功能 主要快捷鍵 / explain 解釋項目代碼,AI 返回的內容有結構分類&#…

uni小程序wx.switchTab有時候跳轉錯誤tab問題,解決辦法

在一個子頁面里面使用uni.switchTab或者wx.switchTab跳轉到tab菜單的時候,先發送了一個請求,然后執行跳轉到tab菜單,但是這個時候,出錯了........也是非常的奇怪,不加請求就沒問題......但是業務邏輯就是要先執行某個請…

軟件工程---需求工程

軟件需求工程師發現、獲取、組織、分析、編寫和管理需求的系統方法,以使客戶和項目組之間達成共識。 需求工程共包含五個步驟: 需求獲取:對業務問題分析,與項目干系人溝通,以理解系統的目標、期望和約束,…

React七Formik

Formik是一個專為React構建的開源表單庫。它提供了一個易于使用的API來處理表單狀態管理,表單驗證以及表單提交。Formik支持React中的所有表單元素和事件,可以很好地與React生態系統中的其他庫集成。同時,Formik還提供了一些高級功能&#xf…

【Kimi】自動生成PPT-并支持下載和在線編輯--全部免費

【Kimi】免費生成PPT并免費下載 用了好幾個大模型,有些能生成PPT內容; 有些能生成PPT,但下載需要付費; 目前只有Kimi生成的PPT,能選擇模板、能在線編輯、能下載,關鍵全部免費! 一、用kimi生成PP…

編寫一個程序,計算并輸出1到100的和(Python版)

編寫一個程序,計算并輸出1到100的和 以下是兩種計算1到100之和的方法: 方法一:循環累加法(適合編程練習) total 0 for num in range(1, 101):total num print("1到100的和為:", total)原理:通…

MyBatis-Plus 自動填充功能

MyBatis-Plus(MP) 提供了一個非常強大的功能——自動填充功能。該功能可以在執行插入或更新操作時,自動為某些字段賦值,免去手動設置這些字段的麻煩。常見的應用場景包括 創建時間 和 更新時間 字段的自動填充,幫助開發…

final 關鍵字在不同上下文中的用法及其名稱

1. final 變量 名稱:final 變量(常量)。 作用:一旦賦值后,值不能被修改。 分類: final 實例變量:必須在聲明時或構造函數中初始化。 final 靜態變量:必須在聲明時或靜態代碼塊中初…