Kafka_04_Topic和日志

Kafka_04_Topic和日志

  • Topic/Partition
    • Topic
    • Partition
  • 日志存儲
    • 存儲格式
    • 日志清理
      • 刪除
      • 壓縮

Topic/Partition

Topic/Partition: Kafka中消息管理的基礎單位

  1. Topic和Partition并不實際存在(僅邏輯上的概念)

如: Topic和Partition關系

image

// 每個日志文件可對應多個日志分段, 其還可分為索引、日志存儲和快照等


Topic

Topic(主題): Kafka中消息歸類單位

  1. Topic管理本質: 管理Topic對應的日志存儲(文件)
  2. 日志存儲隨機分步于各個Broker以提搞Topic容災性
  3. 日志存儲數量 = Partition數量 * Replica數量
  4. 存儲文件格式: Topic名-Partition名-序列號

// 可通過Kafka自帶kafka-topics.sh腳本完成Topic相關管理


Topic名稱組成: 大小寫字母、數字、點號、連接線、下劃線

  1. Topic名稱必須含有點號或下劃線(metrics命名時會將前者替換為后者)
  2. 不建議使用雙下劃線作為前綴(其常為內部Topic格式)
  3. 創建Topic的本質(交由控制器異步完成)

// ZooKeeper的/brokers/topics//config/topics/下創建子節點并寫入Partition分配方案和配置信息


管理Topic須知:

  1. 創建Topic時Broker需統一是否配置機架信息, 否則會創建失敗
  2. Topic創建后僅能增加Partition數量(Partition不能被刪除)
  3. Partition數量變化會影響Key的計算(影響消息順序)

Partition

Partition(分區): 組成Topic的單位(實際存儲消息)

  1. Partition可有多個副本(leader和follower), 每個副本對應個日志文件
  2. leader提供讀寫服務, follower副本僅和leader進行數據同步
  3. leader恢復后重新加入, 則只能為新的follower

優先副本: AR集合中首個副本

  1. 理想情況下優先副本應是Partition的leader
  2. Kafka會確保所有Topic的優先副本在集群中均勻分布
  3. Partition平衡: 通過選舉策略使優先副本選舉為leader副本

// 優先副本選舉的元數據存儲于ZooKeeper的/admin/preferred_replica_election


Partition重分配: Partition重新進行合理的分配

  1. 當Partition所處的Broker節點下線, Kafka不會自動進行故障轉移
  2. Kafka集群中增加新Broker節點時, 該節僅能分配到新創建的Partition
  3. 本質:部分Partition增加新副本, 并從剩余Partition的副本中拷貝數據
  4. Partition重復配過程中需保證有足夠的空間(完成后自動刪除原有數據)

// 建議分為多個小批次執行Partition重分配, 并重啟預下線的Broker


Partition數量與吞吐量關系:: 限定范圍內增加Partition數量可增加吞吐量

  1. 若無休止增加Partition數量, 超出限定范圍后吞吐量反而下降
  2. Partition數量有上限(過多會導致Kafka進程崩潰)
  3. Partition也是最小的并行操作單位

日志存儲

日志(Log): Partition對應的物理存儲

  1. 日志以目錄方式存儲多個LogSegment
  2. 日志的目錄命名格式: Topic名稱-Partition名稱
  3. 數據均以追加方式寫入日志, 且以特定順序進行追加

如: 日志存儲關系

image

// LogSegment還包含.deleted.cleaned.swap等后綴文件


LogSegment(日志分段): 組成日志的基礎單位

  1. 每個LogSement必須有個日志文件和兩個索引文件
  2. 日志的最后個LogSegment才可執行寫入, 其他僅存儲數據
  3. BaseOffset(基準偏移量): 每個LogSegment中首個消息的偏移量
  4. 文件均以BaseOffset格式進行命名(固定為20位數字, 用0填充多余位)

// BaseOffset是64位長整型數據, 其可得知前個LogSegment的數據量


日志索引: 稀疏索引實現消息的快速檢索

  1. 稀疏索引達到指定大小后才建立索引(不保證Record均有對應的索引項)
  2. 稀疏索引通過MappedByteBuffer將索引文件映射到內層中
  3. 通過二分定位小于指定偏移量的最大偏移量
  4. 各索引均嚴格單調遞增

存儲格式

存儲格式: 日志存儲在硬盤的格式

  1. 日志的存儲格式決定其占用空間大小和檢索速率
  2. 日志的存儲格式演進為3個版本: v0(0.10.0)、v1(0.11.0)、v2

如: 日志存儲格式

image

// Varints(變長整型): 使用任意多個字節序列化記錄整數(特定范圍減少空間)


消息壓縮: 將RecordBatch壓縮成單個Record

  1. 壓縮生成的消息記為外層消息(反者為內層消息)
  2. 外層消息的key為null, 而value為內層消息(偏移量查找)
  3. 內層消息的偏移量均從0開始(使用時Broker會進行轉換計算)

如: 外層消息和內層消息的偏移量

image

// 外層消息存儲的是內層消息中最后條消息的絕對位移(相對于Partition而言)


日志清理

日志清理: Kafka對日志的維護

  1. 日志清理策略分為: 刪除、壓縮
  2. 日志清理的粒度最細可為Topic級別
  3. 可同時指定刪除和壓縮為日志清理的策略

刪除

刪除(Delete): 刪除不符合特定條件的LogSegment

  1. 刪除依據分為: 時間、文件大小、日志的起始偏移量
  2. Broker啟動時會同時啟動個線程周期性檢測并刪除特定LogSegment
  3. 刪除線程會基于依據選擇出可被刪除的LogSegment(deletableSegment)

日志刪除的大致流程:

  1. 從日志對象中所維護的LogSegment跳躍表中移除待刪除的LogSegment
  2. 將所有待刪除的文件添加.deleted后綴(包括索引文件)
  3. 統一交由延遲刪除線程處理(默認1m)

基于時間刪除: 每個LogSegment擁有過期時間

  1. 根據LogSegment的最大時間戳(最后條消息)
  2. 若最后條消息的時間戳字段小于0, 則根據最近修改時間
  3. 若所有LogSegment均滿足刪除條件, 則在刪除前創建activeSegment

如: 基于時間的日志刪除(只要最大時間戳未過期就不會被刪除)

image


基于文件大小: 每個LogSegment的限定大小

  1. 基于文件大小又可分為:日志大小、LogSegment大小
  2. 若基于日志大小, 則超出限定時默認從頭開始刪除LogSegment

如:基于大小的日志刪除

image


基于日志的起始偏移量: 下個LogSegment的BaseOffset是否小/等于起始偏移量

  1. 刪除線程會逐個遍歷LogSegment以判斷BaseOffset是否滿足
  2. 日志起始偏移量常為首個LogSegment的BaseOffset

如: 基于日志的起始偏移量(假設起始偏移量為25)

image


壓縮

壓縮(Compact): 將具有相同Key的消息僅保留最后個版本的Value

  1. 壓縮后生成新的LogSegment, 消息的物理位置不會改變
  2. 壓縮后的偏移量不再連續(不影響日志的檢索)
  3. 壓縮前后的消息可分為: clean和dirty
  4. activeLogSegment不參與壓縮

如:日志壓縮時其構成部分

image

// 日志的cleaner-offset-checkpoint文件記錄每個Partition的已清理偏移量


日志壓縮時大致流程:

  1. 日志的污濁率觸發壓縮操作
  2. 壓縮線程遍歷兩次日志(獲取Key和判斷)
  3. 對于壓縮LogSegment的進行分組(防止過多小文件)
  4. 將LogSegment組中需保留消息存儲于.clean后綴的臨時文件
  5. 對日志進行壓縮, 在壓縮完成后將.clean臨時文件后綴改為.swap
  6. 刪除被壓縮的LogSegment, 并將.swap后綴去除(變為可用LogSegment)

// LogSegment組的大小不可超過LogSegment的限定大小


如: 多次壓縮的日志文件

image

// ActiveSegment(活躍的日志分段): 可執行寫入操作的LogSegment


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

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

相關文章

緩存篇—緩存擊穿

在很多場景下,我們的業務通常會有幾個數據會被頻繁地訪問,比如秒殺活動,這類被頻地訪問的數據被稱為熱點數據。 如果緩存中的某個熱點數據過期了,此時大量的請求訪問了該熱點數據,就無法從緩存中讀取,直接…

《UE5_C++多人TPS完整教程》學習筆記22 ——《P23 記錄加入的玩家(Couting Incoming Players)》

本文為B站系列教學視頻 《UE5_C多人TPS完整教程》 —— 《P23 記錄加入的玩家(Couting Incoming Players)》 的學習筆記,該系列教學視頻為 Udemy 課程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻譯版,UP主&#xff…

前端面試問題(jwt/布局/vue數組下標/扁平化/菜單樹形/url api/新版本)

前端面試問題(jwt/布局/vue數組下標/扁平化/菜單樹形/url api/新版本) 1. jwt鑒權邏輯 前端 JWT 鑒權邏輯通常涉及在發起請求時攜帶 JWT,并在接收到響應后處理可能的授權問題。 1. 用戶登錄: 用戶提供憑證: 用戶在登錄界面輸入用戶名和密碼…

如何使用Docker部署MongoDB并結合內網穿透實現遠程訪問本地數據庫

文章目錄 前言1. 安裝Docker2. 使用Docker拉取MongoDB鏡像3. 創建并啟動MongoDB容器4. 本地連接測試5. 公網遠程訪問本地MongoDB容器5.1 內網穿透工具安裝5.2 創建遠程連接公網地址5.3 使用固定TCP地址遠程訪問 正文開始前給大家推薦個網站,前些天發現了一個巨牛的 …

2024最佳住宅代理IP服務商有哪些?

跨境出海已成為了近幾年的最熱趨勢,大批量的企業開始開拓海外市場,而海外電商領域則是最受歡迎的切入口。新興的tiktok、Temu,老牌的Amazon、Ebay,熱門的Etsy、Mecari等等都是藍海一片。跨境入門并不難,前期的準備中不…

深入理解文件查看命令:cat、more、less、tail、head

在Linux系統中,有許多命令用于查看文件的內容,其中包括cat、more、less、tail和head。這些命令提供了不同的方式來瀏覽文本文件,適用于各種查看需求。在本篇博客中,我們將深入介紹這些命令,并通過示例演示它們的用法。…

Spring Boot打war包部署到Tomcat,訪問頁面404 !!!

水善利萬物而不爭,處眾人之所惡,故幾于道💦 文章目錄 Spring Boot打war包部署到Tomcat,訪問頁面404 !!!解決辦法:檢查Tomcat版本和Jdk的對應關系,我的Tomcat是6.x&#x…

Sping基礎篇----掌握Sping的控制反轉/依賴注入的概念【實戰案例總結】

作為一名對技術充滿熱情的學習者,我一直以來都深刻地體會到知識的廣度和深度。在這個不斷演變的數字時代,我遠非專家,而是一位不斷追求進步的旅行者。通過這篇博客,我想分享我在某個領域的學習經驗,與大家共同探討、共…

SMMU介紹

SMMU(System Memory Management Unit)是一種硬件設備,其作用是在虛擬地址空間和物理地址空間之間提供地址轉換的功能。它通常用于處理虛擬化環境中的 I/O 設備,例如虛擬機中的設備訪問或者容器環境中的設備隔離。 SMMU 的主要作用…

KVM虛擬機的克隆方式

話不多說,直接上操作 首先確定我們要克隆的模板機器,這樣可以方便我們后續克隆許多機器 IP獲取最好就是dhcp模式,這樣克隆出來的機器就不需要自己再去改ip了 確定需要克隆的模板機以后,先關機再執行克隆操作 virsh shutdown ser…

【SiamFC】《Fully-Convolutional Siamese Networks for Object Tracking》

ECCV 2016 Workshops 文章目錄 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 The OTB-13 benchmark5.3 The VOT benchmarks5.4 Dataset size 6 Conclusion(own)/ Future wo…

Android系統啟動流程

android的啟動流程是從底層開始進行的,具體如下所示: Android是基于Linux內核的系統,Android的啟動過程主要分為兩個階段,首先是Linux內核的啟動,然后是Android框架的啟動。 可以將Andorid系統的啟動流程分為以下五個…

【QT 5 +Linux下軟件桌面快捷方式+qt生成軟件創建桌面圖標+學習他人文章+第二篇:編寫桌面文件.desktop】

【QT 5 Linux下軟件桌面快捷方式qt生成軟件創建桌面圖標學習他人文章第二篇:編寫桌面文件.desktop】 1、前言2、實驗環境3、自我學習總結-本篇總結1、新手的疑問,做這件事目的2、了解.desktop3、三個關鍵目錄以及文件編寫1、目錄:/opt/2、目錄…

【鴻蒙 HarmonyOS 4.0】開發工具安裝

一、準備開發環境 1.1、安裝IDE 鴻蒙應用開發需要使用配套的IDE——HUAWEI DevEco Studio。 DevEco Studio基于IntelliJ IDEA Community(IDEA社區版)構建,為鴻蒙應用提供了一站式開發環境,集成了開發、運行、調試以及發布應用的…

【leetcode刷題之路】面試經典150題(3)——哈希表+區間

文章目錄 5 哈希表5.1 【哈希表】贖金信5.2 【數學】同構字符串5.3 【數學】單詞規律5.4 【哈希表】有效的字母異位詞5.5 【哈希表】字母異位詞分組5.6 【雙指針】兩數之和5.7 【數學】快樂數5.8 【哈希表】219. 存在重復元素 II5.9 【數學】最長連續序列 6 區間6.1 【數學】匯…

Stable Diffusion 模型分享:AstrAnime(Astr動畫)

本文收錄于《AI繪畫從入門到精通》專欄,專欄總目錄:點這里。 文章目錄 模型介紹生成案例案例一案例二案例三案例四案例五 下載地址 模型介紹 AstrAnime 是一個動漫模型,畫風色彩鮮明,擅長繪制漂亮的小姐姐。 條目內容類型大模型…

fastjson解析自定義get方法導致空指針問題

背景 為了在日志中把出入參打印出來,以便驗證鏈路和排查問題,在日志中將入參用fastjson格式化成字符串輸出,結果遇到了NPE。 問題復現 示例代碼 public static void main(String[] args) {OrganizationId orgId new OrganizationId();N…

規模化強化學習 — 多任務強化學習

1 簡述 1.1 單任務強化學習(STRL) 在單任務強化學習中,一個無人機的AI系統可能被訓練來執行特定的任務,比如自主導航。在這個任務中,無人機需要學習如何有效地從起點飛行到終點,并避開障礙物。 舉例&#…

【Java多線程】分析線程加鎖導致的死鎖問題以及解決方案

目錄 1、線程加鎖 2、死鎖問題的三種經典場景 2.1、一個線程一把鎖 2.2、兩個線程兩把鎖 2.3、N個線程M把鎖(哲學家就餐問題) 3、解決死鎖問題 1、線程加鎖 其中 locker 可以是任意對象,進入 synchronized 修飾的代碼塊, 相當于加鎖&…

Java SourceDataLine 播放音頻

Java SourceDataLine 播放音頻 1 依賴2 接口3 實現4 測試 項目Value音頻格式 添加依賴*.wav(JDK 原生支持)*.pcm(JDK 原生支持)*.au(JDK 原生支持)*.aiff(JDK 原生支持)*.mp3mp3spi.jar*.flacjflac-codec.jar 1 依賴 <dependency><groupId>com.googlecode.soundl…