温馨提示×

Ubuntu如何解决MongoDB磁盘空间不足问题

小樊
47
2025-10-06 05:24:42
栏目: 云计算

1. 监控磁盘空间使用情况
在解决问题前,需先明确磁盘空间占用状态。使用df -h命令查看Ubuntu系统各分区的磁盘使用情况,定位MongoDB数据目录(默认为/var/lib/mongodb)所在分区;通过mongostatmongotop或MongoDB Compass、Prometheus+Grafana等工具监控数据库的实时存储占用、操作计数器及性能指标,快速识别空间消耗过快的集合或操作。

2. 清理无用数据与日志

  • 删除过期数据:优先移除不再需要的文档或集合(如历史归档数据、测试数据),使用db.dropCollection('collectionName')删除指定集合,db.dropDatabase()删除整个数据库(操作前需备份重要数据)。
  • 清理日志文件:MongoDB的日志文件(如/var/log/mongodb/mongod.log)会持续增长,使用sudo journalctl --vacuum-time=1w清理1周前的系统日志,或手动删除旧日志文件(如sudo rm -rf /var/log/mongodb/*.log),释放日志占用的空间。

3. 碎片整理与空间回收
MongoDB删除数据后,空间不会自动返还给操作系统,需通过以下命令整理碎片:

  • compact命令:对指定集合进行碎片整理,重写数据文件并释放未使用的空间(适用于WiredTiger存储引擎,MMAPv1引擎仅碎片整理不释放空间)。语法:use yourDatabase; db.runCommand({ compact: 'yourCollection' })。注意:执行前需备份数据,且会阻塞该集合的读写操作。
  • repairDatabase命令:修复数据库并回收无效数据占用的空间(适用于MMAPv1引擎,WiredTiger引擎无需使用)。需在mongod实例停止状态下执行(sudo systemctl stop mongod),或在mongo shell中运行db.repairDatabase()
  • secondary节点重同步:对于副本集部署,可通过删除secondary节点的数据目录并重新同步,实现空间回收(不影响primary节点的读写)。步骤:停止secondary节点,删除其dbpath下的所有文件,用rs.remove('secondaryIP:port')将其从副本集移除,再用rs.add('secondaryIP:port')重新加入,等待同步完成。

4. 扩展存储容量

  • 调整LVM逻辑卷:若MongoDB数据目录位于LVM分区(如/dev/mapper/ubuntu--vg-mongodb-lv),可使用lvextend扩展逻辑卷大小,再调整文件系统(如resize2fs)。示例:sudo lvextend -L +100G /dev/mapper/ubuntu--vg-mongodb-lv(增加100G),sudo resize2fs /dev/mapper/ubuntu--vg-mongodb-lv
  • 添加新硬盘:若LVM不可用,可直接添加新硬盘(如/dev/sdb),格式化并挂载到MongoDB数据目录(如/var/lib/mongodb)。步骤:sudo mkfs.ext4 /dev/sdbsudo mkdir /mnt/newdatasudo mount /dev/sdb /mnt/newdata,修改/etc/fstab实现开机自动挂载,最后将MongoDB数据目录迁移至新硬盘。

5. 优化存储配置

  • 启用数据压缩:使用WiredTiger存储引擎(MongoDB 3.2+默认),并配置压缩算法(如Snappy、Zlib),减少数据文件占用的空间。在/etc/mongod.conf中添加:storage: engine: wiredTiger wiredTiger: collectionConfig: blockCompressor: snappy,重启服务生效(sudo systemctl restart mongod)。
  • 设置TTL索引:对有时间限制的数据(如日志、会话),创建TTL索引,自动删除过期文档(如db.logs.createIndex({ "createdAt": 1 }, { expireAfterSeconds: 86400 }),表示数据1天后自动删除)。
  • 优化索引策略:避免创建过多不必要的索引(每个索引都会占用存储空间),使用db.collection.getIndexes()查看现有索引,删除未使用或重复的索引(db.collection.dropIndex('indexName'))。

6. 数据迁移与备份

  • 备份后清理:定期使用mongodump备份数据到外部存储(如NFS、云存储),再删除本地旧数据。示例:mongodump --out /mnt/backup/mongodb-$(date +%F),备份完成后可删除本地部分历史数据。
  • 挂载外部存储:将MongoDB数据目录挂载到外部存储设备(如NFS),修改/etc/mongod.conf中的dbPath指向外部目录(如dbPath: /mnt/nfs/mongodb),重启服务即可将数据存储到外部设备。

0