一、kafka消息的segment文件组成和物理结构
1、分区文件存储方式
(1)kafka的topic的每一个分区都存在一个目录
(2)所有的消息按照一个index文件和log文件存储
2、分区下的每一个segment文件(.log)的结构
3、一个segment中的每一个消息(message)的存储结构
(1)8字节的偏移量:当前的partition的第多少个message
(2)4字节消息大小:改消息的大小
(3)4字节的CRC32校验码
(4)1字节的kafka服务程序协议版本号(magic)
(5)1字节独立版本或标识压缩类型或编码类型(attributes)
(6)4字节的key长度,当key为-1表示key字段不填
(7)key实际数据
(8)4字节值数据长度
(9)实际值数据负载
4、分区文件存储方式
分区文件存储包括.log文件(存储实际的日志)和.index文件(快速定位某消息大概位置)
一个log或index文件以成对形式出现,每一对文件的文件名是一个long类型的从0开始命名的文件。文件名表示存储的消息从该文件名大小的偏移量开始。索引文件的存储结构:
如图上以00000000000000368769.index文件和00000000000000368769.log文件为例
index文件存储的是部分的消息(为了节省空间)的消息序号以及对应消息的字节偏移量(在文件从头到消息所在位置的偏移字节),在需要读取某偏移量的消息的时候,只需要将定位到改消息对应的文件名以及消息序号通过二分法查找即可大概定位到消息在log文件中的位置,然后在到log文件中跳转到具体的位置直到读取到对应偏移量的消息,大大缩减了消息读取的时间。
以读取offset=36776的消息为例子,需要通过2个步骤查找
(1)第一步查找segment file
以上图为例,其中00000000000000000000.index表示开始的文件,起始偏移量为0(offset为0),第二个文件00000000000000368769.index的消息起始偏移量为368770(368769+1)。只要根据offset二分查找文件列表,就可以快速定位到具体文件。当offset=368776时定位到00000000000000368769.index(log)文件
(2)第二步通过segment file查找message
算出368776-368770=6,取00000000000000368769.index文件第三项(6,1407)得出从00000000000000368769.log文件头偏移1407字节读取一条消息即可。
快来成为我的朋友或合作伙伴,一起交流,一起进步!:
QQ群:961179337
微信:lixiang6153
邮箱:lixx2048@163.com
公众号:IT技术快餐
更多资料等你来拿!