Kafka(四)Kafka日誌管理

kafka消息是經過主題來進行組織和區分的,每一個主題有分爲零個或多個分區,分區數量能夠在建立時指定也能夠後期修改,不過修改只能增長不能刪除,每一個分區又有一個或多個副本,副本中會有一個副本被選作Leader副本,該副本對外提供讀寫操做,其餘副本則是Follower。生產者發送消息到Leader副本的代理節點上,Follower副本從Leader同步數據。
ide


分區的每一個副本對應到一個Log對象,每一個Log有劃分爲多個LogSegment,每一個LogSegment包括一個日誌文件和兩個索引文件,其中兩個索引文件分別是偏移量索引文件和時間戳索引文件。Log和LogSegment是邏輯概念,日誌文件和索引文件纔是物理存儲對象,下圖爲主題BBB三個分區的日誌文件目錄,每一個分區對應一個目錄。spa

Snip20180715_8.png

下圖爲BBB主題0分區的日誌文件(.log)和偏移量文件(.index)以及時間戳文件(.timeindex)。日誌文件默認單個日誌文件大小爲1GB,能夠經過修改配置文件來指定大小。Kafka提供日誌切割機制,要麼達到日誌文件大小,若是沒有達到大小閾值,可是達到了log.roll.ms或者log.roll.hours設置的值也會進行切割建立新的日誌文件。線程

Snip20180715_9.png

數據文件名稱是一堆0,其實這就是數據文件的命名規則,它是由第一條消息的偏移量值而後左補0構成20位長度來造成的。代理

Kafka會把每一個日誌段的基準偏移量保存到ConcurrentSkipListMap集合中,經過二分法能夠快速定位到消息所在的數據文件和索引文件,而後在索引文件中經過二分法,查找最小值等於指定偏移量的最大偏移量,最後從查找的最大偏移量出開始掃描數據文件,直到查詢到偏移量與指定偏移量相等的消息。日誌


日誌目錄中的鎖文件orm

image.png

同一時刻只能由一個日誌管理器實例或者線程來獲取該鎖文件,該文件只有在Kafka正常關閉後纔會被刪除,經過該文件能夠判斷Kafka上次是否正常關閉。
對象


代理啓動時會啓動包括日誌管理器在內的不少管理器,日誌管理器是用來專門管理日誌的。索引

  • 加載配置文件中的log.dir配置項所配置的路徑,並檢查路徑是否存在,若是不存在就建立,並在這個日誌目錄下建立.lock鎖文件,該文件只有kafka被正常關閉時纔會刪除。同時建立和加載日誌檢查點文件,若是不存在就建立,該文件記錄每一個主題每一個分區下一次寫入磁盤數據的偏移量ip

  • 而後根據檢查點文件加載和恢復日誌,它會產生一個線程池來完整這個工做。它會檢查.kafka_cleanshutdown文件,當代理上一次正常關閉是纔會有這個文件,若是不存在則表示第一次啓動或者上一次沒有正常關閉。kafka

  • 線程開始恢復日誌,在內部會爲目錄下每個分區建立一個任務由線程池裏的線程執行。

  • 完成後刪除.kafka_cleanshutdown文件,同時關閉線程池。


日誌清理:

Kafka提供兩種日誌清理策略,刪除和壓縮。經過參數cleanup.policy來指定清理策略。日誌清理能夠控制到主題級別,能夠爲不一樣主題建立不一樣的清理策略。

  • 日誌刪除,它是一個定時任務在日誌管理器啓動後會啓動它。默認爲5分鐘執行一次。kafka提供了基於日誌保留時長的刪除策略和日誌大小的策略,默認是168小時,也就是7天,日誌被保留7天以後將會刪除。默認不設置日誌大小。日誌保留時長不是經過日誌文件的最後修改時間來肯定的,它是基於時間戳索引進行的。

  • 日誌壓縮

相關文章
相關標籤/搜索