【消息队列RocketMQ】四、RocketMQ 存储机制与性能优化

一、RocketMQ 存储机制详解

1.1 存储文件结构​

RocketMQ 的存储文件主要分布在store目录下,该目录是在broker.conf配置文件中通过storePathRootDir参数指定的,默认路径为${user.home}/store 。主要包含以下几种关键文件类型:​

        1.1.1 CommitLog 文件:所有主题的消息都顺序存储在 CommitLog 文件中,它是 RocketMQ 消息存储的核心。每个 CommitLog 文件默认大小为 1G,文件名以该文件创建时第一条消息的偏移量命名,如00000000000000000000。消息在 CommitLog 中以固定格式存储,包含消息长度、CRC 校验码、消息体等信息。这种顺序存储方式极大地提高了磁盘的写入性能。​

        1.1.2 ConsumeQueue 文件:ConsumeQueue 是消息消费队列的存储文件,每个 Topic 的每个 Queue 都对应一个 ConsumeQueue 文件。它起到索引的作用,存储了消息在 CommitLog 中的物理偏移量、消息大小、Tag 的哈希值等信息。通过 ConsumeQueue,Consumer 可以快速定位到消息在 CommitLog 中的位置,从而实现高效的消息拉取。ConsumeQueue 文件默认大小约为 600W 条消息,文件名同样以偏移量命名。​

        1.1.3 IndexFile 文件:IndexFile 用于实现消息的快速检索,主要为了满足根据消息 Key 或时间范围查询消息的需求。它存储了消息的 Key、CommitLog 偏移量、时间戳等信息,并构建了 Hash 索引。每个 IndexFile 文件固定大小为 400M,文件名以创建时的时间戳命名。​

        1.1.4 Checkpoint 文件:Checkpoint 文件记录了 CommitLog、ConsumeQueue 和 IndexFile 的最后更新时间戳,用于 Broker 重启时进行数据恢复,确保数据的一致性和完整性。​

        1.1.5 Abort 文件:Abort 文件是一个标识文件,当 Broker 正常关闭时,该文件会被删除;如果 Broker 异常退出,Abort 文件会保留,用于指示 Broker 下次启动时需要进行数据恢复操作。​

1.2 消息写入原理​

        1.2.1 Producer 发送消息:Producer 将消息发送到 Broker,Broker 接收到消息后,首先会对消息进行校验,如检查消息大小、Topic 是否存在等。​

        1.2.2 写入 CommitLog:校验通过后,消息会被顺序写入 CommitLog 文件。在写入过程中,会为消息分配唯一的偏移量,同时计算 CRC 校验码,确保消息的完整性。由于 CommitLog 采用顺序写入,充分利用了磁盘的顺序读写特性,大大提高了写入效率。​

        1.2.3 更新 ConsumeQueue:消息写入 CommitLog 成功后,Broker 会根据消息所属的 Topic 和 Queue,更新对应的 ConsumeQueue 文件。在 ConsumeQueue 中,记录该消息在 CommitLog 中的偏移量等信息,为 Consumer 拉取消息提供索引。​

        1.2.4 更新 IndexFile(可选):如果消息设置了 Key,Broker 会将消息的 Key、CommitLog 偏移量等信息写入 IndexFile,构建 Hash 索引,以便后续根据 Key 进行快速查询。​

1.3 消息读取原理​

        1.3.1 Consumer 请求消息:Consumer 向 Broker 发送拉取消息的请求,请求中包含 Topic、Queue 等信息。​

        1.3.2 查询 ConsumeQueue:Broker 接收到请求后,根据 Topic 和 Queue 找到对应的 ConsumeQueue 文件,从 ConsumeQueue 中读取消息在 CommitLog 中的偏移量和消息大小等信息。​

        1.3.3 读取 CommitLog:根据 ConsumeQueue 中获取的偏移量,从 CommitLog 文件中读取完整的消息数据。在读取过程中,会验证 CRC 校验码,确保消息的正确性。​

        1.3.4 返回消息给 Consumer:Broker 将读取到的消息返回给 Consumer,Consumer 接收到消息后进行业务处理。

二、CentOS 7 下 RocketMQ 存储相关配置​

2.1 配置文件修改​

在 CentOS 7 上,RocketMQ 的主要配置文件为broker.conf,位于 RocketMQ 安装目录的conf文件夹下。以下是一些与存储相关的重要配置参数及其修改说明:

        1、存储路径配置

storePathRootDir=/home/rocketmq/store
storePathCommitLog=/home/rocketmq/store/commitlog
storePathConsumeQueue=/home/rocketmq/store/consumequeue
storePathIndex=/home/rocketmq/store/index
storeCheckpoint=/home/rocketmq/store/checkpoint
abortFile=/home/rocketmq/store/abort

上述配置分别指定了 RocketMQ 各类存储文件的根目录、CommitLog 文件目录、ConsumeQueue 文件目录、IndexFile 文件目录、Checkpoint 文件路径以及 Abort 文件路径。可根据实际磁盘空间和业务需求调整这些路径,例如将存储文件分散到不同的磁盘分区,以提高 I/O 性能。

        2、刷盘机制配置

flushDiskType=ASYNC_FLUSH
# 或
# flushDiskType=SYNC_FLUSH

flushDiskType参数用于设置刷盘方式,有ASYNC_FLUSH(异步刷盘)和SYNC_FLUSH(同步刷盘)两种模式。异步刷盘时,消息写入内存后立即返回成功响应,由后台线程定期将内存中的数据刷入磁盘,这种方式写入性能高,但存在数据丢失风险;同步刷盘则是在消息写入磁盘后才返回成功响应,保证了数据的可靠性,但会降低写入性能。

        3、文件大小配置

mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=30000000

mapedFileSizeCommitLog用于设置 CommitLog 文件的大小,默认值为 1G(1073741824 字节);mapedFileSizeConsumeQueue用于设置 ConsumeQueue 文件的大小,默认约为 30M(30000000 字节)。可根据实际业务量和磁盘空间调整这些参数,例如业务消息量较大时,适当增大 CommitLog 文件大小,减少文件切换频率。

2.2 命令操作

        1、查看存储文件状态:可通过查看store目录下的文件及相关日志,了解存储文件的状态。例如,查看 CommitLog 文件的内容(不建议直接查看二进制文件,可通过日志辅助分析):

ls -l /home/rocketmq/store/commitlog

        2、重启 Broker 使配置生效:修改broker.conf配置文件后,需要重启 Broker 才能使配置生效。先停止 Broker:

sh mqshutdown broker

再重新启动 Broker:

nohup sh mqbroker -c conf/broker.conf &

三、RocketMQ 性能优化策略​

3.1 刷盘机制优化

        1、根据业务场景选择刷盘方式:对于可靠性要求极高的业务,如金融交易,应选择SYNC_FLUSH同步刷盘方式,确保消息不丢失;对于对性能要求较高,可容忍一定数据丢失风险的业务,如日志记录,可采用ASYNC_FLUSH异步刷盘方式,提升写入性能。

        2、调整异步刷盘参数:如果采用异步刷盘,可通过调整flushCommitLogLeastPages和flushCommitLogThoroughInterval参数优化刷盘性能。flushCommitLogLeastPages表示每次异步刷盘时,内存中至少积累的页数(默认为 4 页);flushCommitLogThoroughInterval表示强制刷盘的时间间隔(单位为毫秒,默认值为 1000 * 60 * 5,即 5 分钟)。可根据实际业务量,适当减小flushCommitLogLeastPages,缩短flushCommitLogThoroughInterval,以提高数据刷盘的及时性。

3.2 文件存储优化

        1、合理设置文件大小:根据业务消息量和磁盘空间,合理调整 CommitLog 和 ConsumeQueue 文件的大小。避免文件过大导致查询效率降低,或文件过小频繁切换文件带来的性能开销。例如,对于消息量较小且消息生命周期较短的业务,可适当减小 ConsumeQueue 文件大小。

        2、分散存储路径:将 CommitLog、ConsumeQueue、IndexFile 等存储文件分散到不同的磁盘分区或物理磁盘上,减少 I/O 竞争,提高读写性能。在broker.conf中修改存储路径配置实现。

3.3 内存映射优化​

RocketMQ 采用内存映射(mmap)技术,将文件映射到内存中,减少数据在用户态和内核态之间的拷贝,提高读写效率。可通过调整系统参数vm.max_map_count来优化内存映射性能。在 CentOS 7 上,使用以下命令临时调整该参数:

sysctl -w vm.max_map_count=655300

如需永久生效,可修改/etc/sysctl.conf文件,添加或修改:

vm.max_map_count=655300

然后执行sysctl -p使配置生效。

3.4 其他优化措施​

        1、负载均衡:合理配置 Producer 和 Consumer 的负载均衡策略,避免单个 Broker 负载过高。例如,Producer 可采用轮询等方式将消息发送到不同的 Broker,Consumer 可根据消费能力动态分配消息队列。​

        2、定期清理过期数据:对于不再需要的消息,可通过设置消息的过期时间(在发送消息时设置maxTimeToLive参数),让 Broker 自动清理过期数据,减少存储压力。

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

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

相关文章

C++入门小馆: 探寻vector类

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…

CSS-跟随图片变化的背景色

CSS-跟随图片变化的背景色 获取图片的主要颜色并用于背景渐变需要安装依赖 colorthief获取图片的主要颜色. 并丢给背景注意 getPalette并不是个异步方法 import styles from ./styles.less; import React, { useState } from react; import Colortheif from colorthief;cons…

RAGFlow:构建高效检索增强生成流程的技术解析

引言 在当今信息爆炸的时代,如何从海量数据中快速准确地获取所需信息并生成高质量内容已成为人工智能领域的重要挑战。检索增强生成(Retrieval-Augmented Generation, RAG)技术应运而生,它将信息检索与大型语言模型(L…

SpringBoot应用:MyBatis的select语句如何返回数组类型

在SpringBoot应用中&#xff0c;比如想返回一个表的主键id构成的Long型数组Long[]&#xff0c;需要在XxxMapper.xml文件中这样定义select语句&#xff1a; <select id"selectIds" parameterType"int" resultType"Long">select id from sy…

【HFP】蓝牙HFP协议来电处理机制解析

目录 一、协议概述与技术背景 1.1 HFP协议演进 1.2 核心角色定义 1.3 关键技术指标 二、来电接入的核心交互流程 2.1 基础流程概述&#xff1a;AG 的 RING 通知机制 2.2 HF 的响应&#xff1a;本地提醒与信令交互 三、带内铃声&#xff08;In-Band Ring Tone&#xff0…

【每天一个知识点】如何解决大模型幻觉(hallucination)问题?

解决大模型幻觉&#xff08;hallucination&#xff09;问题&#xff0c;需要从模型架构、训练方式、推理机制和后处理策略多方面协同优化。 &#x1f9e0; 1. 引入 RAG 框架&#xff08;Retrieval-Augmented Generation&#xff09; 思路&#xff1a; 模型生成前先检索知识库中…

基于STC89C52RC和8X8点阵屏、独立按键的小游戏《打砖块》

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、8X8点阵屏2、独立按键3、定时器04、定时器1 四、主函数总结 系列文章目录 前言 用的是普中A2开发板&#xff0c;外设有&#xff1a;8X8LED点阵屏、独立按键。 【单片机】STC89C52RC 【频率】12T11.0592MHz 效…

C++学习:六个月从基础到就业——C++学习之旅:STL迭代器系统

C学习&#xff1a;六个月从基础到就业——C学习之旅&#xff1a;STL迭代器系统 本文是我C学习之旅系列的第二十四篇技术文章&#xff0c;也是第二阶段"C进阶特性"的第二篇&#xff0c;主要介绍C STL迭代器系统。查看完整系列目录了解更多内容。 引言 在上一篇文章中…

leetcode刷题——判断对称二叉树(C语言版)

题目描述&#xff1a; 示例 1&#xff1a; 输入&#xff1a;root [6,7,7,8,9,9,8] 输出&#xff1a;true 解释&#xff1a;从图中可看出树是轴对称的。 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 解释&#xff1a;从图中可看出最…

无法右键下载文档?网页PDF下载方法大全

适用场景&#xff1a;绕过付费限制/无法右键下载/动态加载PDF 方法1&#xff1a;浏览器原生下载&#xff08;成功率60%&#xff09; Chrome/Edge&#xff1a; 在PDF预览页点击工具栏 ⬇️下载图标&#xff08;右上角&#xff09; 快捷键&#xff1a;CtrlS → 保存类型选PDF …

基于缺失数据的2024年山东省专项债发行报告

一、数据情况 本次报告选取了山东省财政局公开的2024年专项债数据,共计2723条,发行期数是从第1期到第58期,由于网络原因,其中25期到32期,54到57期的数据有缺失,如下图所示。 从上图看出,一年52周,平均每周都有一期发布,因此持续做专项债的谋划很重要,一定要持续谋划…

Ubuntu数据连接访问崩溃问题

目录 一、分析问题 1、崩溃问题本地调试gdb调试&#xff1a; 二、解决问题 1. 停止 MySQL 服务 2. 卸载 MySQL 相关包 3. 删除 MySQL 数据目录 4. 清理依赖和缓存 5.重新安装mysql数据库 6.创建程序需要的数据库 三、验证 1、动态库更新了 2、头文件更新了 3、重新…

Linux系统编程 day10 接着线程(中期头大,还要写论文)

线程有点懵逼 线程之前函数回顾以及总结部分&#xff08;对不清楚的问题再思考&#xff09; 线程控制原语 进程控制原语 pthread_create(); fork(); pthread_self(); getpid(); pthread_exit(); exit(); pthread_join(); …

《浔川AI翻译v6.1.0问题已修复公告》

《浔川AI翻译v6.1.0问题已修复公告》 尊敬的浔川AI翻译用户&#xff1a; 感谢您对浔川AI翻译的支持与反馈&#xff01;我们已针对 **v6.1.0** 版本中用户反馈的多个问题进行了全面修复&#xff0c;并优化了系统稳定性。以下是本次修复的主要内容&#xff1a; 已修复问题 ✅…

深入理解 java synchronized 关键字

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

华三(H3C)与华为(Huawei)设备配置IPsec VPN的详细说明,涵盖配置流程、参数设置及常见问题处理

以下是针对华三&#xff08;H3C&#xff09;与华为&#xff08;Huawei&#xff09;设备配置IPsec VPN的详细说明&#xff0c;涵盖配置流程、参数设置及常见问题处理&#xff1a; 一、华三&#xff08;H3C&#xff09;设备IPsec VPN配置详解 1. 配置流程 华三IPsec VPN配置主要…

KBEngine 源代码分析(一):pyscript 目录文件介绍

pyscript 目录文件 pyscript 目录提供了 KBEngine 把 C++ 代码中的类注册到 Python 的机制 同时也提供了 C++ 调用 Python 方法的例子 相对现在的 C++ 17/20 ,这个目录的分装相对不优雅 不过不影响学习如何使用 Python 官方库提供的 API ,实现 C++ Python 混合编程 C++ …

线程入门3

synchronized修饰方法 synchronized可以修饰代码块(在线程入门2中有例子)&#xff0c;也可以修饰普通方法和静态方法。 修饰普通方法 修饰普通方法简化写法&#xff1a; 修饰静态方法 修饰静态方法简化写法&#xff1a; 注意&#xff1a;利用synchronized上锁&#xff0c;锁的…

linux上Flexlm命令

FlexLM 是一种灵活的许可证管理系统&#xff0c;广泛用于各种软件产品中&#xff0c;如 Autodesk 的 AutoCAD 和 Autodesk 的其他产品。它允许软件开发商控制软件的使用和分发&#xff0c;同时提供灵活的许可证管理策略。在 Linux 系统中使用 FlexLM 通常涉及到几个关键步骤&am…

【Java学习方法】终止循环的关键字

终止循环的关键字 一、break 作用&#xff1a;跳出最近的循环&#xff08;直接结束离break最近的那层循环&#xff09; 使用场景&#xff1a;一般搭配if条件判断&#xff0c;如果满足某个条件&#xff0c;就结束循环&#xff0c;&#xff08;场景&#xff1a;常见于暴力枚举中…