MongoDB Linux 故障排查实战手册
一 快速定位流程
- 服务状态与端口连通
- 检查服务:systemctl 状态、启动、启用自启(systemctl status/start/enable mongod),确认不是“disabled/inactive/failed”。
- 端口占用:ss -lntp | grep 27017 或 lsof -i :27017,若出现“Address already in use”,结束占用进程或修改配置端口后重启。
- 日志优先
- 默认日志路径:/var/log/mongodb/mongod.log;实时查看:tail -f /var/log/mongodb/mongod.log。优先关注级别为 E/F 的条目与异常栈。
- 配置与网络
- 配置文件:/etc/mongod.conf;重点核对 net.bindIp(仅本地为 127.0.0.1,需要远程改为 0.0.0.0 并配合鉴权)、net.port(默认 27017)、storage.dbPath、systemLog.path。
- 防火墙/安全组:放行 27017/TCP(如 ufw allow 27017,或 iptables -A INPUT -p tcp --dport 27017 -j ACCEPT)。
- 资源与系统
- 资源告警:free -h、df -h、iostat -x 1、top/htop;MongoDB 倾向占用大量内存做缓存,留意 swap 与 OOM。
- 快速验证
- 本机连接:mongo --host 127.0.0.1 --port 27017;远程连接:mongo --host <公网或内网IP> --port 27017(失败则回到“日志/配置/防火墙”三步复核)。
二 常见故障与修复对照表
| 症状 |
快速检查 |
修复建议 |
| 服务起不来(active: failed) |
systemctl status mongod;查看 /var/log/mongodb/mongod.log |
依据日志修复配置/权限/路径错误;必要时 chown -R mongodb:mongodb <dbPath/logPath>;重启 systemctl restart mongod |
| 端口被占用 |
ss -lntp |
grep 27017 / lsof -i :27017 |
| Connection refused / 超时 |
本机 mongo;远程 telnet 27017 |
核对 bindIp(仅本地 127.0.0.1,远程改为 0.0.0.0 且开启鉴权);检查云安全组/iptables/ufw 放行 27017 |
| 配置错误导致无法启动 |
grep -n “ERROR” /var/log/mongodb/mongod.log |
修正 /etc/mongod.conf 中语法/路径/权限;重启 |
| 权限或目录不存在 |
ls -ld / |
创建目录并赋权:mkdir -p && chown -R mongodb:mongodb |
| 资源瓶颈(CPU/IO/内存) |
top/htop、iostat -x 1、free -h、df -h |
优化慢查询/索引、限流并发、扩容磁盘/内存、分离冷热数据 |
| 文件描述符不足 |
tail -f /var/log/mongodb/mongod.log 出现 “Too many open files” |
提升 ulimit -n;在 /etc/security/limits.conf 为 mongod 设置 soft/hard nofile(如 64000)并重启会话/服务 |
以上对照表覆盖了服务、网络、配置、权限与资源五大类高频问题,建议按“日志→配置→网络→资源”的顺序复核。
三 日志分析与监控
- 日志查看与检索
- 实时跟踪:tail -f /var/log/mongodb/mongod.log;按级别筛选:grep -E ‘E|F’ /var/log/mongodb/mongod.log;按时间窗口检索可用 awk 配合时间戳字段。
- 慢查询与索引
- 在 shell 中提高粒度:db.setLogLevel(1);分析执行计划与扫描方式(COLLSCAN 需加索引);必要时设置慢查询阈值(如 --setParameter slowMS=100)。
- 内置监控工具
- mongostat:观察 insert/query/update/delete、connections、qr/qw、faults 等实时波动,快速判断负载与锁争用。
- mongotop:按库/集合统计读写耗时,定位热点。
- db.serverStatus() / db.stats():获取全局与库级指标(内存、连接、网络、存储引擎状态等)。
- 可视化与第三方
- MongoDB Compass、Ops Manager、Zabbix、Prometheus + Grafana(配合 mongo-exporter)构建仪表盘与告警。
四 数据一致性与恢复
- 存储引擎异常
- 在日志中识别 WiredTiger 错误(如 error: 31802);先评估 db.serverStatus().storageEngine 状态,再按官方流程尝试修复(如 mongod --repair),操作前务必做好全量备份。
- 副本集/心跳异常
- 日志出现 “heartbeat failed to …/REPL” 时,先做网络连通性与时间同步(NTP)核查,再检查副本集成员状态与 oplog 窗口,必要时安排重新同步。
- 日志轮转与保留
- 使用 logrotate 管理 mongod.log(按日轮转、压缩、保留 7 天等),通过 postrotate 发送 SIGUSR1 通知 MongoDB 重新打开日志文件,避免日志撑满磁盘。
五 安全与加固要点
- 最小暴露面
- 默认仅本地监听:net.bindIp 127.0.0.1;确需远程访问时改为 0.0.0.0 并启用鉴权(SCRAM 或 x.509),同时限制来源网段。
- 防火墙与端口
- 仅放通业务所需来源 IP 的 27017/TCP;云环境同步配置安全组规则。
- 最小权限与审计
- 为应用创建最小权限角色;开启审计日志(企业版)或结合应用日志与数据库日志实现全链路追踪。
- 系统加固
- 为 mongod 配置专用系统用户与目录权限;限制文件描述符与核心转储;定期升级补丁与备份验证。