1. 程式人生 > 其它 >kafka06-日誌儲存

kafka06-日誌儲存

參考文獻:
1、《深入理解Kafka-核心設計與實踐原理(201901)》(第5章 日誌儲存)

1、檔案目錄佈局

  • 不考慮多副本的情況,一個分割槽對應一個日誌(Log)。
  • 日誌分段(LogSegment)是為了防止Log過大,將Log切分為多個LogSegment,相當於一個巨型檔案被平均分配為多個相對較小的檔案,這樣也便於訊息的維護和清理。
    • Log在物理上只以資料夾的形式儲存。
    • 每個LogSegment對應於磁碟上的一個日誌檔案和兩個索引檔案,以及可能的其他檔案(比如以".txnindex"為字尾的事務索引檔案)。
  • 主題、分割槽、副本和Log、LogSegment之間的關係

  • 建立一個4個分割槽,2個副本的主題topic-log。並向主題中傳送一定量的訊息,某一時刻topic-log-0目錄中的佈局如下所示。
128 ~]# kafka-topics.sh --zookeeper localhost:2181 --create --topic topic-log --partitions 4 --replication-factor 2

128 ~]# ll /tmp/kafka/log/topic-log-0
-rw-r--r--. 1 root root 10485760 11月 19 16:41 00000000000000000000.index
-rw-r--r--. 1 root root 5111     11月 19 16:41 00000000000000000000.log
-rw-r--r--. 1 root root 10485756 11月 19 16:41 00000000000000000000.timeindex
-rw-r--r--. 1 root root 10485760 11月 19 16:45 00000000000000000133.index
-rw-r--r--. 1 root root 4085     11月 19 16:45 00000000000000000133.log
-rw-r--r--. 1 root root 10485756 11月 19 16:45 00000000000000000133.timeindex
-rw-r--r--. 1 root root 10485760 11月 19 16:49 00000000000000000251.index
-rw-r--r--. 1 root root 3869     11月 19 16:49 00000000000000000251.log
-rw-r--r--. 1 root root 10485756 11月 19 16:49 00000000000000000251.timeindex
  • 為了便於訊息的檢索,每個LogSegment中的日誌檔案(以".log"為檔案字尾)都有對應的兩個索引檔案:
    • 偏移量索引檔案(以".index"為檔案字尾)
    • 時間戳索引檔案(以".timeindex"為檔案字尾)
  • 每個LogSegment都有一個基準偏移量baseOffset,用來表示當前LogSegment中第一條訊息的offset。偏移量是一個64位的長整型數。
  • 日誌檔案和兩個索引檔案都是根據基準偏移量(baseOffst)命名的,名稱固定為20位數字,沒有達到的位數則用0填充。
    • 比如第1個LogSegment的日誌檔名是00000000000000000000.log,因此它的基準偏移量是0。
    • 比如第2個LogSegment的日誌檔名是00000000000000000133.log,因此它的基準偏移量是133,也說明了該LogSegment中的第一條訊息的偏移量為133,同時可以反映出第一個LogSegment中共有133條訊息(偏移量從0至132的訊息)。
  • 向Log中追加訊息時是順序寫入的,只有最後一個LogSegment才能執行寫入操作,在此之前所有的LogSegment都不能寫入資料。
    • 為了方便描述,我們將最後一個LogSegment稱為"activeSegment" ,即表示當前活躍的日誌分段
    • 隨著訊息的不斷寫入,當activeSegment滿足一定的條件時,就需要建立新的activeSegment,之後追加的訊息將寫入新的activeSegment。
  • 注意每個LogSegment中不只包含".log"、".index"、".timeindex"這3種檔案,還可能包含"deleted"、".cleaned"、".swap"等臨時檔案,以及可能的".snapshot"、".txnindex"、"leader-epoch-checkpoint"等檔案。
  • 在某一時刻,Kafka中的檔案目錄佈局如圖所示。
    • 每一個根目錄都會包含最基本的4個檢查點檔案(xxx-checkpoint)和meta.properties檔案。
    • 初始情況下主題__consumer_offisets並不存在,當第一次有消費者消費訊息時會自動建立這個主題。
    • 在建立主題的時候,如果當前broker中不止配置了一個根目錄,那麼會挑選分割槽數最少的那個根目錄來完成本次建立任務。

1

#                                                                                                                       #