版本
- 基于
rocketmq-all-4.3.1
版本
简介
-
RocketMQ存储文件主要包括:CommitLog文件、ConsumerQueue文件、Index文件
- CommitLog文件:所有Topic的消息按照抵达顺序依次追加到CommitLog中,一旦写入不支持修改
- ConsumeQueue文件:消息消费队列,用于消费者消费,即消费者通过此文件来从CommitLog中获取消息。消息达到CommitLog后,将异步转发到ConsumeQueue文件
- **Index文件:**消息索引,主要存储消息key与offset的对应关系
-
RocketMQ将所有Topic的消息都存储在同一个CommitLog文件中,一般按照Topic来检索消息,所以为了提高消息消费的效率,RocketMQ引入了ConsumeQueue文件(消费队列),每一个Topic包含多个消息消费队列,每一个消费队列都有一个文件。
-
为了根据消息的属性从CommitLog文件中快速检索消息,RocketMQ引入了Index索引文件
-
存储目录
基本原理
-
Page Cache
:Page Cache
是文件系统层的Cache,主要用来减少对磁盘的I/O操作,通过对磁盘的访问变为物理内存的访问,缓存的是内存页面,操作时按照页为基本单位。在Linux系统中写入数据的时候并不会直接写到硬盘上,而是会先写到Page Cache中,并打上dirty标识,由内核线程flusher定期将被打上dirty的页发送给IO调度层,最后由IO调度决定何时落地到磁盘中,而Linux一般会把还没有使用的内存全拿来给Page Cache使用。而读的过程也是类似,会先到Page Cache中寻找是否有数据,有的话直接返回,如果没有才会到磁盘中去读取并写入Page Cache,然后再次读取Page Cache并返回。而且读的这个过程中操作系统也会有一个预读的操作,你的每一次读取操作系统都会帮你预读出后面一部分数据。当你一直在使用预读数据的时候,系统会帮你预读出更多的数据(最大到128K)。 -
Buffer Cache
:Buffer Cache
是针对设备的,实际操作按块为基本单位,对于裸盘的读写会占用Buffer Cache
,当读写完成之后,会归还给操作系统。- 在linux2.4内核中
Buffer Cache
和Page Cache
是共存的,因为文件的读写最终会转化为块设备的读写,即同一份文件的数据,可能既在Buffer Cache
中也在Page Cache
中,这样就造成了物理内存的浪费。 - linux2.6内核对
Buffer Cache
和Page Cache
进行了合并,统一为Page Cache
- 在linux2.4内核中