kafka的日志:
kafka消息存儲在kafka集群中(分parition存儲贾节,每個partition對應(yīng)一個目錄汁汗。目錄名為{partitionId},kafka接收到的消息存放于此目錄下栗涂,包含log文件知牌,index文件,timeindex索引文件(0.10.1后的版本)
image
名字 | 含義 | 備注 |
---|---|---|
00000000000009475939 | 文件中第一條消息的offset | |
*.log | 存儲消息實體的文件 | |
*.index | 記錄消息的offset以及消息在log文件中的position的索引 | 稀疏存儲 |
*.timeindex | 記錄消息的timestamp和offset的索引 | 稀疏存儲 |
kafka消息查看
使用kafka-run-class工具調(diào)用kafka.tools.DumpLogSegments,查看kafka消息落盤后信息斤程。 如下 :
/usr/hdp/current/kafka-broker/bin/kafka-run-class.sh kafka.tools.DumpLogSegments --deep-iteration --print-data-log --files ****.log(index,timeindex)
如:
image
日志/消息清理(delete)
kafka消息日志的清理邏輯是啟動線程定期掃描日志文件角寸,將符合清理規(guī)則的消息日志文件刪除。
- 清理規(guī)則有兩種:
基于日志量大小的清理:當(dāng)消息日志總量大于設(shè)定的最大消息日志閾值時忿墅,刪除老舊日志以維持消息日志總量小于設(shè)定的閾值
基于日志修改時間的清理:time.millSeconds - _.lastModified > log.config.retentionMs 扁藕,清理該日志文件
- 清理:
給文件加上后綴名.delete
異步刪除,等待一定時間后疚脐,將文件清理
清理時亿柑,會將統(tǒng)一名稱的日志和索引文件同時清理。
日志清理主要參數(shù)
線程 | 參數(shù)/名稱 | 默認(rèn)值 |
---|---|---|
線程 | kafka-log-retention | |
檢測周期 | log.retention.check.interval.ms | 5 * 60 * 1000L |
保留時間閾值 | retention.ms | 7 * 24 * 60 * 60 * 1000L |
日志量閾值大小 | retention.bytes | -1 |
kafka單個日志文件大小 | log.segment.bytes | 1024 * 1024 * 1024L |
待刪除文件異步刪除棍弄,等待時間 | file.delete.delay.ms | 60000 |
由上圖可知望薄,kafka默認(rèn)的清理策略是基于文件修改時間戳的清理策略,默認(rèn)會保留七天的消息日志量呼畸,基于消息日志總量大小的清理規(guī)則不生效痕支。
在磁盤總量不足,消息量浮動較大的場景下并非最佳的日志清理策略(可能撐爆磁盤)蛮原,在該場景下卧须,可以考慮使用基于消息日志總量的清理策略。然后如何估算kafka消息的磁盤占用呢?
kafka消息大小估算:
發(fā)送一條消息(uncompressed) :
消息如下:
ab,1552981106583,testInput_20,ab_minus,1552981126583
在Log日志中:
offset: 9475167 position: 8694 CreateTime: 1552981126583 isvalid: true payloadsize: 52 magic: 1 compresscodec: NoCompressionCodec crc: 3704994927 keysize: 9 key: Message_3 payload: ab,1552981106583,testInput_20,ab_minus,1552981126583
占用空間:
110條消息占用磁盤10206byte故慈,單條消息約0.09k
如果是壓縮格式的消息板熊,可能不同的壓縮算法,不同的消息格式有較大差別察绷,需要實測估算
PS : 在存在多replica的常見下干签,還需要在此次評估基礎(chǔ)上乘以replica的副本數(shù)