溫馨提示×

Ubuntu如何解決MongoDB磁盤空間不足問題

小樊
43
2025-10-06 05:24:42
欄目: 云計算

1. 監控磁盤空間使用情況
在解決問題前,需先明確磁盤空間占用狀態。使用df -h命令查看Ubuntu系統各分區的磁盤使用情況,定位MongoDB數據目錄(默認為/var/lib/mongodb)所在分區;通過mongostat、mongotop或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/sdb,sudo mkdir /mnt/newdata,sudo 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
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女