一、broker端根据offset获取文件中的真实数据
根据offset计算逻辑偏移量,查consumequeue文件夹下的文件,根据offset*20来确定哪个文件,再获取此文件中对应的逻辑数据块,从逻辑数据库中解析出commitLogOffset及size,此commitLogOffset即为物理偏移量,查commitlog文件夹下文件,先确定哪个文件,再计算文件真实的开始字节数,从开始字节数读size个字节即为需要拉取的数据.
ef:现有broker-a的master节点的CQ数据:
E:/logs/data-a/data/store-a/consumequeue/umc_mt_fwd_sms_178_5/0/
master节点的commitlog数据:
E:/logs/data-a/data/store-a/commitlog
示例找:topic=umc_mt_fwd_sms_178_5,queueId=0,offset=22824199的物理偏移量及真实的物理数据
如上流程图所示:
1、首先找CQ中的真实物理偏量;
此CQ文件保存固定长度的数据:20B=8B+4B+8B=commitLogOffset(8B)+size(4B)+tagHashCode(8B)
计算逻辑偏移量为:22824199*20=456484380,
CQ文件夹文件查找规则:找最大的一个文件名比当前逻辑偏移量小的文件
CQ文件每个文件保存30万个消息,每个消息20B,因此固定字节大小为:6000000B = 5860KB
CQ文件的首个文件名为:00000000000000000000,第二个文件为:00000000000006000000,第三个文件为:00000000000012000000,以此类推。
因此45648400偏移量在文件00000000000456000000中,此文件偏移量从456000000开始
计算偏移量的差值,即为在此文件的下标数,456484380-456000000=484380,开始的下标为484380,占用20B长度,即读文件的[484380,484000)字节。
读取[484380,484000):offset(commitLog)=316925272047,size=3306,hash(tag)=0
2、再根据物理偏移量进行真实物理记录查找;
commitlog文件夹文件查找规则:找最大的一个文件名比当前物理commitLogOffset小的文件
commitlog文件大小因定1GB,每条消息大小不因定,所有消息混合保存,当MAGICCODE 为 BLANK_MAGIC_CODE时表示文件结束。
commitlog文件的首个文件名为:00000000000000000000,第二个文件为:00000000001073741824,第三个文件为:00000000002147483648,以此类推。
查找的文件为:E:\logs\data-a\data\store-a\commitlog\00000000316753838080,
计算316925272047在00000000316753838080文件中的字节偏移量,316925272047-316753838080=171433967
即316925272047的真实数据在00000000316753838080文件字节171433967后开始,连接3306个字节
数据块的前84个Bytes为固定的头部信息,84-88为bodyLen,[88,88+bodyLen)为真实的物理数据
二、commitlog文件一条消息定义格式
commitLog文件的存储格式为:
一条commitLog消息的数据结构为: