RocketMQ4.x之commitLog格式与查找

一、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消息的数据结构为:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值