大資料開發過程中Kafka日誌結構解析

danny_2018發表於2022-07-28

Kafka作為大資料技術生態的重要元件,尤其是實時流資料處理場景下,作為分散式生產/消費系統,得到廣泛的重用。而Kafka在資料生產和消費上,日誌是主要的場景。今天的大資料開發學習分享,我們就來講講kafka日誌結構的基礎。

Kafka訊息是以主題為單位,主題之間相互獨立。每個主題又由一個或多個分割槽構成,分割槽數可以在建立主題時指定,也可以在主題建立後再修改,但只能增加一個主題的分割槽數而不能減少其分割槽數。每個分割槽可以有一個或多個副本。

在儲存結構上分割槽的每個副本對應一個Log物件,每個Log又劃分為多個LogSegment,每個LogSegment包括一個日誌檔案和兩個索引檔案,其中兩個索引檔案分別為偏移量索引檔案和時間戳索引檔案。Log物件中維護了一個ConcurrentSkipListMap,底層是一個跳躍表,儲存該主題所有分割槽對應的所有LogSegment。日誌檔案和索引檔案與磁碟上的物理儲存檔案相對應。

Kafka將日誌檔案封裝為一個FileMessageSet物件,將兩個索引檔案封裝為OffsetIndex和TimeIndex物件。

1.資料檔案

資料檔案用來儲存訊息,每條訊息由一個固定長度的訊息頭和一個可變長度的訊息體資料組成。訊息體包括一個可變長度的訊息Key和訊息實際資料Value,訊息Key可以為空,訊息結構如下圖所示:

訊息結構各欄位說明:

CRC32:CRC32校驗和

magic:kafka服務程式協議版本號

attributes:低兩位用來表示壓縮方式,第三位表示時間戳型別,高4位預留

timestamp:訊息時間戳,當magic大於0時訊息頭必須包含該欄位

key-length:訊息key的長度

key:訊息key實際資料

payload-length:訊息體實際資料長度

payload:訊息體實際資料

在實際儲存時一條訊息總長度還包括12位元組額外的開銷,其中8位元組長度記錄訊息的偏移量,訊息的偏移量是相對該分割槽下第一個資料檔案的基準偏移量而言,用來確定訊息在分割槽下的邏輯位置,同一個分割槽下的訊息偏移量按序遞增,另外4位元組表示訊息總長度。因此在0.10.1版本Kafka一條訊息的固定長度為34位元組,所以在資料檔案中相鄰兩條訊息的position值之差減去34,即為訊息Key和訊息資料Value的總長度。

資料檔案的大小由配置項log.segment.bytes指定,預設為1GB。同時Kafka提供了根據時間來切分日誌段的機制,即使資料檔案大小沒有達到log.segment.bytes設定的閾值,但達到了log.roll.ms或是log.roll.hours設定的閾值,同樣會建立新的日誌段,在磁碟上建立一個資料檔案和兩個索引檔案。接收訊息追加操作的日誌段也稱為活躍段activeSegment。

2.偏移量索引檔案

為了提高查詢效率,Kafka為每個資料檔案建立了一個基於偏移量的索引檔案,資料檔案同名,字尾為.index。

偏移量索引檔案用來儲存索引,索引是用來將偏移量對映成訊息在資料檔案中的物理位置,每個索引條目由offset和position組成,每個索引條目唯一確定資料檔案中的一條訊息。索引條目的offse和position與資料檔案中訊息的offse和position一一對應的,例如,資料檔案中某條訊息為offset:8和position:0,若為該條訊息建立了索引,索引檔案中索引值為offset:8和position:0。

並不是每條訊息都對應有索引,kafka採用了稀疏儲存的方式,每隔一定位元組的資料建立一條索引,可以透過index.interval.bytes設定索引跨度。

每次寫訊息到資料檔案時會檢查是否要向索引檔案寫入索引條目,建立一個新索引條目的條件為:距離前一次寫索引後累計訊息位元組數大於index.interval.bytes配置值。具體實現是LogSegment維持一個int型別的變數bytesSinceLastIndexEntry,初始值為0,每次寫訊息時先判斷該值是否大於索引跨度。若小於索引跨度,則將該條訊息的位元組長度累加到變數bytesSinceLastIndexEntry中;否則會為該條訊息建立一個索引條目寫入索引檔案,然後將bytesSinceLastIndexEntry重置為0。

3.時間戳索引檔案

時間戳索引檔案與資料檔案同名,以.timeindex字尾,該索引檔案包括一個8位元組長度的時間戳欄位和一個4位元組的偏移量欄位,其中時間戳記錄的是該日誌段目前為止最大時間戳,偏移量則記錄的是插入新的索引條目時,當前訊息的偏移量。

該索引檔案索引條目之間的跨度由index.interval.bytes設定的閾值決定,但同時必須保證新建立的索引條目的時間戳大於上一個索引的時間戳。

時間戳索引也採用了稀疏儲存的方式,索引條目對應的時間戳的值及偏移量與資料檔案中相應訊息的這兩個欄位的值相同。同時在記錄偏移量索引條目時會判斷是否需要同時寫時間戳索引。

關於大資料學習,Kafka日誌結構,以上就為大家做了基本的講解了。Kafka在實時訊息流的生產和消費上,其穩定性和可靠性,依賴於儲存,對於日誌結構這部分,建議大家一定要理解透徹。

來自 “ 網際網路後端架構 ”, 原文作者:網際網路後端架構;原文連結:https://mp.weixin.qq.com/s/5x3bnaCHKCaHjf4Vlg9eUA,如有侵權,請聯絡管理員刪除。

相關文章