RocketMQ的消息存储(持久化机制)

一、RocketMQ的主要存储结构

RocketMQ 主要存储的文件包括CommitLog文件、ConsumeQueue 文件、IndexFile文件。
RocketMQ的消息存储(持久化机制)_第1张图片

1.CommitLog

RocketMQ将所有主题的消息都存储在CommitLog。Producer 发送消息至 Broker 端,然后 Broker 端使用同步或者异步的方式对消息刷盘持久化,保存至 CommitLog 中。
Commitlog 文件存储目录为${ROCKET_HOME}/store/commitlog目录,每一个文件默认1G,一个文件写满后再创建另外一个,以该文件中第一个偏移量为文件名,偏移量小于20位用0 补齐。
RocketMQ的消息存储(持久化机制)_第2张图片
消息在commitLog中的存储格式为(前4个字节)总长度+消息体,所以在commitLog获取消息需要offset,再根据总长度,获取消息体的所有内容。
RocketMQ的消息存储(持久化机制)_第3张图片

2.ConsumeQueue

Broker上的分片如下图,每一个topic的消息分布在不同的broker中,每一个broker又有不同的Queue(或者叫messageQueue)。每一个Queue的存储物理文件就是consumeQueue。RocketMQ设计了ConsumeQueue作为索引文件,能够根据topic检索消息。
RocketMQ的消息存储(持久化机制)_第4张图片

ConsumeQueue的一级目录是Topic,二级目录为哪个队列。
RocketMQ的消息存储(持久化机制)_第5张图片
每个ConsumeQueue默认包含30万个索引,每个索引有20字节
RocketMQ的消息存储(持久化机制)_第6张图片

  • CommitLog offset:在CommitLog的偏移
  • size:消息大小
  • tag hashcode:tag的hash值
    RocketMQ的消息存储(持久化机制)_第7张图片
    我们可以根据queue里的消息去CommitLog找到消息的具体内容。

3.IndexFile索引文件

每一条消息除了Topic和tag以外,还有key可以帮助检索。IndexFile就是存了Key的hash值来检索消息的。
RocketMQ的消息存储(持久化机制)_第8张图片
在 Broker 端,通过Key 来计算 Hash 槽的位置,从而找到 Index 索引数据。从 Index 索引中拿到消息在CommitLog的offset。

二、RocketMQ的落盘机制

1. PageCache

Broker将数据写入CommitLog文件的时候,其实不是直接写入底层的物理磁盘文件,而是先进入OS的 PageCache 内存缓存中,后续由OS后台线程异步化的将OS PageCache中的数据刷入底层的磁盘文件中。
RocketMQ的消息存储(持久化机制)_第9张图片
在上述这种异步刷盘的模式下,Producer将消息发送给Broker,Broker将消息写入OS PageCache中,就会直接返回ACK给生产者,生产者收到ACK消息就认为写入成功了。

有异步刷盘就有同步刷盘,同步刷盘主要的不同点就是,只有Broker强制把这条消息刷入底层的磁盘文件后,才会返回ACK给生产者。

你可能感兴趣的:(rocketmq,数据库)