场景
架构:三节点副本集,wt引擎
读写方式:每日凌晨四点导入数据,少量实时数据写入,白天提供查询功能
线上一个collection要进行历史数据删除,document总数为30多亿,数据文件大小为240GB,索引总大小为150GB。要删除的数据为10多亿,删除的方式为remove,也就是说磁盘空间不会释放,同时碎片也会影响查询的性能。
可用的磁盘空间回收方案
1. 关闭secondary节点,删除数据目录,重启secondary节点,触发一次全量同步,这样做能够充分回收磁盘空间,主节点回收时需要降级为secondary节点,缺点是同步期间带宽很大,时间较长。
2. 使用compact功能,对于mmap引擎,此种方式只会回收内存中碎片,不会回收磁盘空间,wt引擎可以回收内存和磁盘碎片空间。并且compact只对当前节点有效,不会传递到其他节点,由于是副本集,完全可以在secondary节点以此执行释放,对于主节点也是采取降级为seconday节点,因此对应用影响很小。
执行过程
secondary节点:
db.runCommand({compact:"collection_name"})
命令执行后当前节点状态为RECOVERING
时间大概50分钟,磁盘空间释放了80G
primary节点:
rs.stepDown(30),确认主节点已经由其他节点接管,主节点状态变为SECONDARY,此时可以执行回收操作
db.runCommand({compact:"collection_name"})