Skip to content

MongoDB 诊断工具使用

命令行诊断工具

mongostat

功能:实时监控 MongoDB 实例的关键指标,包括操作计数、连接数、锁定情况、内存使用等。

使用方法

bash
# 基本用法
mongostat

# 连接到指定实例
mongostat --host 127.0.0.1:27017

# 使用认证
mongostat -u username -p password --authenticationDatabase admin

# 调整采样间隔(默认1秒)
mongostat --host 127.0.0.1:27017 5

# 只显示指定字段
mongostat --fields insert,query,update,delete,conn,time

关键指标说明

  • insert:每秒插入操作数
  • query:每秒查询操作数
  • update:每秒更新操作数
  • delete:每秒删除操作数
  • getmore:每秒 getMore 操作数(用于游标)
  • command:每秒命令操作数
  • conn:当前连接数
  • set:复制集名称
  • repl:副本集角色(PRI/SEC/ARB)

mongotop

功能:实时监控集合级别的读写延迟,显示每个集合的耗时情况。

使用方法

bash
# 基本用法
mongotop

# 连接到指定实例
mongotop --host 127.0.0.1:27017

# 调整采样间隔
mongotop --host 127.0.0.1:27017 5

# 使用认证
mongotop -u username -p password --authenticationDatabase admin

输出说明

  • ns:命名空间(数据库.集合)
  • total:总耗时
  • read:读操作耗时
  • write:写操作耗时

mongodump

功能:备份 MongoDB 数据。

使用方法

bash
# 备份所有数据库
mongodump

# 备份指定数据库
mongodump --db test

# 备份指定集合
mongodump --db test --collection users

# 备份到指定目录
mongodump --out /backup/2023-12-01

# 连接到远程实例
mongodump --host 192.168.1.100:27017

mongorestore

功能:恢复 MongoDB 数据。

使用方法

bash
# 恢复所有数据库
mongorestore /backup/2023-12-01

# 恢复指定数据库
mongorestore --db test /backup/2023-12-01/test

# 恢复指定集合
mongorestore --db test --collection users /backup/2023-12-01/test/users.bson

MongoDB Shell 诊断命令

db.serverStatus()

功能:返回 MongoDB 实例的详细状态信息,包括内存使用、连接数、操作统计等。

使用方法

javascript
// 基本用法
db.serverStatus()

// 查看内存使用情况
db.serverStatus().mem

// 查看连接数
db.serverStatus().connections

// 查看操作统计
db.serverStatus().opcounters

// 查看 WiredTiger 缓存状态
db.serverStatus().wiredTiger.cache

// 查看锁定情况
db.serverStatus().locks

db.stats()

功能:返回数据库级别的统计信息,包括集合数、文档数、数据大小等。

使用方法

javascript
// 查看当前数据库统计信息
db.stats()

// 查看指定数据库统计信息
use admin
db.getSiblingDB('test').stats()

// 查看详细统计信息(包括索引大小)
db.stats(1024)  // 以 KB 为单位

db.collection.stats()

功能:返回集合级别的统计信息,包括文档数、数据大小、索引大小等。

使用方法

javascript
// 查看集合统计信息
db.users.stats()

// 查看详细统计信息
db.users.stats(1024)  // 以 KB 为单位

db.currentOp()

功能:返回当前正在执行的操作列表,用于排查慢查询和锁竞争。

使用方法

javascript
// 查看所有当前操作
db.currentOp()

// 查看正在运行的操作
db.currentOp({ active: true })

// 查看耗时超过 1 秒的操作
db.currentOp({ "secs_running": { $gt: 1 } })

// 查看写操作
db.currentOp({ "op": { $in: ["insert", "update", "delete"] } })

// 终止指定操作
db.killOp(12345)

db.aggregate() 配合 $indexStats

功能:查看索引使用情况,识别未使用的索引。

使用方法

javascript
// 查看集合索引使用情况
db.users.aggregate([{ $indexStats: {} }])

// 按使用率排序
db.users.aggregate([
  { $indexStats: {} },
  { $sort: { accesses: -1 } }
])

日志分析工具

内置日志解析

功能:MongoDB 日志包含丰富的诊断信息,可用于排查故障和性能问题。

日志级别

  • 0:error
  • 1:warning
  • 2:info
  • 3:verbose
  • 4:debug
  • 5:trace

常见日志模式

bash
# 查看慢查询日志
grep -i "slow query" mongod.log

# 查看连接日志
grep -i "connection accepted" mongod.log

# 查看复制集日志
grep -i "replica set" mongod.log

# 查看索引创建日志
grep -i "index build" mongod.log

MongoDB Atlas 日志管理

功能:MongoDB Atlas 提供了集中化的日志管理和分析功能。

主要特性

  • 实时日志流
  • 日志搜索和过滤
  • 日志保留策略
  • 日志导出
  • 基于日志的告警

性能监控工具

MongoDB Atlas 监控

功能:MongoDB Atlas 提供了全面的性能监控功能,包括实时指标、历史趋势和告警。

主要监控指标

  • CPU 使用率
  • 内存使用率
  • 磁盘 I/O
  • 操作延迟
  • 连接数
  • 复制延迟
  • 锁等待时间

Ops Manager 监控

功能:企业级 MongoDB 监控和管理工具,提供更强大的监控和告警功能。

主要特性

  • 自定义监控仪表盘
  • 高级告警规则
  • 性能顾问
  • 自动化备份和恢复
  • 集群管理

Prometheus + Grafana

功能:开源监控解决方案,可通过 MongoDB Exporter 监控 MongoDB 实例。

配置步骤

  1. 安装 MongoDB Exporter
  2. 配置 Prometheus 采集数据
  3. 配置 Grafana 仪表盘

使用示例

bash
# 启动 MongoDB Exporter
mongod_exporter --mongodb.uri="mongodb://localhost:27017"

诊断工具最佳实践

1. 定期监控

  • 建立定期监控机制,至少每天查看一次关键指标
  • 设置合理的告警阈值,及时发现异常情况
  • 保存历史监控数据,用于趋势分析和容量规划

2. 故障排查流程

  • 当出现性能问题时,首先查看 mongostatmongotop 实时指标
  • 使用 db.currentOp() 查看当前运行的操作,识别慢查询
  • 分析慢查询日志,找出性能瓶颈
  • 使用 db.serverStatus()db.collection.stats() 查看系统和集合状态
  • 检查索引使用情况,优化索引设计

3. 性能基准测试

  • 在系统上线前进行性能基准测试,建立性能基线
  • 定期进行性能测试,比较测试结果,发现性能退化
  • 使用压测工具如 YCSB、MongoDB Benchmark 等进行测试

4. 日志管理

  • 配置合适的日志级别,平衡日志详细程度和性能影响
  • 实现日志轮转,避免日志文件过大
  • 集中管理日志,便于分析和检索
  • 定期清理过期日志,节省存储空间

5. 安全考虑

  • 限制诊断工具的访问权限,仅允许管理员使用
  • 使用加密连接(TLS/SSL)连接 MongoDB 实例
  • 定期更换认证凭证
  • 审计诊断工具的使用情况

常见问题(FAQ)

Q1: 如何使用 mongostat 监控分片集群?

A1: 可以使用 --discover 参数让 mongostat 自动发现分片集群中的所有节点:

bash
mongostat --host mongos-host:27017 --discover

Q2: 如何分析 MongoDB 慢查询?

A2: 可以通过以下步骤分析:

  1. 确保慢查询日志已开启:setParameter: { slowOpThresholdMs: 100 }
  2. 查看慢查询日志,找出执行时间长的查询
  3. 使用 explain() 分析查询计划,查看是否使用了索引
  4. 优化查询或索引设计

Q3: db.serverStatus() 返回的数据如何解读?

A3: 重点关注以下指标:

  • connections:连接数,特别是 currentavailable
  • opcounters:操作计数,查看读写比例
  • wiredTiger.cache:缓存使用率,理想情况下应低于 90%
  • locks:锁等待时间,特别是 Global

Q4: 如何监控 MongoDB 复制集延迟?

A4: 可以使用以下方法:

  1. 使用 rs.status() 查看副本集状态,包括 replicationLag 字段
  2. 使用 db.serverStatus().repl 查看复制相关指标
  3. 在 MongoDB Atlas 或 Ops Manager 中设置复制延迟告警

Q5: 诊断工具会影响 MongoDB 性能吗?

A5: 诊断工具本身会产生一定的性能开销,尤其是在高频采样时。建议:

  • 生产环境中降低采样频率(如 mongostat 5-10 秒采样一次)
  • 避免在峰值时段进行深度诊断
  • 合理配置日志级别,避免过度日志记录