一 ,起因
线上一直正常运行的系统,突然开始报错:
org.apache.rocketmq.client.exception.MQClientException: No route info of this topic: xxx
二,分析
很像是没有建立名为xxx的topic导致的,但是系统一直是正常运行的,topic都是之前建好的,不可能缺少此topic,所以断定不是缺少topic;
登录rocketmq的console后台,发现Topic栏下一个topic都没有了,这就奇怪了,不可能一瞬间所有的topic都被恶意删除了吧;
不管三七二十一,先把topic手动建一下看,显示topic建立成功,但是console界面上还是没有topic, 查看broker的日志,也是显示topic建立成功,没有任何报错,这就奇怪了,但可以肯定的是topic没建立成功或者建立之后又被删除了;
三,处理
把rocketmq所有的log文件、data目录全部中的内容全部删了,并重启rocketmq,再使用mq的测试命令进行测试:
在一个broker上发送数据,如下:
# 1.设置环境变量
export NAMESRV_ADDR=192.168.89.226:9800
# 2.发送消息
sh tools.sh org.apache.rocketmq.example.quickstart.Producer
在另一个broker上消费数据,如下:
# 1.设置环境变量
export NAMESRV_ADDR=192.168.89.226:9800
# 2.接收消息
sh tools.sh org.apache.rocketmq.example.quickstart.Consumer
结果发送时就报错了,报错为:
[PC_SYNCHRONIZED] broker busy, start flow control for a while BROKER:192.168.89.52:19200
网上查了上述错误,说是发送超时,即一条消息写入时间超过1s就会报上面的错,但是是什么导致写入超时呢?
网上给的解决办法是调整这两个参数:
sendMessageThreadPoolNums
useReentrantLockWhenPutMessage
调了之后发现依然报错;
突然灵机一动,broker busy,而且是192.168.89.52:19200这个broker busy,那把这个broker停了试试看,于是把所有broker的配置里面把这个broker去掉了,然后重启mq所有节点,发现不报错了,说明就是192.168.89.52:19200上的broker节点出问题了,但是出了什么问题了?
直到看到一个配置叫 diskMaxUsedSpaceRatio=90
说明磁盘最大使用限度是到90%,然后用df查看了一下,使用了92%了,难怪如此,
由于不知道哪些文件可以删,而且剩余空间还有100G左右,所以就将192.168.89.52:19200的配置从90改为了99,把此节点又加入集群中,希望可以多用一段时间,结果加进去还是报错,说明改成99根本没用,最后还是删了一些大文件才可以了。