RocketChat Retention policy不释放磁盘空间问题求助
RocketChat升级后磁盘占用异常飙升及空间释放问题
环境信息
- 系统:Ubuntu 20.04 LTS
- RocketChat版本:6.5.3(手动安装,2020年起从3.x版本逐步升级)
- 配套环境:NodeJS 14.21.3、MongoDB 5.0.24(WiredTiger存储引擎)
问题现象
- 今年1月初升级到6.5.3后,仅1个月内磁盘占用从14GB飙升至57GB,用户数量和活动量无变化,MongoDB仅用于RocketChat。
- 启用180天保留策略(勾选所有选项,仅希望删除旧上传文件保留聊天历史)后,聊天历史中的上传内容变为空消息,但磁盘空间未释放,重启MongoDB和RocketChat无效。
已执行的排查操作
1. 检查MongoDB集合大小
执行MongoDB命令:
use rocketchat db.getCollectionNames().forEach((cname) => { const csize = db.getCollection(cname).stats(1024 * 1024 * 1024).storageSize; if (csize > 1) print(cname + " = " + csize); });
返回结果:
rocketchat_userDataFiles.chunks = 30.662113189697266 rocketchat_uploads.chunks = 13.659313201904297
2. 检查MongoDB数据文件大小
执行Shell命令:
find /var/lib/mongodb/ -type f -size +1G -exec du -h {} +
返回结果:
31G /var/lib/mongodb/collection-766--3268902447285908541.wt 13G /var/lib/mongodb/collection-14-7180290947299615862.wt 14G /var/lib/mongodb/collection-0-5684180545419248738.wt
3. 尝试执行MongoDB compact命令
执行命令:
use rocketchat db.getCollectionNames().forEach(function (collectionName) { print('Compacting: ' + collectionName); if ('system.views' == collectionName) return; db.runCommand({ compact: collectionName, force: true }); });
执行后无报错,但磁盘空间仍未释放。
解决建议
1. 针对大集合单独执行带空间释放的compact
WiredTiger默认不会主动把空闲空间还给操作系统,需指定freeStorage=true参数(MongoDB 4.2+支持),针对两个占用最大的集合单独处理:
use rocketchat // 处理用户数据文件分片集合 db.runCommand({ compact: "rocketchat_userDataFiles.chunks", force: true, freeStorage: true }) // 处理上传文件分片集合 db.runCommand({ compact: "rocketchat_uploads.chunks", force: true, freeStorage: true }) // 手动触发检查点,确保变更写入磁盘 db.runCommand({ fsync: 1 })
2. 验证保留策略是否真正删除了旧文件记录
先确认180天前的文件记录是否已被删除:
use rocketchat // 计算180天前的时间戳 const cutoff = new Date(Date.now() - 180*24*60*60*1000) // 统计旧文件数量 print("旧上传文件数量:", db.rocketchat_uploads.files.count({uploadedAt: {$lt: cutoff}})) print("旧用户数据文件数量:", db.rocketchat_userDataFiles.files.count({uploadedAt: {$lt: cutoff}}))
如果仍有大量旧记录,手动删除:
// 删除旧上传文件及对应分片 db.rocketchat_uploads.files.deleteMany({uploadedAt: {$lt: cutoff}}) const uploadFileIds = db.rocketchat_uploads.files.find({uploadedAt: {$lt: cutoff}}, {_id:1}).map(doc => doc._id) db.rocketchat_uploads.chunks.deleteMany({files_id: {$in: uploadFileIds}}) // 删除旧用户数据文件及对应分片 db.rocketchat_userDataFiles.files.deleteMany({uploadedAt: {$lt: cutoff}}) const userFileIds = db.rocketchat_userDataFiles.files.find({uploadedAt: {$lt: cutoff}}, {_id:1}).map(doc => doc._id) db.rocketchat_userDataFiles.chunks.deleteMany({files_id: {$in: userFileIds}})
删除完成后再执行步骤1的compact命令。
3. 离线修复数据库(终极方案)
如果在线操作无效,可尝试离线重建数据文件(需停机,务必先备份数据):
- 停止相关服务:
sudo systemctl stop rocketchat sudo systemctl stop mongod
- 执行数据库修复:
mongod --dbpath /var/lib/mongodb --repair
- 重启服务:
sudo systemctl start mongod sudo systemctl start rocketchat
该操作会彻底整理数据文件,释放所有未使用的磁盘空间,但耗时较长,需根据数据量安排停机时间。
4. 检查RocketChat升级后的存储配置
升级后磁盘飙升可能和存储逻辑变更有关,建议排查:
- 是否开启了文件版本控制,导致重复存储
- 是否配置了第三方存储(如对象存储)但本地仍保留副本
- 检查
rocketchat_uploads集合中是否存在重复的文件记录
内容的提问来源于stack exchange,提问作者trogwar
相关产品推荐
相关产品推荐

