RocketMQ——消息存储之数据文件结构
消息存储架构
RocketMQ作为一款高性能的消息中间件,和他的存储设计有很大的关系,本文主要针对重要的几个文件做简要的说明,部分内容都来自官网,便于后续源码的分析和理解。
如下为RocketMQ的消息存储架构图(来源官网)
RocketMQ存储文件主要构成
CommitLog
1、CommitLog文件
- CommitLog文件时Rocket存储消息的主要文件
- 生产者发送到Broker端的消息,都会以Append的方式写入到CommitLog文件
- 单个CommitLog文件默认为1G
- 文件名为当前消息的起始偏移量,长度20位,后几位为偏移量,前面补0。例00000000000000000000为第一个文件(起始偏移量为0),第二个CommitLog文件的文件名为00000000001073741824(起始偏移量为1073741824=1G)
- CommitLog文件中存储了每一条Message的全量数据
- CommitLog文件路径{$HOME}/store/commitlog/
2、CommitLog文件中存储的每一条Message格式
可以在org.apache.rocketmq.store.CommitLog.DefaultAppendMessageCallback#doAppend(long, java.nio.ByteBuffer, int, org.apache.rocketmq.store.MessageExtBrokerInner)中找到对应的属性
- TOTALSIZE:消息长度
- MAGICCODE:魔术
- BODYCRC:消息体CRC
- QUEUEID:消息队列ID
- FLAG:消息标记
- QUEUEOFFSET:消息队列的逻辑偏移量
- PHYSICALOFFSET:消息队列的物理偏移量
- SYSFLAG:消息标识(Compressed/MultiTags/prepared/commit/rollback)
- BORNTIMESTAMP:消息创建日期时间戳(生产端)
- BORNHOST:生产者端address:port
- STORETIMESTAMP:消息存储时间戳
- STOREHOSTADDRESS:消息存储端address:port
- RECONSUMETIMES:消息被重新消费的次数
- Prepared Transaction Offset:事务消息偏移量
- BODY:消息体
- TOPIC:订阅的Topic
- PROPERTIES:Msg属性
ConsumeQueue
说明:
- 消费消息的索引,作用是为了提升消费时检索消息的能力和性能
- 保存了指定Topic下的队列消息在CommitLog中的起始物理偏移量offset,消息大小size和消息Tag的HashCode值
- 基于topic的commitlog索引文件
- consumequeue文件夹的组织方式如下:$HOME/store/consumequeue/{topic}/{queueId}/{fileName}
- 采取定长设计,每个条目20字节,8字节的commitlog物理偏移量、4字节消息长度、8字节tag hashcode
- 单个文件由30W个条目组成
- 每个ConsumeQueue文件大小约5.72M
ConsumeQueue文件结构:
IndexFile(索引文件)
说明:
- 通过key或时间区间来查询消息
- Index文件的存储位置是:$HOME \store\index${fileName}
- 文件名fileName是以创建时的时间戳命名的
- 固定的单个IndexFile文件大小约为400M
- 一个IndexFile可以保存 2000W个索引
- IndexFile的底层存储设计为在文件系统中实现HashMap结构,底层实现为hash索引
IndexFile文件结构:
RocketMQ——消息存储之数据文件结构
http://yoursite.com/post/b00d5835.html/