kafka是存储到本地磁盘么_Kafka 中的消息存储在磁盘上的目录布局是怎样的?
Kafka 中的消息是以主題為基本單位進行歸類的,各個主題在邏輯上相互獨立。每個主題又可以分為一個或多個分區,分區的數量可以在主題創建的時候指定,也可以在之后修改。每條消息在發送的時候會根據分區規則被追加到指定的分區中,分區中的每條消息都會被分配一個唯一的序列號,也就是通常所說的偏移量(offset),具有4個分區的主題的邏輯結構見下圖。
如果分區規則設置得合理,那么所有的消息可以均勻地分布到不同的分區中,這樣就可以實現水平擴展。不考慮多副本的情況,一個分區對應一個日志(Log)。為了防止 Log 過大,Kafka 又引入了日志分段(LogSegment)的概念,將 Log 切分為多個 LogSegment,相當于一個巨型文件被平均分配為多個相對較小的文件,這樣也便于消息的維護和清理。
事實上,Log 和 LogSegment 也不是純粹物理意義上的概念,Log 在物理上只以文件夾的形式存儲,而每個 LogSegment 對應于磁盤上的一個日志文件和兩個索引文件,以及可能的其他文件(比如以“.txnindex”為后綴的事務索引文件)。下圖描繪了主題、分區、副本、Log 以及 LogSegment 之間的關系。
image
接觸過 Kafka 的老司機一般都知曉 Log 對應了一個命名形式為-的文件夾。舉個例子,假設有一個名為“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是存储到本地磁盘么_Kafka 中的消息存储在磁盘上的目录布局是怎样的?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python基础(14)之 类和对象
- 下一篇: 机器学习之线性回归(matlab)