一次 RocketMQ 进程自动退出排查经验分享(实战篇)

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上发送消息,故这个过程需要等待。
  3. 启动 rocketmq
    nohup bin/mqbroker -c conf/broker-a.conf /dev/null 2>&1 &

    注意:nohup。

  4. 恢复该节点的写权限
    bin/mqadmin updateBrokerConfig -b 192.168.x.x:10911 -n 192.168.x.x:9876 -k brokerPermission -v 6

本文的故障分析与处理就介绍到这里,本文重点讲解了故障的分析过程以及 RocketMQ Broker 优雅停机的方案。

如果本文对您有所帮助的话,麻烦帮忙点个赞,谢谢。


作者介绍:
丁威,《RocketMQ技术内幕》作者,RocketMQ 社区布道师,公众号:中间件兴趣圈 维护者,目前已陆续发表源码分析Java集合、Java 并发包(JUC)、Netty、Mycat、Dubbo、RocketMQ、Mybatis等源码专栏。欢迎加入我的知识星球,构建一个高质量的技术交流社群。

原文地址:https://www.cnblogs.com/dingwpmz/p/12115235.html

时间: 2024-11-07 21:40:44

一次 RocketMQ 进程自动退出排查经验分享(实战篇)的相关文章

Security+认证考试经验分享——备考篇(二)

考点: 预约的地点可以联系预约老师,在VUE官网上也可以查询到所在省份具体考点位置,因为Google地图的原因,所以不能更直接看到地理位置,除非- 因为我是第一次参与这种类型的考试,提前去考场蹲了点,我觉得这很有必要,当天况且不说路况,找不着考点会影响心情.考场我是在一间全封闭小屋子,里面有5台机考,大家都考不同的项目,时间也不一致,所以做自己的,不要受别人影响.监考老师在外面通过摄像头监考,桌上提供画板及马克笔,画板写满可以举手示意更换,耳塞好像得向老师说明才进行发放,建议索要.询问过监考老师

Autocomplete 自动补全(Webform实战篇)

因为项目中需要用到一个自动补全的功能,功能描述: 需求一:新增收件人的时候,自动下拉显示出数据库中所有的收件人信息(显示的信息包括:姓名-收件地址-联系方式) 需求二:选中一个值得时候,分别赋值到对应文本框(收件人输入框中赋值 姓名,联系方式输入框中赋值 手机号,收件地址输入框中赋值 地址) 解决需求一(因本人比较懒,所以直接选用了一个比较方便的插件:Autocomplete [参考学习地址:http://www.runoob.com/jqueryui/jqueryui-use.html]) 步

Security+认证考试经验分享——备考篇(五)

一.了解渠道 刚开始我是对安全方面感兴趣,然后就在网上搜相关的视频教程,就搜索到了安全牛课堂这个平台,刚好看到安全牛课堂在推出security+课程,看到安全牛课堂对security+认证的介绍,也是从那时候了解到有这个认证的. 二.关于security+ Security+ 认证是一种中立第三方认证,其发证机构为美国计算机行业协会CompTIA ,Security+作为国际认证在全球147个国家受到广泛的认可,这也是我参加这个认证看中的一项是和CISSP.CISA等共同包含在内的国际IT业10

docker run java官方镜像默认自动退出的问题解决办法

这几天准备在配置新版本的测试环境,因为之前的也是用docker跑tomcat,但是现在新办法直接砍掉一部分tomcat,直接用java来跑依赖包.这对我们运维来说就蛋疼了,确实是没有用docker直接跑jar包的经验,网上搜了一堆零零碎碎的资料,最后到底还是跑起来了,具体实现还需要完善,今天先写一些下来记录一下,以免再碰到此类问题. 交代一下具体背景情况: 1.jar包在普通环境上的运行脚本已经写好,jar包也已经做好,统一归档到一个目录下面几个分支目录. 2.用的是官方java的alpine-

YS VTM模块存在格式化字符串漏洞,可导致VTM进程异常退出【高危】

YS VTM模块存在格式化字符串漏洞,可导致VTM进程异常退出[高危] 问题描述:          YS VTM模块开放对外监听端口(8554和8664),此次使用sulley fuzzing框架对监听在8664端口的私有二进制协议进行测试,以检测可能发生的各种问题.在该协议中,客户端会向8664端口发送一个二进制+文本格式的报文,对该报文格式的各个字段进行fuzzing,发现当向服务端的VTM进程传入格式化字符串时会崩溃并退出. 测试步骤: 1.  分别在客户机和服务器安装sulley fu

是什么在.NET程序关闭时阻碍进程的退出?

在平时使用软件或是.NET程序开发的过程中,我们有时会遇到程序关闭后但进程却没有退出的情况,这往往预示着代码中有问题存在,不能正确的在程序退出时停止代码执行和销毁资源.这个现象有时并不容易被察觉,但在另一些情况下却会产生影响软件功能的Bug.本文列举可能影响.NET程序进程退出的因素,并用几个小例子说明这些因素如何导致Form Application和Windows Service的Bug. 一.进程不能退出对于某些Windows Form程序的影响 在传统C/S结构的系统中,客户端会通过Soc

运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析

运维经验分享作为一个专题,目前共7篇文章 <运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本> <运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化> <运维经验分享(三)-- 解决Ubuntu下crontab不能正确执行Shell脚本的问题(一)> <运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析> <运维经验分享(五)-- 改进的java进程管

DBImport V3.7版本发布及软件稳定性(自动退出问题)解决过程分享

DBImport V3.7介绍: 1:先上图,再介绍亮点功能: 主要的升级功能为: 1:增加(Truncate Table)清表再插入功能: 清掉再插,可以保证两个库的数据一致,自己很喜欢这个功能. 2:信息栏增加红色部分: 黑色的信息太多,有时候错误信息被淹陌,分拆出来单独红色块标识错误信息,清晰一些. 3:增加保存所有的配置及配置还原: 之前只保存数据库链接的配置,为了第4点,包起了所有的配置,包括表名等. 4:增加自启动参数,用于定时功能的开机启动: 自启动参数为 - true 或 - 1

完美解决windows+ngnix+phpcgi自动退出的问题

[摘要]在windows下搭建nginx+php环境时,php-cgi.exe会经常性的自动关闭退出,本文介绍通过使用xxfpm进程管理器管理php-cgi.exe. php-cgi.exe在windows+nginx平台下经常自动退出,网上搜到的大部分解决方法都是类似上面的批处理(代码如下)文件临时解决一下,但如果用户在网站登录的话,用户就会突然挂掉. @echo off :main set jinchengshuliang=0 set jinchengshuliangxiaxian=2 fo