kafka資料檢索 Kafka日誌分段與訊息查詢

2021-10-13 10:45:09 字數 2784 閱讀 5181

kafka作為乙個訊息中介軟體(後面kafka逐漸轉向乙個流失處理平台kafkastream),訊息最終的儲存都落在日誌中。

kafka的訊息最終傳送是以topic下的分割槽為最終目標的,因此kafka的日誌儲存也是以分割槽為單位。

配置檔案中log.dir引數決定了kafka資料檔案的存放目錄,該引數可以在kafka配置檔案中進行配置。

上圖給出了三個目錄,代表topic名稱為message-store的三個分割槽,三個目錄下面分別儲存了三個分割槽的資料檔案,從目錄可以看出,分割槽目錄的建立規則是topicname-分割槽編號。下面我們挑選0分割槽,看一下下面儲存了哪些檔案。

logsegement(日誌段)

kafka中寫入日誌的方式是以順序追加的方式寫入的,當日誌檔案達到一定大小就會做切分,形成乙個新的日誌檔案,這裡可以把乙個乙個的日誌檔案作為乙個日誌段。日誌段的引入方便了kafka資料的查詢(二分查詢)與定位。

日誌段分為活躍日誌段和非活躍日誌段,只有活躍日誌段(當前日誌段,乙個分割槽只可能存在乙個)可以被寫入和讀取,非活躍日誌段只能被讀取

日誌檔案有很多字尾,如上圖所述有.index、.log、.snapshot、.timeindex

類別作用

.index

偏移量索引檔案

.log

日誌檔案

.snapshot

日誌快照

.timeindex

時間戳索引檔案

leader-epoch-checkpoint

用於副本同步的檢查點檔案

每個檔案的命名是有固定的格式的,檔名長度20位,以該日誌中的第一條訊息的offset值命名,不夠的補0,因此00000000000000000038.log中第一條訊息的偏移量為38。

# 該命令可以檢視kafka的日誌檔案,結果如下圖

bin/kafka-run-class.sh kafka.tools.dumplogsegments --files 00000000000000000038.log --print-data-log

從日誌檔案中我們可以看出,我們可以看出訊息集合的起始位移、結束位移、時間戳以及具體的訊息的位移、時間戳、header還有內容(payload)等資訊。

# 該命令可以檢視kafka的offset索引檔案

bin/kafka-dump-log.sh --files 00000000000000000000.index

bin/kafka-dump-log.sh --files 00000000000000000038.index

# 該命令可以檢視kafka的時間戳索引檔案

bin/kafka-dump-log.sh --files 00000000000000000000.timeindex

日誌和索引檔案

配置項預設值

說明log.index.interval.bytes

4096 (4k)

增加索引項位元組間隔密度,會影響索引檔案中的區間密度和查詢效率

log.segment.bytes

1073741824 (1g)

日誌檔案最大值

log.roll.ms

當前日誌分段中訊息的最大時間戳與當前系統的時間戳的差值允許的最大範圍,毫秒維度

log.roll.hours

168 (7天)

當前日誌分段中訊息的最大時間戳與當前系統的時間戳的差值允許的最大範圍,小時維度

log.index.size.max.bytes

10485760 (10mb)

觸發偏移量索引檔案或時間戳索引檔案分段位元組限額

日誌分段

日誌段有當前日誌段和過往日誌段。kafka在進行日誌分段時,會開闢乙個新的檔案。觸發日誌分段主要有以下條件:

當前日誌段日誌檔案大小超過了log.segment.bytes配置的大小

當前日誌段中訊息的最大時間戳與系統的時間戳差值超過了log.roll.ms配置的毫秒值

當前日誌段中訊息的最大時間戳與當前系統的時間戳差值超過log.roll.hours配置的小時值,優先順序比log.roll.ms低

當前日誌段中索引檔案與時間戳索引檔案超過了log.index.size.max.bytes配置的大小

追加的訊息的偏移量與當前日誌段中的之間的偏移量差值大於interger.max_value,意思就是因為要追加的訊息偏移量不能轉換為相對偏移量。原因在於在偏移量索引檔案中,訊息基於baseoffset的偏移量使用4個位元組來表示。

索引檔案在做分段的時候首先會固定好索引檔案的大小(log.index.size.max.bytes),在新的分段的時候對前乙個分段的索引檔案進行裁剪,檔案的大小才代表實際的資料大小。

訊息查詢

offset查詢(.index)

偏移量索引檔案由4位元組的相對位移(offset)和4位元組的實體地址(postion)組成。

kafka內部維護了乙個concurrentskiplistmap來儲存在每個日誌分段,通過跳躍表方式,定位到具體的日誌偏移量索引檔案,然後在此檔案中,根據二分法來查詢不大於需要查詢的offset對應的postion,然後在日誌檔案中從postion處往後遍歷,找到offset等於要查詢的offset對應的訊息。

時間戳查詢(.timeindex)

時間戳索引檔案是由8位元組的時間戳和4自己的相對偏移量組成。

時間戳查詢的時候首先拿要查詢的時間戳和每個時間戳索引檔案的最後一條記錄進行比較,如果最後一條記錄的時間戳小於等於0,就和檔案修改時間比較,找到不小於查詢時間戳的時間索引檔案。找到對應的日誌段時間戳索引檔案以後,二分法查詢不大於查詢時間戳的offset,再根據此offset進行偏移量檔案查詢。

日誌清理

關於日誌清理,將會在下一節中講述。

Data Retrieval 資料檢索

index 索引 定義 分類 1 結構化資料 固定格式 有限長度 應用 資料庫 元資料 2 非結構化資料 非定格式 非限長度 應用 磁碟檔案 查詢方式 1 結構化查詢 資料庫搜尋 2 非結構化查詢 a 順序掃瞄 b 全文檢索定義 根據使用者需求,從資料庫提取資料,生成資料表。資料表 可放回資料庫,也...

kafka訊息檢索原理

讀取資料的過程中,資料是屬於某乙個topic的某乙個partition對應的某乙個segment檔案中的某一條記錄。如何高效找到這條訊息,決定著kafka的效能。kafka中資料檔案的儲存目錄,我們可以看到的是這個partition下面有好多組檔案,每一組都由乙個segment資料檔案,乙個inde...

基本資料檢索

2016.11.28 二 基本資料檢索 select from table select 和 from 號是特殊符號,它表示所有的列,這句話的意思就是從 table 中查詢所有的列。在mysql和 oracle 中要求每句話的末尾要加乙個分號 但在 sqlserver 中不適用。2.1 查詢指定列 ...