管理和释放 MongoDB 部署中的磁盘空间

监控 MongoDB 磁盘使用情况,查找过大的集合和索引,并通过 TTL、压缩或恢复工作流安全回收空间。

管理和释放 MongoDB 部署中的磁盘空间

MongoDB 磁盘空间问题通常以两种方式出现:文件系统几乎已满,或者即使删除了数据,MongoDB 看起来仍然很大。第二种情况让许多团队感到惊讶,因为 WiredTiger 可以在内部重用释放的空间,而不会立即将其返回给操作系统。

你的目标是区分真正的增长、可重用的内部空闲空间、过大的索引以及需要维护窗口的碎片化。

在主机级别检查磁盘使用情况

从包含 MongoDB dbPath 的文件系统开始。如果该卷已满,MongoDB 无法安全地继续写入。

df -h /var/lib/mongodb

同时检查哪些目录在增长:

du -sh /var/lib/mongodb/* | sort -h

使用你的实际 dbPath/var/lib/mongodb 在 Linux 软件包中很常见,但并非通用。

检查 MongoDB 存储指标

mongosh 中,比较逻辑数据大小与分配的存储大小。

use myDatabase
db.stats()

有用的字段包括:

  • dataSize:文档数据的逻辑大小。
  • storageSize:为集合数据分配的空间。
  • indexSize:索引使用的空间。

对于特定集合:

db.orders.stats({ scale: 1024 * 1024 })

查看 sizestorageSizetotalIndexSize。如果 storageSize 远大于 size,则集合可能包含来自更新和删除的可重用内部空间。如果 totalIndexSize 很大,则索引可能是减少磁盘使用的最快途径。

MongoDB 磁盘增长的常见原因

高删除和更新频率可能会在 WiredTiger 文件内部留下可重用的空闲空间。MongoDB 通常会为未来的写入重用该空间,但操作系统可能仍显示文件很大。

索引也可能消耗大量磁盘。复合索引、文本索引、通配符索引和重复索引会迅速增加。

保留策略缺口是另一个常见原因。日志、会话、事件和审计集合会无限增长,除非你归档或过期旧文档。

减少未来增长的安全方法

最好的磁盘修复方法通常是防止无限制的增长。

对于基于时间的数据,创建 TTL 索引:

db.logEvents.createIndex(
  { createdAt: 1 },
  { expireAfterSeconds: 86400 }
)

TTL 删除由后台监视器处理,并非精确到秒。它仍然适用于日志、会话和临时事件,其中精确的删除时间并不关键。

在删除任何索引之前,先审查索引:

db.orders.getIndexes()
db.orders.aggregate([{ $indexStats: {} }])

$indexStats 可以显示自进程启动以来索引是否被使用过。将其视为线索,而非证据。一个月度报告索引在安静的一周可能看起来未被使用。

通过名称删除确认未使用的索引:

db.orders.dropIndex('customerId_1_createdAt_-1')

从现有文件中回收空间

删除文档通常不会缩小磁盘上的 WiredTiger 文件。要将空间返回给文件系统,你需要重写或压缩策略。

谨慎使用 compact

compact 可以重写集合和索引数据以减少磁盘使用。它消耗大量资源,并且可能会阻塞受影响集合上的操作,具体取决于你的 MongoDB 版本和部署。

db.runCommand({ compact: 'orders' })

在维护窗口期间运行它,先进行测试,并阅读你确切 MongoDB 版本的文档。在副本集上,许多团队一次压缩一个从节点,让其跟上进度,然后根据需要降级或轮换成员。

针对严重碎片化进行转储和恢复

对于严重碎片化的数据,转储和恢复可以干净地重建集合文件。如果你在原地进行,这会造成中断,因此请计划备份、停机或基于副本的迁移。

mongodump --db myDatabase --collection orders --out /backup/mongo-dump

在验证转储并计划切换后,恢复到目标环境:

mongorestore --db myDatabase --collection orders \
  /backup/mongo-dump/myDatabase/orders.bson

在拥有经过验证的备份和回滚计划之前,不要删除生产数据。

不要做什么

不要手动从文件系统中删除 WiredTiger、日志或集合文件。这可能会损坏数据库。

不要假设 du 和 MongoDB 逻辑大小应该匹配。压缩、索引、内部空闲空间和文件系统行为都会影响这些数字。

谨慎对待关于 MMAPv1 风格预分配的旧建议。现代 MongoDB 部署通常使用 WiredTiger,其存储行为不同。

实用要点

当 MongoDB 磁盘使用看起来异常时,首先测量主机,然后测量数据库、集合和索引。使用 TTL 索引和归档来减缓增长。只删除确认不必要的索引。对于真正的文件系统回收,计划 compact 或转储和恢复工作流,而不是期望删除操作能立即缩小文件。