Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

MongoDB 故障排查

MongoDB 故障排查:连接、性能、复制集、分片、锁、磁盘、OOM 到慢查询等全量排查流程

一、连接问题排查(无法连接、超时、拒绝)

✅ 1. 检查服务是否运行

systemctl status mongod
ps aux | grep mongod

✅ 2. 检查端口监听

netstat -tunlp | grep 27017
ss -lntp | grep 27017

✅ 3. 检查防火墙 & 安全组

firewall-cmd --list-all
iptables -L -n

✅ 4. 检查 bindIp(常见坑)

/etc/mongod.conf:

net:
  bindIp: 0.0.0.0

如果不改,外部永远无法连接。

二、权限问题排查(认证失败、Unauthorized)

✅ 1. 检查用户是否存在

use admin
db.system.users.find().pretty()

✅ 2. 检查角色权限

MongoDB 用户权限基于 数据库 + Role,常见误区是:

你在 app 库创建用户,却想在 admin 登录。

常用权限:

db.grantRolesToUser("root", [ { role: "root", db: "admin" } ])

三、慢查询 / 性能问题排查

🔍 1. 查看慢查询日志

默认日志文件:

/var/log/mongodb/mongod.log

查慢查询:

grep "COLLSCAN" mongod.log
grep "stepdown" mongod.log
grep "command:" mongod.log

🔍 2. 查看是否全表扫描(COLLSCAN)

db.collection.find({}).explain("executionStats")

重点关注:

  • COLLSCAN:无索引
  • nReturned vs totalDocsExamined 差距越大越慢

🔍 3. 查看当前操作

db.currentOp()

🔍 4. 查看锁情况

高锁会导致卡顿。

db.serverStatus().locks

重点关注:

  • globalLock
  • wiredTiger.LSM
  • acquireCount.write

四、磁盘 I/O、WiredTiger 问题排查

🔥 1. 磁盘 100%(常见原因)

  • checkpoint 写入慢
  • journal 写入阻塞
  • 数据文件太大

查看 I/O:

iostat -x 1 10

MongoDB 内部:

db.serverStatus().wiredTiger

关键字段:

  • cache_overflow:内存不够 -> OOM 风险
  • block-manager:I/O 阻塞

🔥 2. WiredTiger Cache 够不够?

默认 Cache = 内存 50%

查看:

db.serverStatus().wiredTiger.cache

关键字段:

  • bytes currently in cache
  • maximum bytes configurable

如果 cache hit ratio < 98% -> 索引不足或缓存太小。

五、内存偏高 / OOM 排查

查看当前使用情况:

free -h
top
ps aux | grep mongod

WiredTiger 正常会吃大量内存,这是 预期行为

真正的 OOM 疑点:

  • OOM-killer 记录 /var/log/messages
  • WiredTiger cache 被打满

解决:

  • 增大内存
  • 适当加索引减少扫描
  • 调整 query,避免 load 全表

六、复制集故障排查(PRIMARY/FATAL/SECONDARY/RECOVERING)

❗ 典型问题 1:Primary 不选举

查看状态:

rs.status()

常见原因:

  • 网络不通
  • 仲裁节点异常
  • oplog 太小导致落后

❗ 典型问题 2:成员状态 RECOVERING

常见原因:

  • Oplog 同步追不上
  • 数据损坏

查看 Oplog:

rs.printReplicationInfo()

关键字段:

  • oplogSizeMB
  • timeDiff(用多久的 oplog)

❗ 典型问题 3:SECONDARY 落后太多

rs.printSlaveReplicationInfo()

如果延迟 > 10 分钟,基本无法追上。

解决:

  • 重建节点(最快)
  • 或增大 oplog

七、分片集群问题排查(Sharding)

查看集群状态:

sh.status()

常见问题:

🟥 问题 1:Chunk imbalance(数据不均衡)

原因:

  • 分片键设计不合理(常见)
  • 单调递增 _id

解决:

  • 使用 hashed shard key
  • 增加 balancer 运行时间

🟥 问题 2:Chunk migration 卡住

原因:

  • 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

恢复方法(常用):

  1. 停止 MongoDB
  2. –repair
  3. 重启
  4. 如果不行 -> 从复制集其他节点同步

九、常见错误码解析

错误码 含义
8000 内部错误
11600 Interrupted query(被 kill 或超时)
50 超时(常见)
100 未找到数据
11000 唯一索引冲突
13435 主节点降级

十、完整故障排查流程

  1. 能否连接?
  2. 日志是否有报错?
  3. 锁情况正常吗?
  4. 是否发生 COLLSCAN?
  5. WiredTiger cache 是否压力过大?
  6. 磁盘 I/O 是否 100%?
  7. 当前操作是否卡住?
  8. 复制集状态是否正常?
  9. 分片是否均衡?
  10. Oplog 是否足够大?