一次rocketmq进程自动退出排查经验分享(实战篇)(代码片段)

author author     2022-12-12     516

关键词:

1、背景

公司一个 RocketMQ 集群由4主4从组成,突然其中3台服务器“竟然”在同一时间下线,其监控显示如下:

技术图片

依次查看三台机器的监控图形,时间戳几乎完美“吻合”,不可思议吧。

2、故障分析

出现问题,先二话不说,马上重启各服务器,尽快恢复集群,降低对业务的影响,接下来开始对日志进行分析。

Java 进程自动退出(rocketmq 本身就是一个java进程),一种最常见的问题是由于内存溢出或由于内存泄漏导致进程发送Crash等。由于我们的启动参数中未配置

  • -XX:+HeapDumpOnOutOfMemoryError
  • -XX:HeapDumpPath=/opt/jvmdump
    这两个参数,不能直接根据 是否生成 dump 文件,那退而求其次去查看其GC日志,将GC日志下载到本地,然后可以使用一个在线gc日志分析工具:https://gceasy.io/ ,将 gc 日志上传后会给出图形化的展示,其图如下:

技术图片
技术图片

发现垃圾回收很正常。
既然 Java 进程不是由于内存溢出等问题导致的退出,那又会是什么原因呢?那我们来看一下那个点的broker的日志,其关键日志截图如下:

技术图片

发现 broker 日志中有打印出 shutdownHook,表示在进程退出之前执行了启动时注册时的退出钩子函数,说明 broker 是正常停止的,并且也不可能是 kill -9 命令,肯定是显示的执行了 shutodown 或 kill 命令,于是立马使用 history 命令 查看历史命令,都未在指定时间执行过该命令,并且切换到 root 命令后,同样使用 history 命令,并未发现端倪。

但我始终相信,肯定是执行了手动执行了 kill 命令导致进程退出的,经过网上查找查,得知可以通过查阅系统日志/var/log/messages 来查看系统命令的调用,于是乎把日志文件下载到本地,开始搜索 kill 关键字,发现如下日志:

技术图片
发现最近一次 kill 命令是在25号的凌晨1点多,停止 rocketmq 集群,并使用 bin/mqbroker -c conf/broker-b.conf & 进行了重新启动。
这个命令是有问题的,没有使用 nohup ,如果会话失效,该进程就会被退出,为了验证,我们再查一下进程退出时的日志:

技术图片

发现在故障发生点确实有 Removed 相关的日志。
故障原因基本分析到位了,运维在启动的时候没有使用 nohup 来启动,故马上排查刚启动的集群的方式,重新重启刚启动的 Broker。

RocketMQ优雅重启小建议:

  1. 首先将 broker 的写权限关闭,命令如下:
bin/mqadmin updateBrokerConfig -b 192.168.x.x:10911 -n 192.168.x.x:9876 -k brokerPermission -v 4

2.通过 rocketmq-console 查看该broker的写入TPS,当写入TPS降为0后,再使用 kill pid 关闭 rocketmq 进程。温馨提示:将broker的写权限关闭后,非顺序消息不会立马拒绝,而是需要等客户端路由信息更新后,不会在往该broker上发送消息,故这个过程需要等待。

  1. 启动 rocketmq
nohup bin/mqbroker -c conf/broker-a.conf  /dev/null  2>&1 &

4.恢复该节点的写权限

bin/mqadmin updateBrokerConfig -b 192.168.x.x:10911 -n 192.168.x.x:9876 -k brokerPermission -v 6

本文的故障分析与处理就介绍到这里,本文重点讲解了故障的分析过程以及 RocketMQ Broker 优雅停机的方案。其中关于RocketMQ 优雅停机参考了“瓜农老梁” 公众号的文章:RocketMQ集群生产环境节点下线操作--【实战笔记】

如果该文对大家有所帮助的话,麻烦帮忙点个【在看】,谢谢。

作者介绍:
丁威,《RocketMQ技术内幕》作者,RocketMQ 社区布道师,公众号:中间件兴趣圈 维护者,目前已陆续发表源码分析Java集合、Java 并发包(JUC)、Netty、Mycat、Dubbo、RocketMQ、Mybatis等源码专栏。

更多文章请关注中间件公众号:
技术图片
友情推荐一个公众号“瓜农老梁”,该公众号发表的RocketMQ源码系列与实战系列是《RocketMQ技术内幕》很好的补充。
技术图片

数据库实战案例—————记一次tempdb暴增的问题排查

前言  很多时候数据库的TempDB、日志等文件的暴增可能导致磁盘空间被占满,如果日常配置不到位,往往会导致数据库故障,业务被迫中断。  这种文件暴增很难排查,经验不足的一些运维人员可能更是无法排查具体原因,... 查看详情

记一次xmrig挖矿木马排查过程(代码片段)

问题现象Linux服务器收到报警信息,主机CPU跑满。自动创建运行Docker容器xmrig,导致其他运行中容器被迫停止。问题原因通过top命令可以看到有一个xmrig进程占用了99%的CPU。经定位,该进程是一个挖矿木马程序,通过上述截图可以... 查看详情

java内存泄漏问题排查

...根据程序日志发现,程序异常退出是有规律的,每3小时一次,在57分异常退出)内存溢出:程序退出后未生成dump文件,且用jconsole显示内存一直正常。客户计算机是否有异常:查看系统日志、cpu,内存(发生问题 查看详情

分析c++软件异常需要掌握的汇编知识汇总(实战经验分享)(代码片段)

...汇编工具9、总结    在给开发部门的同事们做软件异常排查的技术分享时,我经常说这样一句话,我们在排查软件异常时,不仅要具备扎实的开发语言功底和业务能力,我们还要会使用多个软件工具来辅助问题... 查看详情

攻防视角下,初创企业安全实战经验分享

...监胡金涌,以「攻防视角下,初创企业安全实战经验分享」为题进行分享。胡金涌拥有十年云安全产品研发经验 查看详情

一次解决linux内核内存泄漏实战全过程(代码片段)

什么是内存泄漏:程序向系统申请内存,使用完不需要之后,不释放内存还给系统回收,造成申请的内存被浪费.发现系统中内存使用量随着时间的流逝,消耗的越来越多,例如下图所示:接下来的排查思路... 查看详情

记录一次排查挖矿:快速跟踪一个进程

  记录一次服务器排查挖矿问题,这次突发事件整得整个小组措手不及。总结一下,其实是hadoop集群yarn的一个低版本端口漏洞导致。具体可以参考:https://paper.seebug.org/611/  1.查看服务器CPU飙升卡爆,最后发现是服务器在跑... 查看详情

恶意代码上机排查思路与方法

...应急响应保留现场经验2、特征排查-自写上机排查工具3、进程排查1)数字签名排查2)联网进程排查3)进程注入技术排查4)进程替换技术排查4、文件排查1)进程文件排查2)驱动排查5、启动信息排查6、内存排查1)异地操作2)... 查看详情

rocketmq问题排查命令(代码片段)

修改rocketmq官方代码测试:packagecom.alibaba.middleware.race.rocketmq;importjava.util.Scanner;importcom.alibaba.rocketmq.client.exception.MQClientException;importcom.alibaba.rocketmq.client.producer.DefaultMQP 查看详情

yolo_online将深度学习最火的目标检测做成在线服务实战经验分享

YOLO_Online将深度学习最火的目标检测做成在线服务第一次接触YOLO这个目标检测项目的时候,我就在想,怎么样能够封装一下让普通人也能够体验深度学习最火的目标检测项目,不需要关注技术细节,不需要装很多软件。只需要网... 查看详情

分享一些行业经验,实战案例

准备好套路**①自我介绍:**千万不能筐瓢,一定要牢记,自然流畅地介绍自己的学习经历、工作经历、项目经历、个人优势等等;**②抽象概念:**当面试官问你是如何理解多线程的时候,你要知道从定义... 查看详情

#工程经验分享#内存泄露排查(代码片段)

...下ubuntu下进行程序内存消耗的检测,以及对于内存泄露的排查方法。//获取系统当前可用内存intGetSysMemInfo()intmem_free=-1;//空闲的内存=总内存-使用了的内存intmem_total=-1;//当前系统可用总内存intmem_buffers=-1;//缓存区的内存大小intmem_cac... 查看详情

#工程经验分享#内存泄露排查(代码片段)

...下ubuntu下进行程序内存消耗的检测,以及对于内存泄露的排查方法。//获取系统当前可用内存intGetSysMemInfo()intmem_free=-1;//空闲的内存=总内存-使用了的内存intmem_total=-1;//当前系统可用总内存intmem_buffers=-1;//缓存区的内存大小intmem_cac... 查看详情

精华推荐|深入浅出rocketmq原理及实战「底层原理挖掘系列」透彻剖析贯穿rocketmq的broker服务端自动创建topic的原理分析和问题要点指南

前提背景使用RocketMQ进行发消息时,一般我们是必须要指定topic,此外topic必须要提前建立,但是topic的创建(自动或者手动方式)的设置有一个开关autoCreateTopicEnable,此部分主要会在broker节点的配置文件的时候进行设置,运行环... 查看详情

记一次ffmpeg进程阻塞的问题排查过程(代码片段)

背景在生产环境中,我们使用ffmpeg进行视频转码,将RTSP转HLS或者FLV在web端观看.每一路视频对应一个ffmpeg进程.一直都跑的挺好的.问题最近运维人员发现一个故障点:有一路视频停了,其它都正常.排查检查后发现该路视频的确不正常:... 查看详情

记一次ffmpeg进程阻塞的问题排查过程(代码片段)

背景在生产环境中,我们使用ffmpeg进行视频转码,将RTSP转HLS或者FLV在web端观看.每一路视频对应一个ffmpeg进程.一直都跑的挺好的.问题最近运维人员发现一个故障点:有一路视频停了,其它都正常.排查检查后发现该路视频的确不正常:... 查看详情

公开运维技术分享的一些经验

技术分享三条实战经验:●良好的逻辑性●自己真实经验总结●多练习首先,说明下,我不是技术分享高手,分享了次数比较多,有点心得;另外,听的分享多了,对好坏也有一些感受。还有,在此特别感谢下西山居的运维开发... 查看详情

azure从经典模式迁移至资源管理模式实战经验分享

目录一、前言    2二、三种迁移方式及优缺点    2 三、迁移准备工作    4 (一)支持的ASMIAAS资源    5 (二)支持的迁移范围    5 (三)不支持的功能和... 查看详情