天天看点

初品RocketMQ 存储结构

作者:宁静知行者
初品RocketMQ 存储结构

CommitLog

commitLog 是RocketMQ 消息主体与元数据的存储主体,通过上面的图可以知道,producer 发送写入的消息主体都是存储于此,但消息的内容不是定长的。单个CommitLog的文件大小默认是为1G,文件名以当前文件记录的文件起始的偏移量,文件名长度为20位,如果不足,则左边补0

ComsumeQueue

CommitLog 存储的数据是在当前这个broker中的所有的topic的数据,这个文件是共享的,当comsume 要去消费数据时,如果从commitLog中去遍历对比,性能上会出现很大的问题。出于这个性能的考虑,增加了ComsumeQueue的设计, 该结构只记录具体某个topic下的数据,同时为了支持并发消费,一个topic下可以有多个ComsumeQueue,而这里记录的结构如下:

初品RocketMQ 存储结构

记录了: commitLog的偏移量,消息体大小,Tag hash值

ComsumeQueue作为消费索引,它记录了指定topic的队列消息在CommitLog中的位置,当Comsumer进行消费时,只需要从这个文件中获取相应的偏移量,就可以从 commitLog 中获取消息的元数据。

同时这里也记录了对应的tag hashcode的值,当有指定tag 消费时,可以先从这里过滤掉一部分数据,如果存储 hashCode冲突的数据,则由消费端进行值的比对进行去除。

文件目录: /store/consumequeue/{topic}/{queueId}/{fileName}

IndexFile

该文件是为了提供可以通过key或是时间范围的查询方式

文件目录: /store/index/{fileName}, 文件fileName 是以创建时的时间戳命名的,结构如下

初品RocketMQ 存储结构

indexHeader

  1. beginTimestamp: 当前文件记录的最开始时间
  2. endTimeStamp 记录当前文件记录的最后一个的时间
  3. beginPhyOffset 记录当前最开始的commitLog的偏移量
  4. endPhyOffset 记录当前最后一个的commitLog的偏移量
  5. hash slots count 记录当前 slot的个数,最大默认为500W
  6. index count 记录当前索引的数量,最大默认为2000W

Slots 与 indexes

可以将它理解为Java的HashMap结构

Slot 记录的是 HashMap Key的槽索引

Indexes 记录是每个槽里的数据,因为 Slot是通过 hash算法来定位索引,有可能会存在hash 冲突,所以在indexes 结构中会有一个4字节的字段,进行记录下一个索引的数值

indexes 里记录了 key的hash值,在commitLog中的偏移量,与 beginTimestamp的差值,下一个索引的值

继续阅读