一、kafka数据存储机制
kafka作为消息中间件,会临时存储消息,提供对外查询接口,数据默认存储168小时(7days),超时会被删除。
kafka采用多文件存储方式来保存数据,主要是有两个方面的考虑:
- 所有数据存储到一个文件,会使得存储文件比较大,影响查询的效率。
- 对于过期数据的清理,不太方便,需要清理掉过期数据,并将未过期的数据重新写入到文件,切分多个文件后,可以根据文件的日期,直接删除文件即可。
如上图所示,segment段有两个核心文件:log文件和index文件,当log文件等于1G时,新的数据会写到下一个segment中,可以通过下图可以看出segment段会存储差不多70万条数据。
文件命名规则说明:
- 00000000000000000000.index——表示最开始的文件,起始偏移量(offset)为0
- 00000000000000368769.index——消息的起始偏移量为368770=368769+1
- 00000000000000737337.index——消息的起始偏移量为368770=368769+1
*以起始偏移量命名并排序这些文件,只需要根据offset的二分查找算法,快速定位到需要查询的指定的偏移量对应的文件。
思考个问题:切分文件的时间阈值?比如一天没有写到70万条数据,应该也会生成新的segment段。
二、kafka数据查询机制
说个具体的查询例子,来说明kafka的查询机制。
比如在下图的kafka文件中,查询offset=368776的message消息。
第一步:确定segment段
根据index文件命名规则,使用二分算法,定位到368776这个偏移量应该在文件00000000000000368769.index文件中。
第二步:通过segment file查找message
第一步中已经定位了元数据物理位置00000000000000368769.index,进一步可以定位到物理偏移地址文件00000000000000368769.log,通过顺序查找到offset=268776的message。