MongoDB 故障排查
MongoDB 故障排查:连接、性能、复制集、分片、锁、磁盘、OOM 到慢查询等全量排查流程
systemctl status mongod
ps aux | grep mongod
netstat -tunlp | grep 27017
ss -lntp | grep 27017
firewall-cmd --list-all
iptables -L -n
/etc/mongod.conf:
net:
bindIp: 0.0.0.0
如果不改,外部永远无法连接。
use admin
db.system.users.find().pretty()
MongoDB 用户权限基于 数据库 + Role,常见误区是:
你在 app 库创建用户,却想在 admin 登录。
常用权限:
db.grantRolesToUser("root", [ { role: "root", db: "admin" } ])
默认日志文件:
/var/log/mongodb/mongod.log
查慢查询:
grep "COLLSCAN" mongod.log
grep "stepdown" mongod.log
grep "command:" mongod.log
db.collection.find({}).explain("executionStats")
重点关注:
- COLLSCAN:无索引
- nReturned vs totalDocsExamined 差距越大越慢
db.currentOp()
高锁会导致卡顿。
db.serverStatus().locks
重点关注:
- globalLock
- wiredTiger.LSM
- acquireCount.write
- checkpoint 写入慢
- journal 写入阻塞
- 数据文件太大
查看 I/O:
iostat -x 1 10
MongoDB 内部:
db.serverStatus().wiredTiger
关键字段:
- cache_overflow:内存不够 -> OOM 风险
- block-manager:I/O 阻塞
默认 Cache = 内存 50%
查看:
db.serverStatus().wiredTiger.cache
关键字段:
- bytes currently in cache
- maximum bytes configurable
如果 cache hit ratio < 98% -> 索引不足或缓存太小。
查看当前使用情况:
free -h
top
ps aux | grep mongod
WiredTiger 正常会吃大量内存,这是 预期行为。
真正的 OOM 疑点:
- OOM-killer 记录 /var/log/messages
- WiredTiger cache 被打满
解决:
- 增大内存
- 适当加索引减少扫描
- 调整 query,避免 load 全表
查看状态:
rs.status()
常见原因:
- 网络不通
- 仲裁节点异常
- oplog 太小导致落后
常见原因:
- Oplog 同步追不上
- 数据损坏
查看 Oplog:
rs.printReplicationInfo()
关键字段:
- oplogSizeMB
- timeDiff(用多久的 oplog)
rs.printSlaveReplicationInfo()
如果延迟 > 10 分钟,基本无法追上。
解决:
- 重建节点(最快)
- 或增大 oplog
查看集群状态:
sh.status()
常见问题:
原因:
- 分片键设计不合理(常见)
- 单调递增 _id
解决:
- 使用 hashed shard key
- 增加 balancer 运行时间
原因:
- Target shard 空间不足
- 网络较慢
- 大文档(> 16MB)
查看迁移日志:
db.adminCommand({ getShardMap: 1 })
查看日志:
grep -i "WT" /var/log/mongodb/mongod.log
grep -i "corrupt" mongod.log
典型报错:
- WiredTiger error -31804
- data file corrupted
恢复方法(常用):
- 停止 MongoDB
- –repair
- 重启
- 如果不行 -> 从复制集其他节点同步
| 错误码 | 含义 |
|---|---|
| 8000 | 内部错误 |
| 11600 | Interrupted query(被 kill 或超时) |
| 50 | 超时(常见) |
| 100 | 未找到数据 |
| 11000 | 唯一索引冲突 |
| 13435 | 主节点降级 |
- 能否连接?
- 日志是否有报错?
- 锁情况正常吗?
- 是否发生 COLLSCAN?
- WiredTiger cache 是否压力过大?
- 磁盘 I/O 是否 100%?
- 当前操作是否卡住?
- 复制集状态是否正常?
- 分片是否均衡?
- Oplog 是否足够大?