Skip to content

MongoDB 告警阈值 ​

基础资源告警 ​

CPU 使用率 ​

指标描述:MongoDB 进程使用的 CPU 百分比

告警阈值建议:

  • 警告:70-80%
  • 严重:80-90%
  • 紧急:> 90%

最佳实践:

  • 根据业务峰值调整阈值
  • 考虑多核 CPU 架构,单核心使用率可能更高
  • 结合其他指标(如慢查询、锁等待)综合判断

监控工具:

  • mongostat:实时查看 CPU 使用率
  • db.serverStatus().processCpuUsage:查看详细 CPU 统计
  • MongoDB Atlas/Ops Manager:配置告警规则

内存使用率 ​

指标描述:MongoDB 进程使用的内存百分比

告警阈值建议:

  • 警告:80-85%
  • 严重:85-90%
  • 紧急:> 90%

最佳实践:

  • 区分物理内存和虚拟内存
  • 监控 WiredTiger 缓存使用率
  • 考虑系统其他进程的内存需求

相关指标:

  • db.serverStatus().mem.resident:物理内存使用
  • db.serverStatus().wiredTiger.cache['bytes currently in the cache']:WiredTiger 缓存使用

磁盘使用率 ​

指标描述:MongoDB 数据所在磁盘分区的使用率

告警阈值建议:

  • 警告:70-75%
  • 严重:75-85%
  • 紧急:> 85%

最佳实践:

  • 监控数据分区和日志分区
  • 考虑数据增长趋势
  • 配置自动扩容或清理策略

监控命令:

javascript
// 查看数据文件大小
db.stats().fileSize

// 查看集合大小
db.collection.stats().size

磁盘 I/O ​

指标描述:磁盘的读写速率和延迟

告警阈值建议:

  • 读写速率警告:接近磁盘最大 IOPS 或吞吐量的 80%
  • 读写延迟警告:> 100ms
  • 读写延迟严重:> 500ms

最佳实践:

  • 根据磁盘类型(HDD/SSD/NVMe)调整阈值
  • 监控读写操作的分布
  • 结合队列长度和等待时间综合判断

连接和并发告警 ​

连接数 ​

指标描述:当前 MongoDB 连接数

告警阈值建议:

  • 警告:达到最大连接数的 70%
  • 严重:达到最大连接数的 85%
  • 紧急:达到最大连接数的 95%

最佳实践:

  • 监控连接增长趋势
  • 检查应用连接池配置
  • 识别连接泄漏

监控命令:

javascript
db.serverStatus().connections

锁等待时间 ​

指标描述:操作等待锁的时间

告警阈值建议:

  • 警告:> 100ms
  • 严重:> 500ms
  • 紧急:> 1s

最佳实践:

  • 区分读锁和写锁等待
  • 监控锁竞争热点
  • 优化慢查询和索引

监控命令:

javascript
db.serverStatus().locks

活跃客户端数 ​

指标描述:当前活跃的客户端数量

告警阈值建议:

  • 警告:根据服务器资源和业务需求调整
  • 严重:持续高活跃客户端数导致性能下降

最佳实践:

  • 监控活跃客户端的操作类型
  • 识别异常客户端
  • 考虑连接池优化

监控命令:

javascript
db.serverStatus().globalLock.activeClients

复制集告警 ​

复制延迟 ​

指标描述:副本节点与主节点的延迟时间

告警阈值建议:

  • 警告:> 30s
  • 严重:> 60s
  • 紧急:> 5min

最佳实践:

  • 根据业务对数据一致性的要求调整
  • 监控网络延迟
  • 检查副本节点性能

监控命令:

javascript
rs.status().members.forEach(member => {
  if (member.stateStr !== "PRIMARY") {
    print(`${member.name}: ${member.replicationLag || 0}ms`);
  }
});

副本集状态 ​

指标描述:副本集成员的状态

告警条件:

  • 节点状态异常(不是 PRIMARY、SECONDARY 或 ARBITER)
  • 节点心跳失败
  • 投票数不足,无法选举主节点

最佳实践:

  • 监控节点状态变化
  • 确保副本集有足够的投票节点
  • 配置自动故障转移

监控命令:

javascript
rs.status()

Oplog 窗口大小 ​

指标描述:Oplog 可以容纳的最大操作时间范围

告警阈值建议:

  • 警告:< 24h
  • 严重:< 12h
  • 紧急:< 1h

最佳实践:

  • 根据数据写入速率调整 Oplog 大小
  • 确保 Oplog 窗口足够大,以应对副本节点故障恢复

监控命令:

javascript
// 查看 Oplog 状态
rs.printReplicationInfo()

查询和索引告警 ​

慢查询数量 ​

指标描述:超过慢查询阈值的查询数量

告警阈值建议:

  • 警告:每分钟 > 5 个慢查询
  • 严重:每分钟 > 20 个慢查询
  • 紧急:每分钟 > 50 个慢查询

最佳实践:

  • 设置合理的慢查询阈值(默认 100ms)
  • 分析慢查询模式
  • 优化索引和查询

配置示例:

yaml
setParameter:
  slowOpThresholdMs: 100

扫描比例 ​

指标描述:全表扫描操作占总查询的比例

告警阈值建议:

  • 警告:> 5%
  • 严重:> 15%
  • 紧急:> 30%

最佳实践:

  • 监控全表扫描操作
  • 为频繁查询的字段创建索引
  • 优化查询条件

索引使用率 ​

指标描述:未使用的索引比例

告警阈值建议:

  • 警告:> 20% 的索引未使用
  • 严重:> 40% 的索引未使用

最佳实践:

  • 定期清理未使用的索引
  • 监控索引使用情况
  • 优化索引设计

监控命令:

javascript
db.collection.aggregate([{ $indexStats: {} }])

分片集群告警 ​

分片平衡状态 ​

指标描述:分片集群的平衡状态

告警条件:

  • 平衡器长时间运行
  • 存在待迁移的块
  • 平衡失败

最佳实践:

  • 监控平衡器状态
  • 检查分片键设计
  • 考虑调整平衡窗口

监控命令:

javascript
sh.getBalancerState()
sh.getBalancerWindow()

块分布不均衡 ​

指标描述:分片间的块分布情况

告警阈值建议:

  • 警告:最大分片的块数是最小分片的 1.5 倍以上
  • 严重:最大分片的块数是最小分片的 2 倍以上

最佳实践:

  • 监控块分布
  • 检查分片键的 cardinality
  • 考虑手动迁移块

监控命令:

javascript
sh.status()

mongos 连接数 ​

指标描述:mongos 进程的连接数

告警阈值建议:

  • 警告:达到最大连接数的 70%
  • 严重:达到最大连接数的 85%

最佳实践:

  • 部署多个 mongos 节点
  • 分散应用连接
  • 监控 mongos 性能

存储引擎告警 ​

WiredTiger 缓存使用率 ​

指标描述:WiredTiger 缓存的使用率

告警阈值建议:

  • 警告:> 80%
  • 严重:> 90%
  • 紧急:> 95%

最佳实践:

  • 监控缓存驱逐率
  • 调整缓存大小配置
  • 优化查询以减少缓存压力

监控命令:

javascript
db.serverStatus().wiredTiger.cache

WiredTiger 事务日志 ​

指标描述:事务日志的写入和同步状态

告警条件:

  • 日志写入延迟高
  • 日志同步失败
  • 日志文件过大

最佳实践:

  • 监控日志写入性能
  • 确保日志文件存储在高速磁盘上
  • 配置合适的日志同步策略

告警策略最佳实践 ​

1. 分层告警 ​

策略描述:根据告警的严重程度和影响范围,分为不同层级

层级划分:

  • 信息:一般通知,不影响业务
  • 警告:潜在问题,需要关注
  • 严重:影响业务,需要立即处理
  • 紧急:业务中断,需要紧急响应

2. 告警抑制 ​

策略描述:避免同一问题产生大量重复告警

实现方法:

  • 设置告警触发时间窗口
  • 合并相似告警
  • 配置告警静默期

3. 告警关联 ​

策略描述:将相关告警关联起来,便于根因分析

关联方式:

  • 按时间关联(同一时间发生的告警)
  • 按资源关联(同一资源的告警)
  • 按业务关联(同一业务的告警)

4. 告警验证 ​

策略描述:验证告警的真实性和准确性

验证方法:

  • 自动验证:通过脚本检查告警条件是否仍然存在
  • 手动验证:通知运维人员确认

5. 告警升级 ​

策略描述:根据告警持续时间和严重程度,自动升级告警级别

升级规则:

  • 警告级告警持续 10 分钟 → 升级为严重
  • 严重级告警持续 30 分钟 → 升级为紧急

告警工具配置 ​

MongoDB Atlas ​

配置步骤:

  1. 登录 MongoDB Atlas
  2. 选择集群,进入 "Alerts" 页面
  3. 点击 "Add New Alert"
  4. 选择告警指标和阈值
  5. 配置通知方式(邮件、短信、Slack等)
  6. 保存告警规则

Ops Manager ​

配置步骤:

  1. 登录 Ops Manager
  2. 进入 "Project Settings" → "Alert Settings"
  3. 点击 "Add Alert Configuration"
  4. 选择告警类型和条件
  5. 配置通知渠道
  6. 保存配置

Prometheus + Alertmanager ​

配置示例:

yaml
# prometheus.yml 配置
scrape_configs:
  - job_name: 'mongodb'
    static_configs:
      - targets: ['mongodb-exporter:9216']

# alertmanager.yml 配置
route:
  receiver: 'email'
  group_by: ['alertname', 'cluster', 'service']

receivers:
  - name: 'email'
    email_configs:
      - to: 'admin@example.com'
        from: 'prometheus@example.com'
        smarthost: 'smtp.example.com:587'

# 告警规则配置
groups:
- name: mongodb.rules
  rules:
  - alert: MongoDBHighCPU
    expr: mongodb_cpu_seconds_total{mode="user"} / mongodb_cpu_seconds_total{mode="system"} > 0.8
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High CPU usage on {{ $labels.instance }}"
      description: "MongoDB instance {{ $labels.instance }} has high CPU usage ({{ $value | printf \"%.2f\" }}% for 5 minutes)"

常见问题(FAQ) ​

Q1: 如何确定合适的告警阈值? ​

A1: 确定告警阈值的方法:

  • 建立性能基线,了解正常运行时的指标范围
  • 根据业务需求和 SLA 调整
  • 参考行业最佳实践
  • 逐步调整,避免误告警

Q2: 如何减少误告警? ​

A2: 减少误告警的方法:

  • 设置合理的告警阈值和时间窗口
  • 配置告警抑制规则
  • 关联相关指标,综合判断
  • 定期优化告警规则

Q3: 告警触发后如何处理? ​

A3: 告警处理流程:

  1. 收到告警,确认告警真实性
  2. 分析告警原因,定位根因
  3. 执行修复操作
  4. 验证修复效果
  5. 记录告警处理过程
  6. 优化告警规则(如果需要)

Q4: 如何监控自定义指标? ​

A4: 监控自定义指标的方法:

  • 使用 MongoDB 的 setParameter 配置自定义指标
  • 开发自定义监控脚本
  • 使用第三方监控工具的扩展功能
  • 将自定义指标暴露给 Prometheus 等监控系统

Q5: 如何实现告警的自动化处理? ​

A5: 实现告警自动化处理的方法:

  • 使用告警触发自动化脚本
  • 配置自愈规则,自动修复常见问题
  • 集成到自动化运维平台
  • 实现故障自动切换