Skip to content

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

监控最佳实践

  1. 建立基线

    • 收集正常状态下的指标数据
    • 建立性能基线
    • 用于识别异常情况
  2. 设置合理阈值

    • 根据业务需求设置告警阈值
    • 避免过多误报
    • 定期调整阈值
  3. 监控关联指标

    • 综合分析多个关联指标
    • 避免单一指标误判
    • 例如:高CPU使用率+高慢查询数可能表示查询优化问题
  4. 定期分析

    • 定期分析监控数据
    • 识别趋势变化
    • 提前发现潜在问题
  5. 告警分级

    • 根据问题严重程度分级告警
    • 关键指标设置紧急告警
    • 次要指标设置普通告警

常见问题(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路由的性能
  • 监控配置服务器的状态
  • 关注平衡器的运行状态
  • 检查数据块分布情况
  • 监控跨分片查询的比例