日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

kafka入门之broker--日志存储设计

發(fā)布時(shí)間:2024/4/17 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kafka入门之broker--日志存储设计 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。