外观
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.cacheWiredTiger 事务日志
指标描述:事务日志的写入和同步状态
告警条件:
- 日志写入延迟高
- 日志同步失败
- 日志文件过大
最佳实践:
- 监控日志写入性能
- 确保日志文件存储在高速磁盘上
- 配置合适的日志同步策略
告警策略最佳实践
1. 分层告警
策略描述:根据告警的严重程度和影响范围,分为不同层级
层级划分:
- 信息:一般通知,不影响业务
- 警告:潜在问题,需要关注
- 严重:影响业务,需要立即处理
- 紧急:业务中断,需要紧急响应
2. 告警抑制
策略描述:避免同一问题产生大量重复告警
实现方法:
- 设置告警触发时间窗口
- 合并相似告警
- 配置告警静默期
3. 告警关联
策略描述:将相关告警关联起来,便于根因分析
关联方式:
- 按时间关联(同一时间发生的告警)
- 按资源关联(同一资源的告警)
- 按业务关联(同一业务的告警)
4. 告警验证
策略描述:验证告警的真实性和准确性
验证方法:
- 自动验证:通过脚本检查告警条件是否仍然存在
- 手动验证:通知运维人员确认
5. 告警升级
策略描述:根据告警持续时间和严重程度,自动升级告警级别
升级规则:
- 警告级告警持续 10 分钟 → 升级为严重
- 严重级告警持续 30 分钟 → 升级为紧急
告警工具配置
MongoDB Atlas
配置步骤:
- 登录 MongoDB Atlas
- 选择集群,进入 "Alerts" 页面
- 点击 "Add New Alert"
- 选择告警指标和阈值
- 配置通知方式(邮件、短信、Slack等)
- 保存告警规则
Ops Manager
配置步骤:
- 登录 Ops Manager
- 进入 "Project Settings" → "Alert Settings"
- 点击 "Add Alert Configuration"
- 选择告警类型和条件
- 配置通知渠道
- 保存配置
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: 告警处理流程:
- 收到告警,确认告警真实性
- 分析告警原因,定位根因
- 执行修复操作
- 验证修复效果
- 记录告警处理过程
- 优化告警规则(如果需要)
Q4: 如何监控自定义指标?
A4: 监控自定义指标的方法:
- 使用 MongoDB 的
setParameter配置自定义指标 - 开发自定义监控脚本
- 使用第三方监控工具的扩展功能
- 将自定义指标暴露给 Prometheus 等监控系统
Q5: 如何实现告警的自动化处理?
A5: 实现告警自动化处理的方法:
- 使用告警触发自动化脚本
- 配置自愈规则,自动修复常见问题
- 集成到自动化运维平台
- 实现故障自动切换
