平台:阿里云mongoDB云数据库
版本:Mongodb 4.2
数据库集群方案:一主二从三分片
需求:手动释放过剩磁盘空间
从文档解析可知:delete数据或者做分片数据迁移,并不会释放磁盘空间,而是将这些空间标记为reuse可重用状态,后续新写入的数据会重用这部分空间。
需求是手动释放这些空间,使用compact命令,即磁盘碎片整理:
https://www.mongodb.com/docs/v4.2/reference/command/compact/
https://help.aliyun.com/document_detail/96530.html
业务上对某个做了分片的库做compact,操作时间以小时为单位,在生产环境中热执行。而我们使用的4.2版本,在做compact时会阻塞CRUD,所以不能直接在主库上操作。
整个流程是:
(1)对从库(secondary)做compact
(2)对数据库的副本集做主从切换
(3)对新从库做compact
(4) 执行完成再次切换回原主节点
最终完成对整个分片的空间释放。
效果:
从库磁盘占用从80%降为45%,单节点(700G)跑compact花了1小时左右,开始执行瞬间对业务有一个瞬时峰值造成读写等待,这个操作最好在停服维护时进行。