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