外观
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:27017mongorestore
功能:恢复 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.bsonMongoDB Shell 诊断命令
db.serverStatus()
功能:返回 MongoDB 实例的详细状态信息,包括内存使用、连接数、操作统计等。
使用方法:
javascript
// 基本用法
db.serverStatus()
// 查看内存使用情况
db.serverStatus().mem
// 查看连接数
db.serverStatus().connections
// 查看操作统计
db.serverStatus().opcounters
// 查看 WiredTiger 缓存状态
db.serverStatus().wiredTiger.cache
// 查看锁定情况
db.serverStatus().locksdb.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:error1:warning2:info3:verbose4:debug5: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.logMongoDB Atlas 日志管理
功能:MongoDB Atlas 提供了集中化的日志管理和分析功能。
主要特性:
- 实时日志流
- 日志搜索和过滤
- 日志保留策略
- 日志导出
- 基于日志的告警
性能监控工具
MongoDB Atlas 监控
功能:MongoDB Atlas 提供了全面的性能监控功能,包括实时指标、历史趋势和告警。
主要监控指标:
- CPU 使用率
- 内存使用率
- 磁盘 I/O
- 操作延迟
- 连接数
- 复制延迟
- 锁等待时间
Ops Manager 监控
功能:企业级 MongoDB 监控和管理工具,提供更强大的监控和告警功能。
主要特性:
- 自定义监控仪表盘
- 高级告警规则
- 性能顾问
- 自动化备份和恢复
- 集群管理
Prometheus + Grafana
功能:开源监控解决方案,可通过 MongoDB Exporter 监控 MongoDB 实例。
配置步骤:
- 安装 MongoDB Exporter
- 配置 Prometheus 采集数据
- 配置 Grafana 仪表盘
使用示例:
bash
# 启动 MongoDB Exporter
mongod_exporter --mongodb.uri="mongodb://localhost:27017"诊断工具最佳实践
1. 定期监控
- 建立定期监控机制,至少每天查看一次关键指标
- 设置合理的告警阈值,及时发现异常情况
- 保存历史监控数据,用于趋势分析和容量规划
2. 故障排查流程
- 当出现性能问题时,首先查看
mongostat和mongotop实时指标 - 使用
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 --discoverQ2: 如何分析 MongoDB 慢查询?
A2: 可以通过以下步骤分析:
- 确保慢查询日志已开启:
setParameter: { slowOpThresholdMs: 100 } - 查看慢查询日志,找出执行时间长的查询
- 使用
explain()分析查询计划,查看是否使用了索引 - 优化查询或索引设计
Q3: db.serverStatus() 返回的数据如何解读?
A3: 重点关注以下指标:
connections:连接数,特别是current和availableopcounters:操作计数,查看读写比例wiredTiger.cache:缓存使用率,理想情况下应低于 90%locks:锁等待时间,特别是Global锁
Q4: 如何监控 MongoDB 复制集延迟?
A4: 可以使用以下方法:
- 使用
rs.status()查看副本集状态,包括replicationLag字段 - 使用
db.serverStatus().repl查看复制相关指标 - 在 MongoDB Atlas 或 Ops Manager 中设置复制延迟告警
Q5: 诊断工具会影响 MongoDB 性能吗?
A5: 诊断工具本身会产生一定的性能开销,尤其是在高频采样时。建议:
- 生产环境中降低采样频率(如 mongostat 5-10 秒采样一次)
- 避免在峰值时段进行深度诊断
- 合理配置日志级别,避免过度日志记录
