副本集单节点磁盘满时,rs.status()显示SECONDARY但状态为STARTUP2或RECOVERING,是因WiredTiger日志写入失败导致mongod主动降级并停止复制;此时强行rs.remove()会触发initial sync打爆新盘,应先排查假满、碎片、logRotate配置及云盘扩容同步问题,再分步清理与修复。

磁盘满了不等于立刻要删数据或重启服务——副本集里单个节点空间告急,优先保主从同步链路不断、避免触发 initial sync 打爆新盘,再分步清理和扩容。
为什么副本集里一个节点磁盘满,rs.status() 显示 SECONDARY 但状态是 STARTUP2 或 RECOVERING
这是典型的空间不足连锁反应:WiredTiger 写入日志(log.fileSize)或缓存刷盘失败 → journal 写不进磁盘 → mongod 主动降级为 RECOVERING 并停止复制;若此时尝试手动 rs.syncFrom(),可能因无法分配新数据文件直接卡死在 STARTUP2。
- 别急着
rs.remove():强行踢出节点再加回,大概率触发全量同步(initial sync),新盘瞬间被灌满 - 先确认是不是“假满”:用
df -h /var/lib/mongodb看挂载点,再进 shell 执行db.serverStatus().storageEngine.wiredTiger.log,检查fileSize和writeLsn是否停滞增长 - 如果
db.stats().dataSize远小于storageSize(比如差 2 倍以上),说明碎片高,compact可能比扩容更快见效
logRotate: rename 配置了但磁盘没释放?检查 systemd 是否硬编码 --logpath
很多 Ubuntu/CentOS 的 mongod.service 文件里,ExecStart 直接写死了 --logpath /var/log/mongodb/mongod.log,这会完全忽略 /etc/mongod.conf 里的 systemLog 配置,导致 logRotate: rename 形同虚设。
- 运行
ps aux | grep mongod,看输出里有没有--logpath参数 - 如果有,编辑
/lib/systemd/system/mongod.service,删掉--logpath和--logappend,只保留--config /etc/mongod.conf - 改完必须执行:
sudo systemctl daemon-reload && sudo systemctl restart mongod,否则配置不生效 - 验证是否生效:手动触发
db.adminCommand({logRotate: 1}),然后ls -lt /var/log/mongodb/看是否生成带时间戳的旧日志文件
云服务器在线扩容后,df -h 还是旧容量?重点看 LVM 和文件系统类型
阿里云/腾讯云/AWS 扩容云盘后,df -h 不变,90% 是因为分区表或文件系统没同步识别新增容量,不是 MongoDB 的问题。
- 先跑
lsblk:如果看到lvm或vg/lv字样,说明用了 LVM,走pvresize→lvextend→resize2fs或xfs_growfs - 没 LVM 但有
/dev/vda1这类标准分区:用growpart /dev/vda 1扩展分区,再根据lsblk -f查到的文件系统类型选命令:resize2fs /dev/vda1(ext4)或xfs_growfs /mnt/data(xfs,注意这里是挂载点,不是设备名) - 扩容后必须验证两件事:
df -h显示新大小 +sudo tail -20 /var/log/mongodb/mongod.log确认无ENOSPC报错
副本集单节点迁移数据目录,rsync 后启动失败最常见的三个权限坑
把 /var/lib/mongodb 迁到新盘后 systemctl start mongod 报 permission denied,几乎都卡在这三处:
-
storage.dbPath新路径的父目录(比如/data/bigdisk)没给mongodb用户读+执行(rx)权限,导致进不去目录 -
wiredTiger.engineConfig.logPath默认是dbPath下的journal/,如果只改了dbPath没同步改日志路径,mongod 会试图在旧位置建 journal 目录,失败 - SELinux 启用时(CentOS/RHEL 默认开),
rsync -avh不保留上下文,新路径缺少system_u:object_r:mongod_var_lib_t:s0标签,得补sudo semanage fcontext -a -t mongod_var_lib_t "/data/bigdisk/mongodb(/.*)?" && sudo restorecon -Rv /data/bigdisk/mongodb
迁移这事看着简单,但权限、日志路径、SELinux 三者漏一个,mongod 就起不来——尤其是副本集环境,secondary 节点挂了不报错,但主节点压力会悄悄变大。











