外观
MongoDB 关键监控指标
性能监控指标
CPU指标
CPU使用率:
- 监控所有MongoDB进程的CPU使用率
- 建议阈值:持续超过80%需要关注
- 高CPU可能由复杂查询、索引缺失或锁争用引起
上下文切换:
- 监控系统上下文切换频率
- 高上下文切换可能表示进程间竞争激烈
- 建议阈值:超过10,000次/秒需要关注
内存指标
内存使用率:
- 监控MongoDB进程的内存使用情况
- 包括物理内存和虚拟内存
- 建议阈值:物理内存使用率持续超过90%需要关注
WiredTiger缓存使用率:
- 监控存储引擎缓存使用情况
- 默认缓存大小为系统内存的50%
- 建议阈值:超过80%表示缓存压力大
javascript// 查看缓存使用率
db.serverStatus().wiredTiger.cache["bytes currently in the cache"] / db.serverStatus().wiredTiger.cache["maximum bytes configured"] * 100
- **页面错误率**:
- 监控页面错误(缺页中断)频率
- 高页面错误率表示内存不足
- 建议阈值:超过100次/秒需要关注
### 磁盘I/O指标
- **磁盘使用率**:
- 监控数据目录所在磁盘的使用率
- 建议阈值:超过80%需要关注
- 考虑扩容或清理数据
- **磁盘I/O利用率**:
- 监控磁盘的I/O使用率
- 包括读IOPS和写IOPS
- 建议阈值:持续超过80%需要关注
- **磁盘延迟**:
- 监控磁盘的读写延迟
- 读延迟建议阈值:超过20ms
- 写延迟建议阈值:超过10ms
```javascript
// 查看磁盘I/O状态
db.serverStatus().diskIO数据库操作指标
操作计数
每秒操作数:
- 监控CRUD操作的每秒执行次数
- 包括insert、query、update、delete、getmore、command
- 用于了解数据库负载趋势
javascript// 查看操作计数
db.serverStatus().opcounters
- **慢查询数**:
- 监控每秒慢查询次数
- 慢查询阈值由`slowms`参数控制(默认100ms)
- 高慢查询数可能表示索引缺失或查询优化不足
```javascript
// 查看慢查询数
db.serverStatus().opcounters.command连接指标
当前连接数:
- 监控当前活跃连接数
- 与最大连接数(
maxConns)比较 - 建议阈值:超过最大连接数的80%需要关注
javascript// 查看连接数
db.serverStatus().connections
- **连接拒绝数**:
- 监控被拒绝的连接请求数
- 非零值表示连接数已达上限
- 需要调整`maxConns`参数或优化连接管理
## 复制集监控指标
### 复制延迟
- **复制延迟时间**:
- 监控从节点与主节点的延迟时间
- 建议阈值:超过30秒需要关注
- 高复制延迟可能导致数据不一致
```javascript
// 查看复制延迟
rs.printSecondaryReplicationInfo()** oplog 窗口**:
- 监控oplog可覆盖的时间范围
- 建议阈值:少于24小时需要关注
- 考虑增大oplog大小
javascript// 查看oplog状态 rs.printReplicationInfo()
复制状态
主节点状态:
- 监控主节点是否正常
- 关注选举事件频率
- 频繁选举表示集群不稳定
从节点同步状态:
- 监控从节点的同步状态
- 关注
syncingTo字段 - 确保从节点正常同步
javascript// 查看复制集状态 rs.status()
存储监控指标
数据大小
数据库大小:
- 监控数据库的总大小
- 包括数据和索引
- 关注异常增长趋势
javascript// 查看数据库大小
db.stats()
- **集合大小**:
- 监控关键集合的大小
- 关注异常增长的集合
- 考虑分片或数据清理
```javascript
// 查看集合大小
db.collection.stats()索引使用情况
索引命中率:
- 监控索引的命中率
- 建议阈值:低于90%需要关注
- 考虑优化查询或添加索引
javascript// 查看索引使用情况
db.serverStatus().indexCounters
- **索引扫描与文档扫描比率**:
- 监控索引扫描与文档扫描的比率
- 高文档扫描数表示索引缺失
- 建议阈值:文档扫描数/索引扫描数 < 0.1
```javascript
// 查看扫描统计
db.serverStatus().metrics.query.executor分片集群指标
分片平衡
平衡器状态:
- 监控平衡器是否正常运行
- 关注平衡操作的频率和持续时间
- 频繁平衡可能影响性能
javascript// 查看平衡器状态 sh.getBalancerState()块分布:
- 监控数据块在分片间的分布情况
- 分布不均可能导致负载不均衡
- 考虑调整分片键或手动迁移块
javascript// 查看块分布 sh.status()
分片操作
分片查询数:
- 监控跨分片查询和目标分片查询的比例
- 高跨分片查询比例可能表示分片键设计不合理
分片迁移状态:
- 监控分片迁移的状态
- 关注迁移失败或长时间运行的迁移
监控工具与实践
监控工具
MongoDB Atlas:
- 云端MongoDB的内置监控
- 提供实时监控面板和告警
- 支持自定义监控指标
Ops Manager:
- 企业级MongoDB监控解决方案
- 支持自动化运维
- 提供详细的性能分析
Prometheus + Grafana:
- 开源监控组合
- 支持自定义监控面板
- 灵活的告警配置
mongostat:
- 命令行监控工具
- 实时显示关键指标
- 适合快速诊断
bash# 使用mongostat监控 mongostat --host rs0/host1:27017,host2:27017,host3:27017 --discover
监控最佳实践
建立基线:
- 收集正常状态下的指标数据
- 建立性能基线
- 用于识别异常情况
设置合理阈值:
- 根据业务需求设置告警阈值
- 避免过多误报
- 定期调整阈值
监控关联指标:
- 综合分析多个关联指标
- 避免单一指标误判
- 例如:高CPU使用率+高慢查询数可能表示查询优化问题
定期分析:
- 定期分析监控数据
- 识别趋势变化
- 提前发现潜在问题
告警分级:
- 根据问题严重程度分级告警
- 关键指标设置紧急告警
- 次要指标设置普通告警
常见问题(FAQ)
Q1: 最关键的MongoDB监控指标有哪些?
A1: 最关键的MongoDB监控指标包括:
- CPU使用率和上下文切换
- WiredTiger缓存使用率
- 磁盘I/O延迟和利用率
- 每秒操作数和慢查询数
- 复制延迟和oplog窗口
- 当前连接数和连接拒绝数
- 索引命中率
Q2: 如何监控MongoDB的慢查询?
A2: 监控MongoDB慢查询的方法:
- 启用数据库Profiler,设置合适的慢查询阈值
- 使用
db.currentOp()查看当前运行的慢操作 - 分析MongoDB日志中的慢查询记录
- 使用监控工具(如Atlas、Ops Manager)监控慢查询数
Q3: 复制延迟高怎么办?
A3: 解决复制延迟高的方法:
- 检查网络连接质量
- 确保从节点硬件配置与主节点匹配
- 检查从节点是否有长时间运行的操作
- 增大oplog容量
- 调整写关注级别
- 考虑使用延迟节点进行备份和恢复
Q4: 如何判断MongoDB内存不足?
A4: 判断MongoDB内存不足的迹象:
- 高页面错误率
- WiredTiger缓存使用率持续超过90%
- 频繁的页面淘汰
- 性能下降,特别是查询延迟增加
Q5: 磁盘I/O高是什么原因?
A5: 磁盘I/O高的常见原因:
- 大量写入操作
- 缺少索引导致全表扫描
- 频繁的日志刷新
- 备份操作影响
- 存储系统性能不足
Q6: 如何监控MongoDB分片集群?
A6: 监控MongoDB分片集群的关键点:
- 监控每个分片的性能指标
- 监控mongos路由的性能
- 监控配置服务器的状态
- 关注平衡器的运行状态
- 检查数据块分布情况
- 监控跨分片查询的比例
