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: 实现告警自动化处理的方法:

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