RocketMQ 存储文件

磁盘存储文件

-rw-r--r-- 1 root root    0 Jan 18 11:54 abort
-rw-r--r-- 1 root root 4.0K Mar 14 17:39 checkpoint
drwxr-xr-x 2 root root   34 Feb 14 14:33 commitlog
drwxr-xr-x 2 root root  280 Mar 14 17:40 config
drwxr-xr-x 7 root root  138 Feb 20 10:28 consumequeue
drwxr-xr-x 2 root root   31 Feb 20 10:18 index
-rw-r--r-- 1 root root    4 Feb 20 10:18 lock

abort:RocketMQ 启动时生成,正常关闭时删除,如果启动时存在该文件,代表 RocketMQ 被异常关闭
checkpoint:文件检查点,存储 commitlog 、consumequeue、indexfile 最后一次刷盘时间或时间戳
index:消息索引文件存储目录
consumequeue:消息消费队列存储目录
commitlog:消息存储目录
config:运行时的配置信息,包含主席消息过滤信息、集群消费模式消息消费进度、延迟消息队列拉取进度、消息消费组配置信息、topic配置属性等

CommitLog 文件

drwxr-xr-x 2 root root   34 Feb 14 14:33 .
drwxr-xr-x 6 root root  113 Feb 14 13:59 ..
-rw-r--r-- 1 root root 1.0G Mar 14 17:48 00000000000000000000
-rw-r--r-- 1 root root 1.0G Mar 19 21:33 00000000006000000000

文件名为 20 位数字组织,以该文件第一条消息的偏移量为文件名,长度不足 20 的在前面补 0。文件默认大小为 1G,可根据 mappedFileSizeCommitLog 属性改变文件大小。

存储所有消息内容,写满一个文件后生成新的 commitlog 文件。所有 topic 的数据存储在一起,逻辑视图如下:

RocketMQ 存储文件

ConsumeQueue 文件

RocketMQ 基于主题的订阅模式实现消息消费,由于同一主题的消息不连续的存储在 CommitLog 文件中,遍历 CommitLog 文件会导致效率非常低下,为了适应消息消费的检索需求,设计了消息消费队列文件。一个 ConsumeQueue 文件可以作为检索指定 topic 的消息索引。

[root@xxxx consumequeue]# tree -L 3
|-- smsCallbackReply
|   |-- 0
|   |   `-- 00000000000000000000
|   |-- 1
|   |   `-- 00000000000000000000
|   |-- 2
|   |   `-- 00000000000000000000
|   `-- 3
|       `-- 00000000000000000000
|-- smsCallbackStatus
|   |-- 0
|   |   |-- 00000000000000000000
|   |   `-- 00000000000006000000
|   |-- 1
|   |   |-- 00000000000000000000
|   |   `-- 00000000000006000000
|   |-- 2
|   |   |-- 00000000000000000000
|   |   `-- 00000000000006000000
|   `-- 3
|       |-- 00000000000000000000
|       `-- 00000000000006000000

ConsumeQueue 文件存储消息的逻辑偏移量,而不存储消息的全部内容,存储格式如下:

RocketMQ 存储文件

Index 索引文件

RocketMQ 引入了 Hash 索引机制为消息建立索引,对 CommitLog 进行数据索引。索引文件布局如下:

RocketMQ 存储文件

IndexHead 数据:
beginTimestamp:该索引文件包含消息的最小存储时间
endTimestamp:该索引文件包含消息的最大存储时间
beginPhyoffset:该索引文件中包含消息的最小物理偏移量(commitlog 文件偏移量)
endPhyoffset:该索引文件中包含消息的最大物理偏移量(commitlog 文件偏移量)
hashSlotCount:hashslot个数,并不是 hash 槽使用的个数,在这里意义不大,
indexCount:已使用的 Index 条目个数

Hash 槽:
一个 IndexFile 默认包含 500W 个 Hash 槽,每个 Hash 槽存储的是落在该 Hash 槽的 hashcode 最新的 Index 的索引

Index 条目列表
hashcode:key 的 hashcode
phyoffset:消息对应的物理偏移量
timedif:该消息存储时间与第一条消息的时间戳的差值,小于 0 表示该消息无效
preIndexNo:该条目的前一条记录的 Index 索引,hash 冲突时,根据该值构建链表结构

Checkpoint 文件

记录 CommitLog,ConsumeQueue,IndexFile 的刷盘时间点,文件固定长度为 4k,其中只用该文件的前 24个字节,存储格式如下:

RocketMQ 存储文件

相关推荐