Debian 上 MongoDB 故障排查步骤解析
一 快速定位流程
- 服务状态与启动失败原因
- 执行:sudo systemctl status mongod,查看是否 active、是否反复重启、最近的报错关键字。
- 查看服务日志:sudo journalctl -u mongod -xe,获取 systemd 层面的启动失败线索。
- 日志与配置文件
- 查看 MongoDB 日志:sudo tail -n50 /var/log/mongodb/mongod.log,优先关注异常、断言、权限、路径、端口绑定等关键词。
- 校验配置语法:mongod --config /etc/mongod.conf --eval “quit()”,提前发现配置错误。
- 端口与监听
- 检查端口监听:ss -ltnp | grep 27017 或 netstat -tulnp | grep 27017,确认 mongod 是否在 27017 监听。
- 端口占用排查:如发现占用,处理占用进程或修改 /etc/mongod.conf 的 net.port。
- 网络与防火墙
- 本机连通性:mongo --host 127.0.0.1:27017;远程连通性:mongo --host <服务器IP>:27017。
- 防火墙放行:如使用 ufw 执行 sudo ufw allow 27017;如使用 iptables 检查规则是否放行 27017/tcp。
- 资源与目录权限
- 磁盘空间:df -h,确保 dbPath 所在分区充足。
- 目录与权限:确认 /var/lib/mongodb、/var/log/mongodb 存在且属主为 mongodb:mongodb,必要时执行:
- sudo mkdir -p /var/lib/mongodb /var/log/mongodb
- sudo chown -R mongodb:mongodb /var/lib/mongodb /var/log/mongodb
- 副本集与一致性(如启用)
- 连接 Shell:mongo
- 查看状态:rs.status(),关注 members.stateStr、optime、同步延迟与错误。
二 常见症状与处理要点
- Connection refused
- 可能原因:服务未启动、端口不对、bindIp 未包含客户端 IP、防火墙阻断。
- 处理:启动服务;核对 /etc/mongod.conf 的 net.bindIp 与 net.port;本机与远程分别连通性测试;放行防火墙端口。
- Write concern failed
- 可能原因:副本集多数派不可达、网络分区、节点状态异常。
- 处理:rs.status() 检查 members 状态与 optime 差异;恢复网络与节点;必要时调整写关注或临时降级以恢复可用性。
- No Server Chosen by ReadPreference ServerSelector
- 可能原因:读偏好与拓扑不匹配(如 secondary 不可达)、驱动版本过旧。
- 处理:核对连接字符串的 readPreference;确保目标节点健康;升级驱动至与服务器兼容的版本。
- 启动失败(配置或权限类)
- 可能原因:dbPath/logPath 路径不存在或无权限、配置项错误、端口被占用、旧版 systemd 单元路径残留。
- 处理:校验配置语法;创建缺失目录并修正属主;释放被占用端口;如 systemd 报错涉及 /var/run → /run 的 PID 文件路径变更,按提示修正服务单元并重新加载:sudo systemctl daemon-reexec && sudo systemctl restart mongod。
三 性能与稳定性排查
- 实时监控
- 使用 mongostat 观察插入/查询/更新/删除速率、连接数、页面错误等;使用 mongotop 查看集合级别的读写耗时分布。
- 查询与索引
- 使用 db.collection.find().explain(“executionStats”) 检查是否命中索引、扫描文档数与执行时间;为高频查询路径建立合适的单字段或复合索引,避免全表扫描。
- 慢查询与 Profiling
- 启用数据库分析器:db.setProfilingLevel(1, { slowms: 100 })(示例阈值 100ms),在 db.system.profile 中分析慢操作并优化。
- 资源瓶颈
- 系统层面监控 CPU、内存、磁盘 I/O、网络带宽;磁盘 I/O 高时优先排查索引缺失、大量扫描、写入放大或不合理的批处理;必要时考虑 SSD、调整 WiredTiger 缓存(如 wiredTigerCacheSizeGB)。
四 安全与系统层优化
- 访问控制
- 在 /etc/mongod.conf 中启用 security.authorization: enabled,为应用与运维创建最小权限账户;远程访问务必配合 TLS/SSL 与强认证。
- 内核与虚拟化
- 在 /etc/default/grub 添加 GRUB_CMDLINE_LINUX_DEFAULT=“quiet numa=off transparent_hugepage=never”,执行 sudo update-grub && sudo reboot;或在运行时写入 /sys/kernel/mm/transparent_hugepage/enabled 与 /sys/kernel/mm/transparent_hugepage/defrag 为 never,降低内存管理对数据库延迟的影响。
- 版本与仓库
- 使用受支持的 MongoDB 版本 与官方仓库,定期 apt update && apt upgrade;升级前做好完整备份与变更评估。
五 一键巡检命令清单
- 服务与日志
- sudo systemctl status mongod
- sudo journalctl -u mongod -xe -n100
- sudo tail -n100 /var/log/mongodb/mongod.log
- 配置与连通
- mongod --config /etc/mongod.conf --eval “quit()”
- ss -ltnp | grep 27017
- mongo --host 127.0.0.1:27017
- mongo --host <服务器IP>:27017
- 资源与权限
- df -h
- ls -ld /var/lib/mongodb /var/log/mongodb
- ps aux | grep mongod
- 副本集(如启用)
- mongo --eval “rs.status()”
- 性能观测
- mongostat --host 127.0.0.1:27017 1
- mongotop --host 127.0.0.1:27017 1