RocketMq消息持久化(一)——存储架构设计概述

news2024/9/20 12:37:53

1.RocketMq 存储概要设计

RocketMQ主要存储的文件包括Comitlog文件、ConsumeQueue文件、IndexFile文件,存储路径为${ROCKET_HOME}/store,默认在当前用户目录下的store目录:

在这里插入图片描述
store目录下的文件如上所示,分别有:checkpoint、commitlog、config、consumequeue、index、lock,下面一一介绍一下RocketMQ主要的存储文件夹:

  • commitlog: 消息存储目录,消息实际存储地方,所有的topic消息都会被存储在ComitLog文件,消息内容会被定期清除,默认大小为1G,可见MessageStoreConfig属性mappedFileSizeCommitLog:
    • private int mappedFileSizeCommitLog = 1024 * 1024 * 1024;
    • config: 运行期间的一些配置信息,主要包括下列信息:
    • consumerFilter.json:主题消息过滤信息
    • consumerOffset.json:集群消费模式消息消费进度
    • delayOffset.json:延时消息队列拉取进度
    • subscriptionGroup.json:消息消费组配置信息
    • topics.json:topic配置属性
  • consumequeue: 消息消费队列的存储目录,存储索引映射文件,一个queue一个文件,记录每个topic下的queue的offset在消息文件的偏移量
  • index: 消息索引文件的存储目录
  • abort: 如果存在abort文件说明Broker非正常关闭,该文件默认启动时创建,正常退出之前删除,同时RocketMq也是利用该文件来确定CommitLog文件和Index文件,consumequeue文件是否一致
  • checkpoint: 文件检测点,存储commitlog文件,index索引文件,consumequeue最后一次刷盘时间戳

1.1 数据流向

进入RocketMQ存储剖析之前,先看一下RocketMQ数据流向,如图所示:
在这里插入图片描述
生产者推将消息推送给对应的Broker之后,Broker会将消息内容持久化到对应的commitLog文件,然后ReputMessageService线程会定时以CommitLog文件为基础来更新ConsumeQueue文件和index文件;作为消费者,会根据ConsumeQueue的offset信息,拉取对应queue的数据消费,所以,当消息生产者提交的消息存储在Commitlog文件中,ConsumeQueue、IndexFile需要及时更新,否则消息无法及时被消费

2.RocketMq数据文件职责

基于上面的介绍,我们大致了解到了RocketMQ整个存储设计所关联到的文件结构以及文件的数据流向,下面我们再来介绍核心数据文件的内容结构以及每个文件所承担的核心能力,而对于具体的源码实现,博主会放到后续文章,正在排版中,感兴趣的朋友可关注一下,后续会持续更新RocketMq的相关内容。

2.1 CommitLog文件

CommitLog文件的消息组织格式如下:
在这里插入图片描述
每条消息的前四个字节存储该消息的总长度,然后是固定长度的其它属性,RocketMq其它属性因涉及种类比较多,将近20种属性类型,此处只简单介绍下一些核心属性:

  • MAGICCODE:魔数,4字节。固定值0xdaa320a7
  • QUEUEID:消息消费队列ID,4字节
  • SYSFLAG:消息系统Flag,例如是否压缩、是否是事务消息等,4字节
  • BodyLength:消息体长度,4字节
  • Topic:主题,长度为TopicLength中存储的值

2.1.1 核心能力

在RocketMq的实现中,commitlog对应的数据结构为org.apache.rocketmq.store.CommitLog,其提供的核心能力有:

  • 根据偏移量查找消息
  • 文件刷盘
  • 文件恢复

2.2 ConsumerQueue

到这里,我们已经知道,RoceketMq会将所有消息存储在commitlog目录下面,虽说目录下面会分文件,但是一个Broker实例有多少个Topic,每个Topic下面会有多少条消息我们也不知道,所以为了加快消息检索速度,RocketMq设计了消息消费队列文件(Consumequeue),该文件可以看成是Commitlog关于消息消费的“索引”文件,consumequeue的第一级目录为消息主题,第二级目录为主题的消息队列,如下所示:
在这里插入图片描述
为了加速ConsumeQueue消息条目的检索速度与节省磁盘空间,每一个Consumequeue条目不会存储消息的全量信息,其存储格式如下:
在这里插入图片描述

核心能力

  • 根据逻辑偏移量,时间戳查找消息内容
  • ConsumerQueue的构建与恢复
    对比与Kafka,此处的设计,是否是RocketMq 优于Kafka的设计,了解Kafka的童鞋可留下评论与博主一起学习交流一下

2.3 Index索引文件

RocketMQ的index又称之为Hash索引,其主要是为消息建立索引机制,既然是Hash索引,那必然存在Hash槽和Hash冲突问题,下面我们先看下RocketMQ的Hash索引的文件结构,然后再讲述RocketMQ是怎么解决Hash冲突的:
在这里插入图片描述
从图中可以看出,IndexFile总共包含IndexHeader、Hash槽、Hash条目(数据):

  • IndexHeader头部,包含40个字节,记录该IndexFile的统计信息,其结构如下
    • beginTimestamp:该索引文件中包含消息的最小存储时间
    • endTimestamp:该索引文件中包含消息的最大存储时间
    • beginPhyoffset:该索引文件中包含消息的最小物理偏移量(commitlog文件偏移量)
    • endPhyoffset:该索引文件中包含消息的最大物理偏移量(commitlog文件偏移量)
    • hashslotCount:hashslot个数,并不是hash槽使用的个数,在这里意义不大。
    • indexCount:Index条目列表当前已使用的个数,Index条目在Index条目列表中按顺序存储
  • Hash槽,一个IndexFile默认包含500万个Hash槽,每个Hash槽存储的是落在该Hash槽的hashcode最新的Index的索引
  • Index条目列表,默认一个索引文件包含2000万个条目,每一个Index条目结构如下:
    • hashcode:key的hashcode
    • phyoffset:消息对应的物理偏移量
    • preIndexNo:该条目的前一条记录的Index索引,当出现hash冲突时,构建的链表结构

对于RocketMQ如何解决Hash冲突关键点在于Hash槽中存储的是该HashCode所对应的最新的Index条目的下标,新的Index条目的最后4个字节存储该HashCode上一个条目的Index下标,至于Hash冲突解决的详细实现以及Index文件数据写入过程,此处,博主这里不再详细介绍,具体的实现在后续的源码实现章节再详细介绍org.apache.rocketmq.store.index.IndexFile#putKey整个代码实现,其实并不难,就跟通常解决Hash冲突的办法类似相同

2.4 checkpoint 文件

checkpoint的作用是记录Comitlog、ConsumeQueue、Index文件的刷盘时间点,文件固定长度为4k,其中只用该文件的前面24个字节,其存储格式如图所示:
在这里插入图片描述

  • physicMsgTimestamp:commitlog文件刷盘时间点。
  • logicsMsgTimestamp:消息消费队列文件刷盘时间点。
  • indexMsgTimestamp:索引文件刷盘时间点

3. 总结

RocketMQ是一款高性能的消息中间件,存储部分的设计是核心,存储的核心是IO访问性能,基于对于RocketMQ的兴趣,博主后续会将整个学习过程,不断记录,感兴趣的朋友可关注留下评论,一起学习RocketMQ整个优秀的设计,下图是串联整个消息的存储过程,因涉及到知识点比较多,还在不断细化中
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计JAVA医院床位管理系统

[附源码]计算机毕业设计JAVA医院床位管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

Halo搭建个人博客网站

Halo搭建个人博客网站 一、docker部署Halo 目前测试了两种方法安装Halo,第一种是使用Jar包安装:提供JAR包资源,不过因为使用jar包部署需要Java11才可以,我本机使用的是Java8,所以暂时不做调整。第二种是通过docker安装。 1.1 启…

项目实例:H3C端口镜像 (镜像单目的端口 镜像多目的端口)

一、项目实例 某局业务系统三级等保项目:配置只列出端口镜像部分,其他部分及设备(略) 1.1 边界部署两台防火墙做HA高可用 1.2 核心使用两台H3C交换机做堆叠,上联线路分别连接防火墙(主)、防火…

【Python自然语言处理】隐马尔可夫模型中维特比(Viterbi)算法解决商务选择问题实战(附源码 超详细必看)

需要源码请点赞关注收藏后评论区留言私信~~~ 一、统计分词 统计分词基本逻辑是把每个词语看做由单字组成,利用统计学原理计算连接字在不同文本中出现的次数,以此判断相连字属于特定词语的概率。 二、隐马尔可夫模型 当一个随机过程在给定现在状态及所…

计算机组成详解(运算器、控制器、存储器、I/O部件)

文章目录1 概述1.1 计算机组成图2 三大部件2.1 中央处理器 CPU运算器 ALU控制器 CU2.2 内存储器2.3 输入输出设备3 扩展3.1 计算机系统结构图1 概述 1.1 计算机组成图 2 三大部件 2.1 中央处理器 CPU 运算器 ALU 运算器 ALU:Arithmetic Logic Unit,算…

游泳可以戴的耳机有哪些、推荐几款真正能戴着游泳的蓝牙耳机

现在身边很多人也是非常喜欢游泳,尤其是到了夏天的时候,这项运动可以消耗体内多余脂肪,起到很好的强身健体的作用,比其跑步来说有着明显的优势。不过想要转移游泳带来的疲惫,那么在水里面听听激情的音乐是必不可少的&a…

DAY04-网页布局实战常用HTML标签完整盒模型

文章目录网页布局实战一 HTML标签二 布局标签三 文本标签1文字标签2 列表3 图片标签4 超连接5 相对路径与绝对路径四 行和块的区分五 行和块的转换六 标准盒模型外边距内边距边框盒子模式七 案例网页布局实战 一 HTML标签 HTML的标签分为两类: 布局标签&#xff…

springboot中使用Spring Data Jpa

Springboot 中如何集成spring data jpa 一 什么是ORM? ORM即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道&#…

图论期末复习(《图论机器应用》——朴月华)

文章目录一、图的基本概念二、图的连通性三、树四、E 图与 H 图五、对集与独立集六、平面图与网络流一、图的基本概念 1、基本概念2、顶点的度 概念,有关定理及推论(握手定理),度序列的概念及相关结论,根据度序列画图…

【星球】【slam】 研讨会(5)VINS:Mono+Fusion 重点提炼

VINSFusion重点梳理 A重点梳理和回顾 1传感器前端 视觉前端 特征点提取 opencv接口 goodfeaturestotrack 光流追踪 opencv接口 calcOptical 异常点剔除 光流剔除的异常点 本质矩阵的校验(不符合本质矩阵的点筛除) 特征点去畸变 “逐渐逼近式”的计算方式 特征点性质的计算 IM…

常用算法-Java

基础概念 程序 数据结构 算法 算法特性:输入、输出、有穷性、确定性、可靠性 算法目标:正确性、可读性、健壮性、运行时间少、内存空间小 时间复杂度 时间复杂度是用来估计算法运行时间的一个单位。 一般来说,时间复杂度高的算法比时…

【高并发基础】理解 MVCC 及提炼实现思想

文章目录1. 前言2. MVCC 概念2.1 MVCC 版本链2.2 MVCC trx_id2.3 MVCC Read View3. 提出问题4. 解决问题4.1 不读未提交的数据4.1.1 一般的并发情况4.1.2 特殊的并发情况4.1.3 剩下的并发情况4.2 如果自己修改了数据,要第一时间读到5. MySQL RC 使用 MVCC5.1 MVCC D…

Git使用学习记录(一、前置知识)

Git使用学习记录(一、前置知识) Git简介 Git 是什么? Git 是目前为止最为先进的分布式版本控制系统(分布式版本控制系统没有“中央服务器”,每个⼈的电脑上都是⼀个完整的版本库,⼯作时不需要联网&#xff…

Dynamics 365 Environment Variables(环境变量)的应用

环境变量这个功能很早就有了,但最近才关注到,是个不错的功能,所以写篇介绍下它的应用。 项目里都会有配置实体这么个东西,用于存储各种常量或者与其他系统集成时的各种配置参数,以往我们都是自定义一个实体用来存放&am…

PyTorch 2.0发布了,一行代码提速76%

PyTorch 官方:我们这次的新特性太好用了,所以就直接叫 2.0 了。 前段时间,PyTorch 团队在官方博客宣布 Pytorch 1.13 发布,包含 BetterTransformer 稳定版等多项更新。在体验新特性的同时,不少人也在期待下一个版本的推…

Mysql进阶学习(十)存储过程和函数流程控制结构

Mysql进阶学习(十)存储过程和函数&流程控制结构存储过程和函数1. 存储过程1.1 创建语法1.2 调用语法1.3 删除存储过程1.4 查看存储过程的信息2. 函数2.1 创建语法2.2 调用语法2.3 查看函数2.4 删除函数3. 存储过程/函数案例4. 流程控制结构4.1. 分支…

心肺运动试验----各类参数分析笔记

1:定义 什么是心肺运动试验? 心肺运动试验(CPET)是一种可以使研究者同时观察患者的心血管系统和呼吸系统对同一种运动应激的反应情况的临床试验。因为,呼吸道的气体交换与循环相关联,可以同时反映心排血量、肺血流以及外周O2的摄…

详解设计模式:命令模式

命令模式(Command Pattern)也被称为行动模式(Action Pattern)、事物模式(Transaction Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。 命令模式 是一种数据驱动的设计模式。请求以命令…

序列类型(元组()、列表[]、字符串““)、集合类型({}、set())

序列类型 组合数据类型能够将多个同类型或不同类型的数据组织起来 ,通过单一的表示使数据操作更有序更容易。根据数据之间的 关系,组合数据类型可以分为三类: 序列类型、集合类型和映射类型。 • 序列类型是一个元素向量,元素之间…

Centos8安装CDH解决不兼容问题

问题 我的配置 系统: centos8 安装包: CDH-5.16.1-1.cdh5.16.1.p0.3-el7.parcel CDH-5.16.1-1.cdh5.16.1.p0.3-el7.parcel.sha cloudera-manager-centos7-cm5.16.1_x86_64.tar.gz manifest.json 在 http://192.168.1.1:7180/ 上通过web分配percel时分配…