深入了解Kafka的文件存儲原理

Kafka簡介

Kafka最初由Linkedin公司開發的分布式、分區的、多副本的、多訂閱者的消息系統。它提供了類似于JMS的特性,但是在設計實現上完全不同,此外它并不是JMS規范的實現。kafka對消息保存是根據Topic進行歸類,發送消息者稱為Producer;消息接受者稱為Consumer;此外kafka集群有多個kafka實例組成,每個實例(server)稱為broker。無論是kafka集群,還是producer和consumer都依賴于zookeeper來保證系統可用性集群保存一些meta信息(kafka的0.8版本之后,producer不在依賴zookeeper保存meta信息,而是producer自己保存meta信息)。本文不打算對Apache Kafka的原理和實現進行介紹,而在編程的角度上介紹如何使用Apache Kafka。我們分別介紹如何編寫Producer、Consumer以及Partitioner等。

Producer發送的消息是如何定位到具體的broker

  1. 生產者初始化:Producer在初始化時會加載配置參數,并開啟網絡線程準備發送消息。
  2. 攔截器邏輯:Producer可以設置攔截器來預處理消息,例如,修改或者豐富消息內容。
  3. 序列化:Producer將處理后的消息key/value進行序列化,以便在網絡上傳輸。
  4. 分區策略:Producer會根據分區策略選擇一個合適的分區,這個分區策略可以是輪詢、隨機或者根據key的哈希值等。
  5. 選擇Broker:Producer并不直接將消息發送到指定的Broker,而是將消息發送到所選分區的leader副本所在的Broker。如果一個主題有多個分區,這些分區會均勻分布在集群中的Broker上。每個分區都有一個leader副本,Producer總是將消息發送到leader副本,然后由leader副本負責同步到follower副本。
  6. 發送模式:Producer發送消息的模式主要有三種:發后即忘(不關心結果),同步發送(等待結果),以及異步發送(通過Future對象跟蹤狀態)。
  7. 緩沖和批量發送:為了提高效率,Producer會先將消息收集到一個批次中,然后再一次性發送到Broker。
  8. 可靠性配置:Producer可以通過設置request.required.acks參數來控制消息的可靠性級別,例如,設置為"all"時,需要所有in-sync replicas都確認接收后才認為消息發送成功。
  9. 失敗重試:如果請求失敗,Producer會根據配置的retries參數來決定是否重試發送消息。

Kafka的Producer通過一系列步驟來確定消息的發送目標,其中分區策略和leader副本的選擇是關鍵步驟,確保了消息能夠正確地發送到相應的Broker。同時,通過合理的配置和重試機制,Producer能夠保證消息的可靠性和系統的健壯性。

Kafka存儲文件長什么樣

在kafka集群中,每個broker(一個kafka實例稱為一個broker)中有多個topic,topic數量可以自己設定。在每個topic中又有多個partition,每個partition為一個分區。kafka的分區有自己的命名的規則,它的命名規則為topic的名稱+有序序號,這個序號從0開始依次增加。

圖片

在每個partition中有可以分為多個segment file。當生產者往partition中存儲數據時,內存中存不下了,就會往segment file里面存儲。kafka默認每個segment file的大小是500M,在存儲數據時,會先生成一個segment file,當這個segment file到500M之后,再生成第二個segment file 以此類推。每個segment file對應兩個文件,分別是以.log結尾的數據文件和以.index結尾的索引文件。

具體來說,Kafka中的每個分區(Partition)由一個或多個Segment組成。每個Segment實際上是磁盤上的一個目錄,這個目錄下面會包含幾個特定的文件:

  1. .log文件:這是真正存儲消息數據的地方。每個Segment有一個對應的.log文件,它存儲了屬于這個Segment的所有消息。
  2. .index文件:索引文件,用于快速定位到.log文件中的具體消息。通過.index文件可以高效地查找消息所在的.log文件位置。
  3. .timeindex文件(可選):如果啟用了時間戳索引,還會有這個文件。它用于按時間戳高效檢索消息。

此外,Segment作為Kafka中數據組織的基本單位,設計成固定大小,這樣做可以方便地進行數據的清理和壓縮,同時保證性能。當一個Segment文件寫滿后,Kafka會自動創建一個新的Segment來繼續存儲數據。舊的Segment文件在滿足一定條件(如被消費且達到一定的保留期)后會被刪除,釋放磁盤空間。

圖片

每個segment file也有自己的命名規則,每個名字有20個字符,不夠用0填充。每個名字從0開始命名,下一個segment file文件的名字就是上一個segment file中最后一條消息的索引值。在.index文件中,存儲的是key-value格式的,key代表在.log中按順序開始第條消息,value代表該消息的位置偏移。但是在.index中不是對每條消息都做記錄,它是每隔一些消息記錄一次,避免占用太多內存。即使消息不在index記錄中在已有的記錄中查找,范圍也大大縮小了。?

Consumer如何消費數據

Kafka中的Consumer通過以下步驟來消費數據:

  1. 創建消費者實例:需要創建一個消費者實例,并指定一些關鍵配置,如消費者所屬的群組、Topic名稱以及與服務器通信的相關設置。
  2. 訂閱主題:創建好的消費者實例需要訂閱一個或多個主題,以便開始接收消息。
  3. 拉取數據:與一些消息系統采用的推送模式不同,Kafka的消費者采用的是“拉取”模式。這意味著消費者需要主動從Broker拉取數據,而不是等待Broker將數據推送過來。這種模式使得消費者可以根據自身處理能力來控制數據的獲取速度。
  4. 長輪詢機制:在沒有新消息可消費時,消費者會使用長輪詢機制等待新消息到達。消費者調用poll()方法時可以設置超時時間(timeout),這樣如果沒有新消息,消費者會在等待一段時間后返回,并在下次調用poll()時繼續嘗試獲取新消息。
  5. 提交偏移量:消費者在消費過程中會跟蹤每個分區的消費進度,即偏移量(offset)。當消費者處理完消息后,它會提交當前的偏移量到Broker,以便在服務重啟或故障恢復的情況下可以從準確的位置繼續消費數據。
  6. 故障恢復:如果消費者發生宕機等故障,由于Kafka會持久化消費者的偏移量信息,消費者可以在恢復后繼續從之前提交的偏移量處消費數據,確保不丟失任何消息。
  7. 消費者群組:Kafka支持多個消費者組成一個群組共同消費一個主題。在一個群組內,每個消費者會被分配不同的分區來消費,從而實現負載均衡和橫向伸縮。同一個分區不能被一個群組內的多個消費者同時消費。
  8. 數據處理:消費者在拉取到數據后,可以根據自己的業務邏輯對數據進行處理,比如進行實時流處理或者存儲到數據庫中進行離線分析。

綜上所述,Kafka的Consumer通過上述流程高效地從Broker拉取并處理數據,這些特性使得Kafka能夠在高吞吐量和可擴展性方面表現出色,適合處理大規模數據流的場景。

Kafka中的過期數據處理機制

?kafka作為一個消息中間件,是需要定期處理數據的,否則磁盤就爆了。

處理的機制

  • 根據數據的時間長短進行清理,例如數據在磁盤中超過多久會被清理(默認是168個小時)?
  • 根據文件大小的方式給進行清理,例如數據大小超過多大時,刪除數據(大小是按照每個partition的大小來界定的)。

刪除過期的日志的方式

Kafka通過日志清理機制來刪除過期的日志,主要依賴于兩個配置參數來實現這一功能:

  • 日志保留時間:通過設置log.retention.hours參數,可以指定日志文件的保留時間。當日志文件的保存時間超過這個設定值時,這些文件將被刪除。
  • 日志清理策略:Kafka支持兩種日志清理策略,分別是deletecompactdelete策略會根據數據的保存時間或日志的最大大小來進行刪除。而compact策略則是根據消息中的key來進行刪除操作,通常用于特定類型的主題,如__consumer_offsets

此外,在Kafka 0.9.0及更高版本中,日志清理功能默認是開啟的(log.cleaner.enable默認為true)。這意味著Kafka會自動運行清理線程來執行定時清理任務。

綜上所述,Kafka通過結合保留時間和清理策略的配置,實現了對過期日志的有效管理。這些機制確保了系統資源的合理利用,同時避免了因日志無限增長而導致的潛在問題

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

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

相關文章

IntelliJ IDEA 常用的插件

IntelliJ IDEA有很多常用的插件,這些插件可以擴展IDE的功能,提高開發效率。以下是一些常用的插件: Maven Helper:這是一款分析Maven依賴沖突的插件。在沒有此插件時,查看Maven的依賴樹和檢查依賴包沖突可能需要輸入命…

梯度下降算法(帶你 原理 實踐)

目錄 一、引言 二、梯度下降算法的原理 三、梯度下降算法的實現 四、梯度下降算法的優缺點 優點: 缺點: 五、梯度下降算法的改進策略 1 隨機梯度下降(Stochastic Gradient Descent, SGD) 2 批量梯度下降(Batch…

LLM分布式訓練第一課(通訊原語)

這個系列作為TFLOPS和顯存消耗的續篇,今天開始正式連載 上一部地址: LLM 參數,顯存,Tflops? 訓練篇(5) (qq.com) 前一篇文章舉了65B模型的訓練所消耗的顯存的案例,如果把條件降低一點,我們看一下7B的模型需要多少顯存? 2byte的模型靜態參數權重(以16bit存儲) = 1…

(一)Python數據分析體系--九五小龐

課程地址:https://space.bilibili.com/387143299/channel/collectiondetail?sid554734 主要內容 知識體系 分析什么樣的數據 為什么使用Python做數據分析 Python近幾年的發展勢頭是有目共睹的,尤其是在科學計算,數據處理,A方面…

駕辰龍跨Llama持Wasm,玩轉Yi模型迎新春

今年新年很特別,AI工具添光彩。今天就來感受下最新的AI神器天選組合“WasmEdgeYi-34B”,只要短短三步,為這個甲辰龍年帶來一份九紫離火運的科技感。 環境準備 這次用的算力是OpenBayes提供的英偉達RTX_4090*1、24GB顯存、20核CPU、80GB內存…

產品營銷展示型wordpress外貿網站模板

工藝品wordpress外貿主題 簡約大氣的wordpress外貿主題,適合做工藝品進出品外貿的公司官網使用。 https://www.jianzhanpress.com/?p5377 餐飲設備wordpress外貿主題 簡潔的wordpress外貿主題,適合食品機械、餐飲設備公司使用。 https://www.jianzh…

Linux 開發工具vim、gcc/g++、makefile

目錄 Linux編輯器-vim 1. 基本概念 2. 基本操作 3. 正常模式命令集 4. 末行模式命令集 5. 其他操作 6. 簡單vim配置 Linux編譯器-gcc/g 1、基本概念 2、程序翻譯的過程 3. gcc如何完成程序翻譯 4、動靜態庫 Linux項目自動化構建工具-make/Makefile 1、背景 2、…

【Qt學習筆記】(四)Qt窗口

Qt窗口 1 菜單欄1.1 創建菜單欄1.2 在菜單欄中添加菜單1.3 創建菜單項1.4 在菜單項之間添加分割線1.5 給菜單項添加槽函數1.6 給菜單項添加快捷鍵 2 工具欄2.1 創建工具欄2.2 設置停靠位置2.3 設置浮動屬性2.4 設置移動屬性2.5 添加 Action 3 狀態欄3.1 狀態欄的創建3.2 在狀態…

2024最新算法:冠豪豬優化算法(CPO)求解23個基準函數

一、冠豪豬優化算法 冠豪豬優化算法(Crested Porcupine Optimizer,CPO)由Mohamed Abdel-Basset等人于2024年提出,該算法模擬冠豪豬的四種不同保護機制:視覺、聽覺、氣味和物理攻擊。第一和第二防御技術(視覺和聽覺)反…

盤點 | IT行業哪些認證含金量高

微思網絡 廈門微思網絡 作為一名IT人員,誰沒考幾個證 ——值得考的證書擁有的特性 ? 獲政府、企業和從業者認可; ? 持證人數多,業內共識度高; ? 幫持證者加分,快速提薪。 系統網絡方向認證 01 華為認證 華為…

設計模式學習筆記 - 設計原則 - 7.DRY 原則及提高代碼復用性

前言 DRY 原則,英文描述為: Don’t Repeat Yourself。中文直譯:不要重復自己。將它應用在編程中,可理解為:不要寫重讀的代碼。 可能你認為,這個原則很簡單。只要兩段代碼長得一樣,那就是違反 …

【機器學習】包裹式特征選擇之遞歸特征消除法

🎈個人主頁:豌豆射手^ 🎉歡迎 👍點贊?評論?收藏 🤗收錄專欄:機器學習 🤝希望本文對您有所裨益,如有不足之處,歡迎在評論區提出指正,讓我們共同學習、交流進…

電磁兼容(EMC):電解電容低阻如何選擇詳解

目錄 1 為何要選低阻電解電容 2 電解電容等效高頻等效電路 3 不同廠家ESR參數 4 高頻ESR特性 5 Low ESR鋁電解電容 1 為何要選低阻電解電容 在EMI超標時,將普通電解電容更換為低阻電解電容時,便通過了。這是因為低阻電解電容降低了功率回路的輻射電…

數字化轉型導師堅鵬:證券公司數字化轉型戰略、方法與案例

證券公司數字化轉型戰略、方法與案例 課程背景: 數字化轉型背景下,很多機構存在以下問題: 不清楚證券公司數字化轉型的發展戰略? 不知道證券公司數字化轉型的核心方法? 不知道證券公司數字化轉型的成功案例&am…

LLM 系列——BERT——論文解讀

一、概述 1、是什么 是單模態“小”語言模型,是一個“Bidirectional Encoder Representations fromTransformers”的縮寫,是一個語言預訓練模型,通過隨機掩蓋一些詞,然后預測這些被遮蓋的詞來訓練雙向語言模型(編碼器…

【計算機網絡通信】計算機之間的局域網通信和互聯網通信方法(附Python和C#代碼)

文章目錄 前言一、局域網通信1.1 基本原理和方法1.1.1 獲取本地ip1.1.2 實現局域網內的廣播1.1.3 進行局域網通信 1.2 實現多客戶端連接1.3 Python源碼1.4 C#源碼1.5 可能存在的問題 二、互聯網通信2.1 實現原理2.1.1 內網穿透軟件2.1.2 實現互聯網通信 2.2 Python源碼2.3 C#源…

基于Java的超市商品管理系統(Vue.js+SpringBoot)

目錄 一、摘要1.1 簡介1.2 項目錄屏 二、研究內容2.1 數據中心模塊2.2 超市區域模塊2.3 超市貨架模塊2.4 商品類型模塊2.5 商品檔案模塊 三、系統設計3.1 用例圖3.2 時序圖3.3 類圖3.4 E-R圖 四、系統實現4.1 登錄4.2 注冊4.3 主頁4.4 超市區域管理4.5 超市貨架管理4.6 商品類型…

牛客小白月賽85_D-阿里馬馬和四十大盜

非常非常非常有意思的一道題,正好寫一下做題思路 對于到不了的情況,那就是存在連續>0的區間,該區間和>m,這樣不管怎么補血一定過不去,cin的時候,就可以判斷 最開始我以為是貪心,發現當前區間走不過去那就返回上一個0點補血,但就是過不去 突然我發現這個樣例很有意思 1…

Vant Weapp

Vant Weapp - 輕量、可靠的小程序 UI 組件庫 van-radio name 是一個字符串&#xff0c;無法傳對象的處理 以及 mpx 多層嵌套 for 循環處理 <viewwx:for"{{questionList}}"wx:for-item"question" // item 重命名wx:for-index"questionIndex"…

一文了解docker與k8s

隨著 k8s 作為容器編排解決方案變得越來越流行&#xff0c;有些人開始拿 Docker 和 k8s 進行對比&#xff0c;不禁問道&#xff1a;Docker 不香嗎&#xff1f; k8s 是 kubernetes 的縮寫&#xff0c;8 代表中間的八個字符。 其實 Docker 和 k8s 并非直接的競爭對手兩者相互依存…