kafka知識體系-kafka文件存儲機制

本系列主要講解kafka基本設計和原理分析,分以下內容:html

  1. 基本概念
  2. 消息模型
  3. kafka副本同步機制
  4. kafka文件存儲機制
  5. kafka數據可靠性和一致性保證
  6. kafka leader選舉
  7. kafka消息傳遞語義
  8. Kafka集羣partitions/replicas默認分配解析

kafka文件存儲機制

topic中partition存儲分佈
假設實驗環境中Kafka集羣只有一個broker,xxx/message-folder爲數據文件存儲根目錄,在Kafka broker中server.properties文件配置(參數log.dirs=xxx/message-folder),例如建立topic名稱分別爲test, partitions數量都爲partitions=4,副本爲1
存儲路徑和目錄規則爲:xxx/logs編程

test-0
test-1
test-2
test-3

在Kafka文件存儲中,同一個topic下有多個不一樣的partition,每一個partiton爲一個目錄,partition的名稱規則爲:topic名稱+有序序號,第一個序號從0開始計,最大的序號爲partition數量減1,partition是實際物理上的概念,而topic是邏輯上的概念。併發

partition中文件存儲方式
下面示意圖形象說明了partition中文件存儲方式:
分佈式

  • 每一個partion(目錄)至關於一個巨型文件被平均分配到多個大小相等segment(段)數據文件中。但每一個段segment file消息數量不必定相等,這種特性方便old segment file快速被刪除。
  • 每一個partiton只須要支持順序讀寫就好了,segment文件生命週期由服務端配置參數決定。

這樣作的好處就是能快速刪除無用文件,有效提升磁盤利用率。
partition中segment文件存儲結構
segment文件由兩部分組成,分別爲「.index」文件和「.log」文件,分別表示爲segment索引文件和數據文件。這兩個文件的命令規則爲:partition全局的第一個segment從0開始,後續每一個segment文件名爲上一個segment文件最後一條消息的offset值,數值大小爲64位,20位數字字符長度,沒有數字用0填充。
下面文件列表是筆者在Kafka broker上作的一個實驗,建立一個topicXXX包含1 partition,設置每一個segment大小爲500MB,並啓動producer向Kafka broker寫入大量數據,以下圖所示segment文件列表形象說明了上述2個規則:高併發

以上述圖2一對segment file文件爲例,說明segment中index<—->data file對應關係物理結構以下:
設計

上述圖3索引文件存儲大量元數據,數據文件存儲大量消息,索引文件中元數據指向對應數據文件中message的物理偏移地址。
其中以索引文件中元數據3,497爲例,依次在數據文件中表示第3個message(在全局partiton表示第368772個message)、以及該消息的物理偏移地址爲497。3d

從上圖瞭解到segment data file由許多message組成,下面詳細說明message物理結構以下:
指針

相關字段含義對應以下:
code

經過offset查找messageserver

例如讀取offset=368776的message,須要經過下面2個步驟查找。

  • 第一步查找segment file
    上圖爲例,其中00000000000000000000.index表示最開始的文件,起始偏移量(offset)爲0.第二個文件00000000000000368769.index的消息量起始偏移量爲368770 = 368769 + 1.一樣,第三個文件00000000000000737337.index的起始偏移量爲737338=737337 + 1,其餘後續文件依次類推,以起始偏移量命名並排序這些文件,只要根據offset二分查找文件列表,就能夠快速定位到具體文件。
    當offset=368776時定位到00000000000000368769.index|log

  • 第二步經過segment file查找message
    經過第一步定位到segment file,當offset=368776時,依次定位到00000000000000368769.index的元數據物理位置和00000000000000368769.log的物理偏移地址,而後再經過00000000000000368769.log順序查找直到offset=368776爲止。

從上圖可知這樣作的優勢,segment index file採起稀疏索引存儲方式,它減小索引文件大小,經過mmap能夠直接內存操做,稀疏索引爲數據文件的每一個對應message設置一個元數據指針,它比稠密索引節省了更多的存儲空間,但查找起來須要消耗更多的時間。

Kafka高效文件存儲設計特色

  • Kafka把topic中一個parition大文件分紅多個小文件段,經過多個小文件段,就容易按期清除或刪除已經消費完文件,減小磁盤佔用。
  • 經過索引信息能夠快速定位message和肯定response的最大大小。
  • 經過index元數據所有映射到memory,能夠避免segment file的IO磁盤操做。
  • 經過索引文件稀疏存儲,能夠大幅下降index文件元數據佔用空間大小。

關於做者
愛編程、愛鑽研、愛分享、愛生活
關注分佈式、高併發、數據挖掘
如需捐贈,請掃碼

相關文章
相關標籤/搜索