开发者社区 > 云原生 > 云消息队列 > 正文

请问,rocketmq在硬盘空间不足时,是会清理多久前的commitLog? 严重时,会出现磁盘空间

请问,rocketmq在硬盘空间不足时,是会清理多久前的commitLog? 严重时,会出现磁盘空间用了90%时,清理掉了commitLog的当前时间的15分钟前的消息的情况不?目前有一个业务,分析日志,是当时磁盘不足,且看到确定是推送到rocketmq的消息了,但却没有被消费到。感觉是被清理掉了。

展开
收起
真的很搞笑 2023-05-16 17:59:42 2227 4
7 条回答
写回答
取消 提交回答
  • RocketMQ在硬盘空间不足时,会清理commitLog中过期的消息。具体清理的时间周期由broker配置文件中的cleanTimeOfCommitLog参数决定,默认值为168小时(即一周)。

    当磁盘空间使用率达到90%时,RocketMQ会触发一次Minor GC(小型垃圾回收),但这并不会导致清理掉commitLog的当前时间的15分钟前的消息。只有在内存不足且磁盘空间使用率达到90%时,RocketMQ才会启动Full GC(完整垃圾回收),这可能会导致清理掉一些旧的消息。

    根据你的描述,业务分析日志时发现消息没有被消费到,可能是由于以下原因:

    1. 消息处理超时:消费者可能由于网络延迟、处理速度等原因未能及时处理消息,导致消息堆积。
    2. 消费失败:消费者在处理消息时发生异常,导致消息无法被消费。
    3. 系统故障:RocketMQ或消费者的其他组件出现故障,导致消息无法正常传递。

    为了解决这个问题,你可以尝试以下方法:

    1. 检查消费者处理消息的速度和正确性,优化消费者逻辑。
    2. 查看RocketMQ的日志,分析是否有异常信息,定位问题原因。
    3. 考虑增加Broker节点,提高系统的可用性和吞吐量。
    2023-09-11 11:54:25
    赞同 展开评论 打赏
  • 问题总能找到解决方案的

    消息是被顺序存储在commitlog文件的,消息的清理是以commitlog文件为单位进行清理的。

    commitlog文件的过期时间,默认为72小时,即三天。除手动清理外,在以下情况下也会被自动清理,无论文件中的消息是否被消费过:

    • 文件过期,且到达清理时间点(默认为凌晨4点)后,自动清理过期文件
    • 文件过期,且磁盘空间占用率已达过期清理警戒线(默认75%)后,无论是否达到清理时间点,都会自动清理过期文件
    • 磁盘占用率达到清理警戒线(默认85%)后,开始按照设定好的规则清理文件,无论是否过期。默认会从最老的文件开始清理
    • 磁盘占用率达到系统危险警戒线(默认90%)后,Broker将拒绝消息写入

    由此可以查看您具体是因为什么原因被清理的。

    2023-07-21 17:41:59
    赞同 展开评论 打赏
  • 基本不会,此回答整理自钉群“群2-Apache RocketMQ 中国开发者钉钉群”

    2023-07-05 11:47:18
    赞同 展开评论 打赏
  • 回答1:基本不会(概率太低) 回答2:72 回答3:对

    2023-06-30 17:08:33
    赞同 展开评论 打赏
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com
    1. 当RocketMQ的磁盘空间不足时,它将优先清理掉最老的已确认消息(已被消费)和最老的未确认消息(未被消费),以释放磁盘空间。在默认设置下,当磁盘使用率超过85%时,RocketMQ将开始自动清除过期和重复的消息(fileReservedTime参数默认为72小时)。如果在您业务的磁盘使用率达到90%或更高时,RocketMQ将清理最老的未确认消息,而不是时间上最老的消息。

    2. 当磁盘空间不足时,RocketMQ将根据diskMaxUsedSpaceRatio参数设置的阈值清理过时的消息。如果用于存储消息的磁盘大小为700G,但目录store大小只有2G,那么您可以检查磁盘分区情况。可能是store 目录挂载到了其他磁盘分区上,导致磁盘不足。您可以确认存储消息的磁盘分区情况并添加更多的磁盘空间,以保障RocketMQ的正常运行。

    3. 如果存储消息的磁盘空间使用达到了90%,但store目录的大小仅为2G,这可能是因为store目录被移动或删除,导致RocketMQ不能正常将消息写入存储目录store。因此,您需要了解存储消息的具体磁盘分区和目录,以便排查问题。

    4. 当磁盘使用率超过90%时,RocketMQ将清理最老的未确认消息来释放空间,而不会删除已经设置了过期时间的消息。只有在设置的过期时间到期后才会被删除。如果您的消息没有超过设置的过期时间,即使磁盘使用率超过90%,它仍然不会被删除。

    2023-05-23 14:27:34
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    问题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中一定时间之前的消息。建议您在发送消息时设置消息的过期时间,以避免消息被清理掉。

    2023-05-22 11:32:49
    赞同 展开评论 打赏
  • RocketMQ 在硬盘空间不足时,会根据预设的磁盘使用率阈值、磁盘空间大小和消费情况来触发清理任务。当磁盘空间使用率达到预设阈值时,RocketMQ 会启动清理任务,根据删除规则删除过期的 commitLog 文件。默认情况下,RocketMQ 会保留 72 小时内的消息数据,但也可以通过更改配置文件中的参数来调整具体的过期时间和删除规则。一般情况下,RocketMQ 只会删除存储时间超过指定时间的 commitLog 文件,不会删除当前时间的15分钟前的消息。

    当磁盘空间紧张时,RocketMQ 会优先清理过期的 commitLog 文件。如果您在磁盘空间仅剩下70G时,看到 store 目录的大小不到2G,可能是因为已经清理了大量的 commitLog 文件。需要注意的是,RocketMQ 会有自己的内存缓存机制,所以 store 目录大小并不代表消息量或者占用磁盘空间的实际情况。

    store 目录不到2G可能是因为 RocketMQ 存储 commitLog 的数据已经被清理干净了,这并不一定说明磁盘容量被其他应用占据。您可以通过系统监控工具查看磁盘使用情况,进一步确认系统的实际存储情况。

    如果目前磁盘占用超过90%,但是文件没有超过设置的过期时间,RocketMQ 仍然会执行清理任务,但是不会删除未到过期时间的 commitLog 文件。需要注意的是,当磁盘空间使用率已经达到预设阈值,RocketMQ 可能会因为无法写入新的消息而导致消息丢失。如果您需要保证所有消息的可靠性,建议增加磁盘容量或者定期清理历史数据。

    2023-05-17 15:15:41
    赞同 展开评论 打赏
滑动查看更多

涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/

相关产品

  • 云消息队列 MQ
  • 热门讨论

    热门文章

    相关电子书

    更多
    RocketMQ Client-GO 介绍 立即下载
    RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载
    基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载