MongoDB 在 Debian 上的故障排除技巧
一 快速定位与通用检查
- 查看服务状态与端口:使用 systemctl status mongod 确认是否运行;用 netstat -anp | grep 27017 检查是否监听默认端口 27017。
- 查看日志:MongoDB 日志通常在 /var/log/mongodb/mongod.log,可用 tail -f /var/log/mongodb/mongod.log 实时跟踪,配合 grep 搜索关键字(如 “ERROR”、“connection”、“shutdown”)。
- 核对配置:检查 /etc/mongod.conf 的 net.port、net.bindIp、storage.dbPath、systemLog.destination 等关键项是否与实际路径、端口一致。
- 权限与目录:确保 dbPath 与 log 目录存在且属主为 mongodb(或运行 MongoDB 的用户),避免因权限导致启动失败。
- 资源与磁盘:用 df -h、free -m、iostat -x 1 排查磁盘空间不足与 I/O 瓶颈。
- 版本与仓库:若遇到安装或启动异常,确认使用 MongoDB 官方 APT 仓库 与对应 Debian 版本 的包,避免包不匹配。
二 连接失败排查
- 服务与端口:确认 mongod 已启动并监听 27017;若未启动,执行 systemctl start mongod 并再次检查状态。
- 防火墙与安全组:在 Debian 上检查 iptables 规则,放行 27017/tcp(如:iptables -A INPUT -p tcp --dport 27017 -j ACCEPT),云环境同时检查安全组策略。
- 绑定地址:在 /etc/mongod.conf 的 net.bindIp 中允许应用来源 IP,或临时设为 0.0.0.0(仅测试环境),修改后重启服务。
- 连接串与驱动:核对应用连接串中的 主机名/IP、端口、数据库名、用户名、密码;确保驱动版本与服务器版本兼容。
- 本机连通性:在应用端用 telnet 或 nc 测试到 MongoDB 主机的 27017 端口连通性;必要时抓包或查看系统日志。
- 常见报错速解:
- “Connection refused”:服务未起、端口不对或被防火墙拦截。
- “No Server Chosen by ReadPreference”:检查 ReadPreference 与副本集/分片拓扑是否匹配。
三 启动失败与数据目录异常
- 日志优先:第一时间查看 /var/log/mongodb/mongod.log 中的具体报错行,定位是配置、权限、磁盘还是 WiredTiger 异常。
- 配置与路径:核对 /etc/mongod.conf 中 storage.dbPath、systemLog.path 是否存在且可写;路径变更后需确保目录权限正确。
- 锁文件与异常关机:若异常关机,可能残留 mongod.lock,确认无进程占用后删除锁文件并从备份恢复(谨慎操作)。
- 端口占用:用 netstat -anp | grep 27017 确认 27017 未被其他进程占用;必要时释放端口或修改 net.port。
- 磁盘与内存:检查 磁盘空间不足(df)、内存紧张(free)、I/O 饱和(iostat),这些常导致启动或运行异常。
- 版本与升级:若问题源于已知缺陷,参考官方升级指南,先 备份数据 再执行升级。
四 性能与查询问题定位
- 实时监控:使用 mongostat(吞吐、连接、锁等)与 mongotop(集合级耗时)快速识别热点与瓶颈。
- 慢查询:启用并分析 慢查询日志,配合 db.collection.find().explain(“executionStats”) 检查是否走索引、扫描量与执行阶段。
- 索引策略:为高频查询字段建立 单字段/复合索引,避免全表扫描;用 覆盖索引 减少回表;定期清理冗余或低效索引。
- 配置调优:结合内存与负载,合理设置 storage.wiredTiger.engineConfig.cacheSizeGB;使用 连接池 与 批量操作 降低开销。
- 系统层优化:优先 SSD、充足 内存、合理的 Swap/vm.swappiness,并考虑 副本集/分片 提升可用性与扩展性。
五 副本集与高可用场景
- 状态与健康:用 rs.status() 检查 members 状态、optime、网络与投票情况,确认 PRIMARY/SECONDARY 角色正常。
- 写入关注与一致性:遇到 Write concern failed 时,核对 writeConcern 与副本集多数派条件是否满足,必要时调整 wtimeout。
- 同步与回放:通过 oplog 检查同步延迟与回放位置,定位网络抖动、磁盘慢或节点负载导致的追平缓慢。
- 读偏好:当应用报 “No Server Chosen by ReadPreference” 或读延迟高时,核对 ReadPreference(如 primary/secondaryPreferred)与拓扑匹配。
- 变更流程:变更前 备份,变更中逐步滚动,变更后复核 rs.conf() 与 rs.printSlaveReplicationInfo()。