背景:
晚11点客户反馈,发送短信收不到了
问题现象:
查看短信服务日志,发现日志提示:
RocketMqMsgSender.java:41 - 发送短信消息到消息队列失败,CODE: 14 DESC: service not available now.
It may be caused by one of the following reasons: the broker's disk is full [CL: 0.91 CQ: 0.91
INDEX: 0.91], messages are put to the slave, message store has been shut down, etc. BROKER:
10.125.115.55:10911
原因:
RocketMQ服务器磁盘空间占用90%RocketMQ删除机制:
过期文件删除
默认凌晨4点扫描删除过期文件。文件日期依次删除开启定时任务每10s扫描是否有文件需要删除
有三种情况会进入删除文件操作:到了deleteWhere指定的时间点(默认是凌晨4点)、磁盘不 足、手动触发
对于磁盘不足的情况,当磁盘使用率大于磁盘空间警戒线水位(默认是90%),会阻止消息写入,
当超过85%时会强制删除文件(需要设置允许强制删除参数,否者不生效),
其他两种情况都只能
删除过期的文件(文件最后更新时间+文件最大的存活时间 < 当前时间) 当被删除的文件存在引用时,会有一个文件删除缓存时间,在这段时间内,
该文件不会被删除,主要是留给引用该文件程序一些时间,当超过了文件删除缓存时间后,每次都会将该文件的引用减少1000,
直到减少小于等于0后才释放该文件引用的相关资源,然后将该文件放入一个“文件删除集 合”中一次连续删除文件中间会存在
一定的间隔,不会连续释放文件相关的资源一次连续删除的文件总和不大于10将“文件删除集合”中的文件从硬盘上删除
解决思路:
客户发现短信收不到,
第一步:由于使用阿里云短信,近期受管控,短信有可能被拦截,上阿里云平台看是否被拦截,发现没有短信发送记录。
第二步:查看短信发送服务,发现报警,报警提示mq的磁盘问题
第三步: 查看mq的磁盘空间,发现某服务日志文件太多。
第四步:由于服务器是客户的,条件不支持做监控系统
第五步:编写清理脚本,定时清理服务日志
参考文档:
https://juejin.cn/post/7467164101137465363
https://cloud.tencent.com.cn/developer/article/2469415?policyId=1003