文件目录布局
如果分区规则设置的合理, 所有消息可以均匀分布到不同的分区中, 如果不考虑多副本, 一个分区对应一个日志, 为了防止日志过大, kafka引入了日志分段(logSegment), 将Log切分为多个LogSegment, 每个LogSegment对应于磁盘上的一个日志文件和两个索引文件, 已经可能的其他文件, Log和LogSegment的关系如下
Log对应一个命名形式为<topic>-<partition>的文件夹, 如果主题是test_gp,有4个分区, 那么物理存储表现为test_gp-0, test_gp-1, test_gp-2, test_gp-3三个Log文件夹.
向Log中追加消息是顺序写入的, 只有最后一个LogSegment执行写入操作, 在此之前的所有的LogSegment不能再写入数据了, 将最后一个LogSegment称为activeSegment, 表示活跃的日志分段, 随着消息的不断写入, 当activeSegment满足一定条件时需要创建新的activeSegment, 之后追加的消息写入新的activeSegment.
为了便于信息检索,每个.log日志文件都有两个索引文件, 分别是偏移量索引文件.index和时间戳索引文件.timeindex, 每个LogSegment都有一个基准便宜量baseOffset, 用来表示当前LogSegment中第一条消息的offset. 偏移量是一个64位的长整型数, 日志文件和两个索引文件都是以基准偏移量进行命名的, 名称固定为20为数字, 没有达到的位数用0填充, 例如test_gp-2目录下
-rw-r--r-- 1 kafka kafka 10M 7月 3 11:08 00000000000000000000.index
-rw-r--r-- 1 kafka kafka 12K 7月 3 11:11 00000000000000000000.log
-rw-r--r-- 1 kafka kafka 10M 7月 3 11:08 00000000000000000000.timeindex
-rw-r--r-- 1 kafka kafka 10M 7月 4 11:08 00000000000000000133.index
-rw-r--r-- 1 kafka kafka 12K 7月 4 11:11 00000000000000000133.log
-rw-r--r-- 1 kafka kafka 10M 7月 4 11:08 00000000000000000133.timeindex
-rw-r--r-- 1 kafka kafka 8 7月 2 19:25 leader-epoch-checkpoint
一共有2个LogSegment, 第二个LogSegment的基准偏移量是133, 说明他的第一条消息偏移量是133, 同时反引出第一个LogSegment共有133条消息(偏移量从0-132的消息)
消费者提交的位移是保存在kafka内部主题__consumer_offsets中的, 当第一次有消费信息时就会自动创建主题