You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 今年1月初升级到6.5.3后,仅1个月内磁盘占用从14GB飙升至57GB,用户数量和活动量无变化,MongoDB仅用于RocketChat。
  2. 启用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. 离线修复数据库(终极方案)

如果在线操作无效,可尝试离线重建数据文件(需停机,务必先备份数据):

  1. 停止相关服务:
sudo systemctl stop rocketchat
sudo systemctl stop mongod
  1. 执行数据库修复:
mongod --dbpath /var/lib/mongodb --repair
  1. 重启服务:
sudo systemctl start mongod
sudo systemctl start rocketchat

该操作会彻底整理数据文件,释放所有未使用的磁盘空间,但耗时较长,需根据数据量安排停机时间。

4. 检查RocketChat升级后的存储配置

升级后磁盘飙升可能和存储逻辑变更有关,建议排查:

  • 是否开启了文件版本控制,导致重复存储
  • 是否配置了第三方存储(如对象存储)但本地仍保留副本
  • 检查rocketchat_uploads集合中是否存在重复的文件记录

内容的提问来源于stack exchange,提问作者trogwar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:36:01