- 概述
- CommitLog文件的删除过程
- Consume Queue、Index File文件的删除过程(待完善)
RocketMQ中主要保存了CommitLog、Consume Queue、Index File三种数据文件
由于内存和磁盘都是有限的资源,Broker不可能永久地保存所有数据,所以一些超过保存期限的数据会被定期删除
RocketMQ 通过设置数据过期时间来删除额外的数据文件,具体的实现逻辑是通过org.apache.rocketmq.store.DefaultMessageStore.start()方法启动的周期性执行方法DefaultMessageStore.this.cleanFilesPeriodically()来实现的
CommitLog文件由org.apache.rocketmq.store.DefaultMessageStore.CleanCommitLogService类提供的一个线程服务周期执行删除操作
当满足三个条件时执行删除操作
- 当前时间等于已经配置的删除时间
- 磁盘使用空间超过85%
- 手动执行删除
删除过程如下:
1.克隆全部的 CommitLog 文件。CommitLog 文件可能随时有数据写入,为了不影响正常写入,所以克隆一份来操作
检查每一个CommitLog文件是否过期,如果已过期则立即通过调用destroy()方法进行删除。在删除前会做一系列检查:检查文件被引用的次数、清理映射的所有内存数据对象、释放内存。清理完成后,删除物理文件
为什么会有被挂起的文件呢?
第一次删除有可能失败,比如有线程引用该过期文件,内存映射清理失败等,都可能导致删除失败
如果文件已经关闭,删除前检查没有通过,则可以通过第二次删除来处理
Consume Queue和Index File都是索引文件,在CommitLog文件被删除后,对应的索引文件其实没有存在的意义,并且占用磁盘空间,所以这些文件应该被删除。
RocketMQ的删除策略是定时检查,满足删除条件时会删除过期或者无意义的文件
程序调用CleanConsumeQueueService.deleteExpiredFiles()方法来删除索引文件



