RocketMQ引发的磁盘预警复盘

news2024/12/27 17:41:14

RocketMQ引发的磁盘预警复盘

  • 前言
  • 发现问题
  • 排查过程
    • Step 1
    • Step 2
    • Step 3
    • Step 4
    • Step 5
    • Step 6
    • Step 7
    • Step 8
    • Step 9
  • 解决方式
  • 写在最后

前言

一款优秀的中间件,参数的缺省值必然是经过反复验证得出的最优解,勿动!

发现问题

某台SaaS服务器磁盘不足发出告警。但是另外台业务量更大、配置相同的SaaS服务器一切正常,于是开始着手排查问题。

排查过程

Step 1

怀疑是日志文件导致的磁盘不足。排查后发现并没有大量的日志文件生成,并且归档的脚本运行正常。

Step 2

对比两台服务器的磁盘使用情况。使用df -h指令后发现,是RocketMQ下的store文件夹竟然有80多G,而另外一台业务量更大的服务器只有50多G。基本就定位到了本次磁盘告警的罪魁祸首了。

Step 3

进入目录store/commitlog/,确认是否真的产生了这么多的消息。找到最新的commitlog文件,把文件名换算成G发现一共也就只有20多G的消息,那么剩下的60多G在哪里呢?

Step 4

使用du -sh *指令后发现,consumequeue文件夹大的离谱。consumequeue下只是存储了commitlog的消息索引不应该有这么大啊。排查了几个topic后发现,所有consumequeue文件夹下的索引文件,大小都为477MB。
在这里插入图片描述

Step 5

翻阅源码,找到consumequeue创建文件大小时的配置参数。

org.apache.rocketmq.store.queue.ConsumeQueueStore#createConsumeQueueByType

在这里插入图片描述
所以mappedFileSizeConsumeQueue这个配置决定了consumeQueue的文件大小,查了下生产的配置,发现了问题。
在这里插入图片描述
mappedFileSizeConsumeQueue这里的单位是字节,换算成MB后问题一目了然。
在这里插入图片描述
为了验证上述结论,通过MQ Dashborad手动创建了新的Topic,然后手动发送了一条新的消息。确认了新创建的ConsumeQueue文件就是477MB。

Step 6

到此,满怀欣喜的以为完成了闭环。然而,这是个开始。
再测试环境用相同的配置文件部署了一套新MQ,重复上述的测试流程发现
在这里插入图片描述
文件大小是4K。用stat指令对比了下两个文件
在这里插入图片描述
在这里插入图片描述

Blocks字段指的是512字节构成的块的个数,IO Block是指文件系统的块的大小一般为4096字节。

Step 7

分析下源码,看下RocketMQ在创建文件时,是否会预占空间。

Broker启动时会创建默认的消费存储处理类,在DefaultMessageStore的构造方法中会创建AllocateMappedFileService

org.apache.rocketmq.broker.BrokerController#initialize

在这里插入图片描述

AllocateMappedFileService可以理解为一个异步线程,主要工作是初始化MappedFile和预热MappedFile,这里有一段比较关键的逻辑。

org.apache.rocketmq.store.AllocateMappedFileService#mmapOperation

在这里插入图片描述
在这里插入图片描述
当开启文件预热的配置时,才会去通过mlock方式预占空间。但是,warmMapedFileEnable默认值为false,并且没有做修改。所以按理来说,不应该会有预占空间这回事才对,477MB还是不合理。

Step 8

到此为止,代码层面已经无法解释了。通过github联系上了RocketMQ作者,请教了这个问题。RocketMQ作者给出的排查方向是硬件和文件系统。于是,对比了一下两台SaaS服务器的硬盘,果真还不一样。
一台高效云盘 200GiB (3400 IOPS)
一台是ESSD云盘 PL0 200GiB (4200 IOPS)

以下为RocketMQ作者给出的解释

每个文件初始化的时候,会设置一个filename,不同的文件系统对这个filename的实现是不一样的,如果我猜测没错的话,因为那个ESSD,它为了提高性能,所以在set filename的时候,它底层把那些block全部给预生成出来,这样可以提高写入的性能。但如果是高效云盘,它可能是懒加载的方式,set filename时,它是虚拟的,等到边写的时候边生成,但是这样的话,效率就会比较低。

总结一下就是两种硬件的底层实现方式一个是饿加载,一个是懒加载。这个分析很合理,令人信服。但是出于技术的严谨性,还是需要再验证一下的。

Step 9

刚好强哥有ESSD云盘的阿里云服务器,就麻烦强哥帮忙测试了一下上述的场景,结果翻车了。在这里插入图片描述
只能把最后的希望寄托到文件系统上了,通过mount查看后发现,两台服务器的文件系统都是ext4类型。

解决方式

问题的排查到此为止,先打上一个TODO吧,后续有想法了会继续排查,如果解决了也会更新博客。最后说一下怎么解决这个问题吧。

  1. 生产的RocketMQ是双主模式,所以先使用指令wipeWritePerm停止其中一台broker的写入,静默后找出消息量较小的topic,进行队列的缩容,减少consumeQueue文件的数量。
  2. 重启RocketMQ,释放文件句柄。这里切记不可修改mappedFileSizeConsumeQueue,该配置生效后若发生修改,可能会造成文件的截断,导致消费的异常。
  3. 最后大概释放了20多G的空间出来,算是解决了磁盘空间的问题。但这个神奇的477MB问题,还会继续研究下去。

写在最后

排查问题期间也怀疑过是不是RocketMQ版本的问题,因为部署的是3x版本,GitHub上也找不到该版本的源码了。从介入问题到解决问题大概花了一周的时间吧,真是睁眼MQ闭眼也MQ的。我甚至怀疑,很多人都遇到了这个问题,不过没有修改mappedFileSizeConsumeQueue的默认值,所以文件大小默认也就不到1MB,就算是预占了磁盘空间,也不会有多大的影响。所以跟这个问题也算是蛮有缘分的吧。最后的最后,我觉得mappedFileSizeConsumeQueue的缺省值其实已经过大了, 实际的空载率已经非常高了,consumequeue文件的头部可能都已经是过期的索引了,所以对于消息量不大的应用来说,单个topic的消息量不超过10万条的,我甚至觉得都可以减少mappedFileSizeConsumeQueue的配置值。

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

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

相关文章

kafka的 __consumer_offsets

Zookeeper不适合大批量的频繁写入操作。Kafka 1.0.2将consumer的位移信息保存在Kafka内部的topic中,即__consumer_offsets主题,并且默认提供了kafka_consumer_groups.sh脚本供用户查看consumer信息。 1、创建topic “tp_test_01” [rootnode1 ~]# kafka…

《Linux运维总结:Centos7.6部署二进制mongodb4.4.8三节点副本集群》

一、Mongodb集群模式 1、三种集群介绍 MongoDB有三种集群部署模式,分别为主从复制(Master-Slaver)、副本集(Replica Set)和分片(Sharding)模式。 1、Master-Slaver 是一种主从副本的模式&#x…

自动驾驶之行人轨迹预测数据集

一、 Real Data ETH: Univ. Hotel;750 pedestrians exhibiting complex interactions UCY: Zara01, Zara02 and Uni.780 pedestrians 单应性矩阵,SLAM中的当用多个不同相机拍摄同一个三维平面需要考虑的矩阵,适应场景为平面情况 商场 这个数据集是用双…

Onvif学习

ONVIF onvif(Open Network Video Interface Forum,开放型网络视频接口论坛)协议. onvif协议涵盖了设备发现、设备配置、事件、PTZ控制、视频分析和实时流媒体直播功能,以及搜索,回放和录像录音管理功能。 先去看许振…

git 常用操作

Git 是一个分布式版本控制系统,用于项目开发中的版本控制。从本质上来讲Git是一个内容寻址(content-addressable)文件系统,并在此之上提供了一个版本控制系统的用户界面。 Git的核心部分是一个简单的键值对数据库(key-value data store)。 你可以向该数据…

XML配置文件、用来约束XML文档:DTD、Schema(类型更多)

上一章properties作为配置文件的内容好像还没讲? properties相对于XML的缺点:如果要运行多个方法,只能在properties配置文件里等号后面加逗号(或指定符号)隔开,然后再加值,这样累加下去会导致阅…

基于分布式数据库集群的大数据职位信息统计

目录 任务一: MongoDB 分布式集群关键配置信息截图(启动参数文件、初始化参数文件、启动命令等) ch0的参数文件配置: ​编辑 ch1的参数文件配置: ​编辑chconfig的参数文件配置: router的参数文件配置…

SpringSecurity整合Oauth2.0

SpringSecurity整合Oauth2.0一、概述与原理1.1 、OAuth2.0 是什么?1.2、OAuth2.0中角色解释1.3、OAuth2.0的4中授权模式1.3.1、授权码模式(重点)1.3.1.1 原理1.3.1.2 代码1.3.2、密码模式(重点)1.3.2.1 原理1.3.2.2 代…

开发运维(DevOps)自动化运维与持续交付企业级实战

一、网站部署流程 1、传统网站部署流程 传统的网站部署,大家在运维过程中,网站部署是运维的工作之一,网站部署的流程大致分为: 需求分析—原型设计—开发代码—提交测试—内网部署—确认上线—备份数据—外网更新-最终测试,如果发现外网部署的代码有异常,需要及时回滚…

[附源码]JAVA毕业设计心理健康系统(系统+LW)

[附源码]JAVA毕业设计心理健康系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&…

网络安全观察报告恶意软件观察

攻击类型分析 2018 年,主要的攻击类型 1 为 SYN Flood,UDP Flood,ACK Flood,HTTP Flood,HTTPS Flood, 这五大类攻击占了总攻击次数的 96%,反射类攻击不足 3%。和 2017 年相比&…

使用分页导入的方式把大量数据从mysql导入es

1、首先要有分页功能的代码 如何使用mybatis-plus实现分页,可参考 http://t.csdn.cn/ddnlk 2、要创建feign远程调用模块 可以参考 http://t.csdn.cn/gshFw 3、在feign模块中声明远程调用接口 1.在feign模块中创建一个接口,名字可以是你要调用的服务名&…

指定区域内实现多尺度、多维度2D图形随机填充(如圆、椭圆、多边形)之MATLAB实现

N久之前,咱在公众号中分享了如何用MATLAB实现在指定区域内随机填充圆,并将相关功能封装一个名为randCircle函数里面,其可实现的功能如下: (1) 设定是否允许填充圆相交、相切或独立存在 (2) 指定区域内圆的生成个数 (3) 设定是否允…

[附源码]计算机毕业设计基于vuejs的文创产品销售平台appSpringboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【面试题】说说 Promise是什么?如何使用

大厂面试题分享 面试题库 前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 前言 本文主要介绍和总结Promise的作用、使用方式和其对应的一些方法,供大家参考学习,如有写的不准确的地方欢迎大家指出&a…

Android 使用 jni Demo示例

Android 使用 jni Demo示例简介1. NDK的介绍1.1 NDK 简介1.2 NDK 特点2. JNI介绍2.1 JNI 简介2.2 为什么要有 JNI?3. NDK 与 JNI 的关系NDK下载及环境配置1. 使用Android studio SDK Manager下载2.配置NDK2.1 配置环境变量2.2 Android studio配置NDK示例Demo流程1.版…

RabbitMQ - 安装和使用

RabbitMQ - 安装和使用一. 安装二. RabbitMQ的简单使用2.1 创建交换机2.1.1 交换机类型2.1.2 持久化方式2.2 创建队列2.3 绑定交换机和队列2.4 SpringBoot整合2.5 另外一种监听写法一. 安装 一键安装: docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 …

rtl8221b+mcu,2.5g光纤收发器的开发备份

1、rtl8221b是一款2.5g的光电转换的phy 系统的构建如下 为了省成本,不用mac来对接其中的gmii接口直接接光模块 2、mdio和mdc由mcu的gpio来模拟,在csdn上有很多的文章来参考 mdio的参数如下 不想看英文可以参考下面的文章 MDIO(clause 22 与 clause 4…

Java基础之《netty(10)—Reactor三种模式》

一、单Reactor单线程模式 1、工作原理图 2、方案说明 (1)Select是前面I/O复用模型介绍的标准网络编程API,可以实现应用程序通过一个阻塞对象监听多路连接请求。 (2)Reactor对象通过Select监控客户端请求事件&#xf…

一元钱注册 chatGPT账号

文章目录打开 openai chatgpt 主页注册 chatGPT 账号找境外的电话号码激活账号查看服务价格账号注册充值成功参考视频 打开 openai chatgpt 主页 打开之前首先登录 vpn。但是使用 vpn 有可能还是会被告知 当前国家没有开放服务个人建议: 使用美国的 ip 地址我使用…