Ubuntu环境dbpath磁盘满致mongod被杀、Mongo包被删原因及预防方案
问题触发原因
- 进程崩溃的直接原因:日志中标记为
F(致命级)的报错来自MongoDB的FTDC全时诊断采集模块,错误信息明确提示无法向/data/mongodb/diagnostic.data/metrics.interim.temp写入诊断临时缓冲文件,对应错误码39为文件流写入失败,根因就是dbpath所在磁盘分区空间完全耗尽。MongoDB运行过程中需要持续向磁盘写入诊断数据、预写日志、数据落盘文件,一旦磁盘写满,所有磁盘IO操作都会触发进程致命断言,直接终止运行,这是MongoDB避免内存数据和磁盘数据不一致的保护机制。后续日志里的栈采集报错,也是因为磁盘无剩余空间,连临时写入错误栈的空间都不存在,才会批量抛出通用错误,和二进制本身损坏无关。 - 软件包被自动删除的根因:这个现象和MongoDB本身逻辑无关,是Ubuntu桌面版默认的包管理自动机制触发的。Ubuntu桌面版默认开启unattended-upgrades无人值守自动更新,同时默认开启“自动移除无用依赖”的规则:当mongod因磁盘满崩溃时,若刚好赶上系统自动更新任务执行,要么是自动更新尝试升级MongoDB软件包时,因磁盘满导致dpkg安装脚本执行失败,相关包被标记为半安装/损坏状态,后续自动清理逻辑直接将其判定为可清除的异常包;要么是磁盘满导致apt的包状态数据库写入损坏,误将MongoDB所有关联包判定为无依赖的冗余包,触发自动卸载逻辑,把
/usr/bin/mongod、mongosh等所有相关可执行文件全部删除。
预防方案
- 磁盘空间管控:给MongoDB的
dbpath分配独立磁盘分区,不要和系统根分区、其他业务数据分区混用。配置磁盘使用率阈值告警:分区使用率达到70%时触发提醒,80%时启动扩容或无用数据清理流程,严禁分区使用率达到100%。磁盘空间紧张时,可以适当调小FTDC诊断数据的保留大小、配置系统日志和MongoDB运行日志的轮转保留规则,避免无效文件占满空间。 - 系统包管理配置调整:生产环境运行MongoDB时,关闭Ubuntu无人值守更新的第三方源自动升级、自动移除无用依赖功能。编辑
/etc/apt/apt.conf.d/50unattended-upgrades配置文件,将Unattended-Upgrade::Remove-Unused-Dependencies参数设置为false,同时将MongoDB相关软件包加入自动更新黑名单,避免apt自动触发MongoDB的升级、卸载操作。另外要给系统根分区预留至少10%的剩余空间,避免磁盘满导致dpkg/apt状态数据库损坏。 - 运行时防护:给mongod配置systemd服务规则,设置异常退出后的重启冷却逻辑,避免磁盘满时进程无限重启打坏数据文件;配置进程退出告警钩子,mongod异常终止时第一时间触发通知,避免故障扩大。可以给MongoDB核心可执行文件、配置文件加不可修改属性,执行
chattr +i /usr/bin/mongod /usr/bin/mongosh /etc/mongod.conf,即使apt误触发删除操作,也无法直接移除这些核心文件。
内容的提问来源于stack exchange,提问作者Olga
相关产品推荐
相关产品推荐

