kafka中日志默认segment大小是1Gb,在什么情况下可以实现未达到1Gb就可以生成新的segment?
在当前场景下,segment 片段默认大小是1Gb,一般情况下当 segment 到达 1Gb 时就会生成新的 segment,依次类推。是否会存在 segment 未到达 1Gb 就会生成新的 sgement 的情况?
要想回答以上情况,就要知道生成新的 segment 和哪些因素有关系?
一、segment 的前世今生
1、Kafka分区文件存储方式
Kafka将一个分区的文件是按照片段来存储的,一个片段的默认大小为1GB,可以在 server.properties 配置文件中修改片段大小,并且同时维护了 index 索引文件。
2、segment文件解读
使用命令查看 segment 文件00000000000000000000.log
kafka-run-class.sh kafka.tools.DumpLogSegments --files 00000000000000000000.log --print-data-log
文件内容如下:
offset:表示的是相对于该分区的记录偏移量,指的是第几条记录,比如0代表第一条记录。
position:表示该记录相对于当前片段文件的偏移量。
CreateTime:记录创建的时间。
isvalid:记录是否有效。
keysize:表示key的长度。
valuesize:表示value的长度
magic:表示本次发布kafka服务程序协议版本号。
compresscodec:压缩工具。
producerId:生产者ID(用于幂等机制)。
sequence:消息的序列号(用于幂等机制)。
payload:表示具体的消息
二、segment的约束条件
通过查找 server.properties 中的配置参数可知和 segment 有关的参数有以下几个:
# 控制日志 segment 文件的大小,超出该大小则追加到一个新的日志 segment 文件中(默认1Gb,-1表示没有限制)
log.segment.bytes=1024*1024*1024
# 当达到下面时间,会强制新建一个segment
log.roll.hours = 24*7
# 日志片段文件的检查周期,查看它们是否达到了删除策略的设置(log.retention.hours或log.retention.bytes)
log.retention.check.interval.ms=60000
# 对于segment日志的索引文件大小限制(默认10mb)
log.index.size.max.bytes = 10 * 1024 * 1024
三、总结
通过上面的约束条件可知,如果某一 segtment 先满足上述任一条件都可能生成新的 segment。