
1. 当MongoDB拒绝启动时我们该从哪里入手每次看到屏幕上跳出about to fork child process的报错信息我都仿佛听到MongoDB在说兄弟今天我不想上班。这种报错通常发生在使用--fork参数启动MongoDB时系统告诉你子进程启动失败。作为一个经历过无数次深夜救火的老DBA我想分享下我的排查心得。首先别慌这个错误就像汽车的故障灯它只是告诉你有问题但具体什么问题需要进一步诊断。最直接的方法是先去掉--fork参数让MongoDB在前台运行这样所有错误信息都会直接打印在终端上。就像医生问诊要先看症状一样我们需要先收集完整的错误信息。mongod --config /etc/mongod.conf # 去掉--fork参数启动2. 五大常见问题及其解决方案2.1 配置文件MongoDB的体检报告我见过太多因为配置文件问题导致的启动失败。mongod.conf就像是MongoDB的体检报告任何一个小问题都可能导致启动失败。重点检查这几个关键项storage.dbPath数据目录路径是否正确这个路径是否存在systemLog.path日志文件路径是否可写net.port端口是否被其他程序占用# 检查端口占用情况 netstat -tulnp | grep 27017记得有一次客户把dbPath配置成了/data/mongodb但实际目录是/data/mongodb_data就因为这个斜杠的差别折腾了我们两小时。2.2 锁文件那些占着茅坑不拉屎的文件MongoDB异常退出时经常会留下锁文件不清理就像上完厕所不冲水一样讨厌。这些锁文件会导致MongoDB认为数据目录已经被占用。常见的锁文件包括mongod.lockWiredTiger.lockWiredTiger.turtle# 安全删除锁文件的步骤 sudo service mongod stop # 先确保MongoDB已停止 rm /data/db/mongod.lock rm /data/db/WiredTiger.lock rm /data/db/WiredTiger.turtle重要提示删除锁文件前一定要确保没有其他MongoDB进程在运行否则可能导致数据损坏。2.3 数据文件损坏最让人头疼的问题WiredTiger存储引擎虽然高效但异常关机时数据文件容易损坏。就像突然断电会导致Word文档损坏一样MongoDB的数据文件也会遭遇同样问题。如果日志中出现WT_ERROR: non-specific WiredTiger error这类信息很可能就是数据文件损坏了。这时候你有两个选择删除损坏的文件会丢失部分数据使用--repair参数修复# 修复数据文件 mongod --dbpath /data/db --repair血泪教训修复前一定要备份整个数据目录我曾经遇到过修复过程反而把问题搞得更糟的情况。2.4 权限问题看似简单却最容易忽视MongoDB进程需要对数据目录有读写权限。这就像你回家发现钥匙不对一样尴尬。检查权限分两步# 检查当前权限 ls -ld /data/db # 设置正确权限 chown -R mongodb:mongodb /data/db chmod -R 755 /data/db注意不同Linux发行版的MongoDB用户名可能不同Ubuntu通常是mongodb而CentOS可能是mongod。2.5 日志分析破案的关键线索MongoDB的日志就像飞机的黑匣子记录了所有关键信息。我建议从最后100行开始看tail -n 100 /var/log/mongodb/mongod.log重点关注ERROR和FATAL级别的日志。有一次我在日志里发现Too many open files才意识到是系统文件描述符限制的问题通过修改limits.conf解决了问题。3. 高级排查技巧3.1 使用strace追踪系统调用当常规方法都失效时strace可以帮你看到MongoDB在启动时到底在做什么strace -f mongod --config /etc/mongod.conf这个命令会输出大量信息但你可以搜索fail、error等关键词来缩小范围。3.2 内存不足的隐蔽问题--fork参数需要额外的内存来创建子进程。如果系统内存不足可能会导致fork失败。检查内存情况free -h如果内存确实紧张可以考虑增加swap空间优化MongoDB配置减少内存使用暂时不使用--fork参数3.3 检查SELinux和AppArmor安全模块有时会阻止MongoDB的正常操作。你可以暂时禁用它们来测试# 临时禁用SELinux setenforce 0 # 临时禁用AppArmor systemctl stop apparmor如果问题解决说明需要调整安全策略而不是完全禁用。4. 预防胜于治疗最佳实践经过无数次痛苦的排错经历我总结出以下预防措施定期备份至少每天一次完整备份binlog每小时备份监控系统设置MongoDB进程监控和关键指标告警优雅关机永远使用db.shutdownServer()而不是直接kill进程配置检查每次修改配置文件后先用--config测试日志轮转配置logrotate防止日志文件过大# 测试配置文件是否正确 mongod --config /etc/mongod.conf --fork --syslog记住MongoDB的稳定性往往取决于我们的运维习惯。就像照顾一辆车定期保养比抛锚了再修要省心得多。