offset
offset 偏移量
offset存储在哪里?consumer_offsets
kafka默认提供了50个consumer_offsets_*的topic,用于存放consumer group 某一时刻提交的offset信息。
不同groupid用哪个consumer_offsets_ 呢?
计算公式: (“groupid”.hashCode())%50 ;
如果计算结果5,那么当前group的offset信息保存在consumer_offsets_5里面。
LogSegment (分段)
log.segment.bytes=1073741824 //设置分段大小,默认1G
kafka以Segment为单位,将partition进一步细分。从而避免的单个文件数据量过大而导致的操作难问题。
Segment的命名从0000开始,后续文件的命名以上一个Segment文件中最后一条消息的offset值命名。
Segment是一个逻辑概念,对应着partition目录(如log/test-0)下的.index和.log文件。如果partition被分为多个Segment,那么此目录下也会有多个.index和.log文件。
Kafka0.10.1.0之后,对于每个Segment文件新增了.timeindex文件,基于时间戳操作消息。
.timeIndex:文件映射时间戳和对应offset:
.index:文件记录了offset和对应的物理位置:
.index 与 .log 映射关系
Log文件内容分析
keysize :key大小。
compresscodec :压缩编码
payload :消息具体内容
日志清除/压缩
日志的分段存储,方便了kafka进行日志清理。Kafka启动一个后台线程,定期检查的存在可以删除的消息。如果有越来越多的消息得不到及时的消费,有些消息有可能在被消费之前就被清理了,从而造成消息的丢失。
日志清理策略
1.根据消息保留时间
配置 log.retention.hours=168 (默认7天)
2.根据topic存储大小
配置 log.retention.bytes=1073741824(默认1G,不开启)
日志压缩策略
实际场景中,key对应的value值不断变化,并且消费者只关心最新的value,所以kafka会在后台启动线程,定期将相同key合并,只保留最新value。