kafka入门之broker--日志存储设计
kafaka并不是直接將原省消息寫入日志文件的,相反,它會將消息和一些必要的元數據信息大寶在一起封裝成一個record寫入日志。其實就是我們之前介紹的batch
具體對每個日志而言,kafka又將其進一步細分成日志段文件以及日志段索引文件,每個分區日志都是由若干日志段文件+索引文件構成的。
?
?
創建topic時,kafka為該topic的每個分區在文件系統中創建了一個對應的子目錄,名字就是<topic>-<分區號>。每個日志子目錄的文件構成都是如圖所示的結構,即若干組日志段+索引文件。
1。日志段文件,即后綴名時.log的文件保存著真是的Kafka記錄,kafla使用該文件第一條記錄對應的offset來命名此.log文件。
kafka每個日志段文件是有上限大小的,由broker端參數log.segment.bytes控制,默認就是1GB大小。,因此當日志段文件填滿記錄后,kafka會自動創建一組新的日志段文件和索引文件,這個過程被稱為日志切分。當前日志段非常特殊,它不受任何Kafka后臺任務的影星,比如定期日志清楚任務和定期日志compaction任務。
2.索引文件
.index文件和.timeindex文件他們都是索引文件,分別被稱為位移索引文件和時間戳索引文件,前者可以幫助broker更快地定位記錄所在的物理文件位置,而后者則是根據給定的時間戳查詢對應的位移信息。
它們都屬于稀疏索引文件,每個索引文件都由若干索引項組成。kafka不會為每條消息記錄都保存對應的索引項,而是特寫入若干記錄后才增加一個索引項,broker端參數log.index,interval.bytes設置了這個間隔到底是多大,默認值是4kb,即kafka分區至少寫入了4KB數據后才會在索引文件中增加一個索引項,故本質上它們是稀疏的。
升序排列,有了這種升序規律,kafka可以利用二分查找算法來搜索目標索引項,從而降低整體時間復雜度到o(lgN)。若沒有索引文件,kafka搜尋記錄的方式只能是從每個日志段文件的體育部孫旭掃面,因此這種方案的時間復雜度是o(N)顯然,引入索引文件可以極大的減少查找時間,減少broker端的cpu開銷
當日志進行切分時,索引文件也需要進行切分,broker端參數log.index.size.max.bytes設置了索引文件的最大文件大小,默認是10MB。和日志段文件不同,索引文件的空間默認都是預先分配好的,而當對索引文件切分時,kafka會把該文件大小'裁剪'到真實數據大小:
格式:
1.位移索引文件:
每個索引項固定地占用8字節的物理空間,同時kafka強制要求索引文件必須是索引項大小的整數倍,即8的整數倍,因此假設用戶設300會是296
索引文件文件名中的位移就是改索引文件的起始位移。
2.時間戳索引文件:?
每個索引項固定占用12字節的物理空間,同時kafka強制要求索引文件必須是索引項大小的整數倍,即12的整數倍,設100會是96
時間戳索引項保存的是時間戳與唯一的映射關系,給定時間戳后根據此索引文件只能找到不大于該時間戳的最大位移,然后kafka還需要拿著返回的位移再去位移索引文件中定位真實的物理文件位置。
日志留存:
定期清除日志,即刪除符合策略的日志段文件和兩個索引文件:
基于時間:默認7天,.log.retention.hours|minutes|ms用于配置清除日志的時間間隔,其中ms的優先級最高,minutes次之,hours優先級最低,計算當前時間戳與日志段首條消息的時間戳之差作為衡量日志段是否留存的依據,如果第一條消息沒有時間戳,kafka才會使用最近修改時間的屬性
基于大小,默認-1,表示kafka不會對log進行大小方面的限制
日志清除是一個異步過程,kafka broker啟動后會創建單獨的線程處理日志清除事宜。
日志compaction:
如果·使用log compaction,kafka消息必須要設置key,無key消息是無法為其進行壓實操作的。
kafka有個組件叫cleanner,它就是負責執行compaction操作的。cleaner負責從log中移除已廢棄的消息,如果一條消息的key是k,位移是o,只要日志中存在另外一條消息,key也是k,但位移是o‘,且o<o‘,即認為前面那條消息已經廢棄。
log compaction是topic級別的設置。
在內部kafka會構造一個哈希表來保存key與最新位移的映射關系:
_consumer_offset內部topic就是采用log compaction留存策略的。
相關參數:
log.cleanup.policy:
log.cleaner.enable:
log.cleanner.min.compaction.lang.ms
?
轉載于:https://www.cnblogs.com/lccsblog/p/11219681.html
總結
以上是生活随笔為你收集整理的kafka入门之broker--日志存储设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iptables 防火墙(上)
- 下一篇: 要学DOT NET了