您好,登錄后才能下訂單哦!
本篇內容主要講解“如何理解Kafka中的消息存儲在磁盤上的目錄布局”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何理解Kafka中的消息存儲在磁盤上的目錄布局”吧!
Kafka 中的消息是以主題為基本單位進行歸類的,各個主題在邏輯上相互獨立。每個主題又可以分為一個或多個分區,分區的數量可以在主題創建的時候指定,也可以在之后修改。每條消息在發送的時候會根據分區規則被追加到指定的分區中,分區中的每條消息都會被分配一個唯一的序列號,也就是通常所說的偏移量(offset),具有4個分區的主題的邏輯結構見下圖。
如果分區規則設置得合理,那么所有的消息可以均勻地分布到不同的分區中,這樣就可以實現水平擴展。不考慮多副本的情況,一個分區對應一個日志(Log)。為了防止 Log 過大,Kafka 又引入了日志分段(LogSegment)的概念,將 Log 切分為多個 LogSegment,相當于一個巨型文件被平均分配為多個相對較小的文件,這樣也便于消息的維護和清理。
事實上,Log 和 LogSegment 也不是純粹物理意義上的概念,Log 在物理上只以文件夾的形式存儲,而每個 LogSegment 對應于磁盤上的一個日志文件和兩個索引文件,以及可能的其他文件(比如以“.txnindex”為后綴的事務索引文件)。下圖描繪了主題、分區、副本、Log 以及 LogSegment 之間的關系。
image
接觸過 Kafka 的老司機一般都知曉 Log 對應了一個命名形式為<topic>-<partition>的文件夾。舉個例子,假設有一個名為“topic-log”的主題,此主題中具有4個分區,那么在實際物理存儲上表現為“topic-log-0”、“topic-log-1”、“topic-log-2”、“topic-log-3”這4個文件夾:
向 Log 中追加消息時是順序寫入的,只有最后一個 LogSegment 才能執行寫入操作,在此之前所有的 LogSegment 都不能寫入數據。為了方便描述,我們將最后一個 LogSegment 稱為“activeSegment”,即表示當前活躍的日志分段。隨著消息的不斷寫入,當 activeSegment 滿足一定的條件時,就需要創建新的 activeSegment,之后追加的消息將寫入新的 activeSegment。
為了便于消息的檢索,每個 LogSegment 中的日志文件(以“.log”為文件后綴)都有對應的兩個索引文件:偏移量索引文件(以“.index”為文件后綴)和時間戳索引文件(以“.timeindex”為文件后綴)。每個 LogSegment 都有一個基準偏移量 baseOffset,用來表示當前 LogSegment 中第一條消息的 offset。偏移量是一個64位的長整型數,日志文件和兩個索引文件都是根據基準偏移量(baseOffset)命名的,名稱固定為20位數字,沒有達到的位數則用0填充。比如第一個 LogSegment 的基準偏移量為0,對應的日志文件為00000000000000000000.log。
舉例說明,向主題topic-log中發送一定量的消息,某一時刻topic-log-0目錄中的布局如下所示。
示例中第2個 LogSegment 對應的基準位移是133,也說明了該 LogSegment 中的第一條消息的偏移量為133,同時可以反映出第一個 LogSegment 中共有133條消息(偏移量從0至132的消息)。?
注意每個 LogSegment 中不只包含“.log”、“.index”、“.timeindex”這3種文件,還可能包含“.deleted”、“.cleaned”、“.swap”等臨時文件,以及可能的“.snapshot”、“.txnindex”、“leader-epoch-checkpoint”等文件。
從更加宏觀的視角上看,Kafka 中的文件不只上面提及的這些文件,比如還有一些檢查點文件,當一個 Kafka 服務第一次啟動的時候,默認的根目錄下就會創建以下5個文件:
消費者提交的位移是保存在 Kafka 內部的主題__consumer_offsets中的,初始情況下這個主題并不存在,當第一次有消費者消費消息時會自動創建這個主題。
在某一時刻,Kafka 中的文件目錄布局如上圖所示。每一個根目錄都會包含最基本的4個檢查點文件(xxx-checkpoint)和 meta.properties 文件。在創建主題的時候,如果當前 broker 中不止配置了一個根目錄,那么會挑選分區數最少的那個根目錄來完成本次創建任務。
到此,相信大家對“如何理解Kafka中的消息存儲在磁盤上的目錄布局”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。