请问,rocketmq在硬盘空间不足时,是会清理多久前的commitLog? 严重时,会出现磁盘空间用了90%时,清理掉了commitLog的当前时间的15分钟前的消息的情况不?目前有一个业务,分析日志,是当时磁盘不足,且看到确定是推送到rocketmq的消息了,但却没有被消费到。感觉是被清理掉了。
RocketMQ在硬盘空间不足时,会清理commitLog中过期的消息。具体清理的时间周期由broker配置文件中的cleanTimeOfCommitLog参数决定,默认值为168小时(即一周)。
当磁盘空间使用率达到90%时,RocketMQ会触发一次Minor GC(小型垃圾回收),但这并不会导致清理掉commitLog的当前时间的15分钟前的消息。只有在内存不足且磁盘空间使用率达到90%时,RocketMQ才会启动Full GC(完整垃圾回收),这可能会导致清理掉一些旧的消息。
根据你的描述,业务分析日志时发现消息没有被消费到,可能是由于以下原因:
为了解决这个问题,你可以尝试以下方法:
消息是被顺序存储在commitlog文件的,消息的清理是以commitlog文件为单位进行清理的。
commitlog文件的过期时间,默认为72小时,即三天。除手动清理外,在以下情况下也会被自动清理,无论文件中的消息是否被消费过:
由此可以查看您具体是因为什么原因被清理的。
当RocketMQ的磁盘空间不足时,它将优先清理掉最老的已确认消息(已被消费)和最老的未确认消息(未被消费),以释放磁盘空间。在默认设置下,当磁盘使用率超过85%时,RocketMQ将开始自动清除过期和重复的消息(fileReservedTime
参数默认为72小时)。如果在您业务的磁盘使用率达到90%或更高时,RocketMQ将清理最老的未确认消息,而不是时间上最老的消息。
当磁盘空间不足时,RocketMQ将根据diskMaxUsedSpaceRatio
参数设置的阈值清理过时的消息。如果用于存储消息的磁盘大小为700G,但目录store
大小只有2G,那么您可以检查磁盘分区情况。可能是store
目录挂载到了其他磁盘分区上,导致磁盘不足。您可以确认存储消息的磁盘分区情况并添加更多的磁盘空间,以保障RocketMQ的正常运行。
如果存储消息的磁盘空间使用达到了90%,但store
目录的大小仅为2G,这可能是因为store
目录被移动或删除,导致RocketMQ不能正常将消息写入存储目录store
。因此,您需要了解存储消息的具体磁盘分区和目录,以便排查问题。
当磁盘使用率超过90%时,RocketMQ将清理最老的未确认消息来释放空间,而不会删除已经设置了过期时间的消息。只有在设置的过期时间到期后才会被删除。如果您的消息没有超过设置的过期时间,即使磁盘使用率超过90%,它仍然不会被删除。
问题1:当RocketMQ的磁盘空间不足时,会根据Broker的配置,清理掉commitLog中一定时间之前的消息。默认情况下,RocketMQ会清理掉commitLog中一个消息发送到Broker之后的72小时之前的消息。如果磁盘空间使用率已经达到90%,则可能会清理掉当前时间的15分钟前的消息。如果您的业务中有对消息的时效性要求,建议您在发送消息时设置消息的过期时间,以免消息被清理掉。
问题2:RocketMQ在清理commitLog时,会根据Broker的配置清理掉一定时间之前的消息。如果您的store目录大小不到2G,可能是因为Broker在清理commitLog时把过期的消息删除了,或者因为您的业务中的消息没有被消费,所以没有生成新的commitLog。
问题3:store目录不到2G可能是因为RocketMQ在清理commitLog时删除了过期的消息,或者因为您的业务中的消息没有被消费,所以没有生成新的commitLog。如果您的磁盘容量被其他应用占用,RocketMQ的store目录大小也会受到影响。
问题4:如果目前磁盘占用超过90%,但文件没有超过设置的过期时间,RocketMQ仍然可能会清理掉commitLog中一定时间之前的消息。建议您在发送消息时设置消息的过期时间,以避免消息被清理掉。
RocketMQ 在硬盘空间不足时,会根据预设的磁盘使用率阈值、磁盘空间大小和消费情况来触发清理任务。当磁盘空间使用率达到预设阈值时,RocketMQ 会启动清理任务,根据删除规则删除过期的 commitLog 文件。默认情况下,RocketMQ 会保留 72 小时内的消息数据,但也可以通过更改配置文件中的参数来调整具体的过期时间和删除规则。一般情况下,RocketMQ 只会删除存储时间超过指定时间的 commitLog 文件,不会删除当前时间的15分钟前的消息。
当磁盘空间紧张时,RocketMQ 会优先清理过期的 commitLog 文件。如果您在磁盘空间仅剩下70G时,看到 store 目录的大小不到2G,可能是因为已经清理了大量的 commitLog 文件。需要注意的是,RocketMQ 会有自己的内存缓存机制,所以 store 目录大小并不代表消息量或者占用磁盘空间的实际情况。
store 目录不到2G可能是因为 RocketMQ 存储 commitLog 的数据已经被清理干净了,这并不一定说明磁盘容量被其他应用占据。您可以通过系统监控工具查看磁盘使用情况,进一步确认系统的实际存储情况。
如果目前磁盘占用超过90%,但是文件没有超过设置的过期时间,RocketMQ 仍然会执行清理任务,但是不会删除未到过期时间的 commitLog 文件。需要注意的是,当磁盘空间使用率已经达到预设阈值,RocketMQ 可能会因为无法写入新的消息而导致消息丢失。如果您需要保证所有消息的可靠性,建议增加磁盘容量或者定期清理历史数据。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/