外观
PostgreSQL 告警阈值设置
PostgreSQL 告警阈值设置是数据库监控的重要组成部分,合理的告警阈值可以及时发现数据库异常,减少故障影响范围。告警阈值设置需要根据业务需求、系统配置和性能基线进行调整,避免误报和漏报。
告警阈值设置基本原则
1. 基于基线数据
- 建立性能基线:在系统正常运行时收集至少一周的性能数据,建立基线
- 基于基线调整:告警阈值应基于基线数据设置,通常为基线值的 1.5-2 倍
- 定期更新基线:随着业务增长和系统变化,定期更新性能基线
2. 分级告警
- 警告级:轻微异常,需要关注但不影响业务
- 严重级:中度异常,可能影响业务,需要及时处理
- 紧急级:严重异常,已经影响业务,需要立即处理
3. 避免告警风暴
- 设置告警抑制:避免相关告警同时触发
- 配置告警延迟:设置告警触发的延迟时间,减少瞬时波动导致的误报
- 合理设置采样频率:根据指标特性设置合适的采样频率
常见指标告警阈值建议
1. 系统层面指标
| 指标名称 | 警告级阈值 | 严重级阈值 | 紧急级阈值 | 建议采样频率 |
|---|---|---|---|---|
| CPU 使用率 | 70% | 85% | 95% | 1-5秒 |
| 内存使用率 | 75% | 85% | 95% | 1-5秒 |
| 磁盘使用率 | 70% | 85% | 95% | 5-15分钟 |
| 磁盘 I/O 延迟 | 20ms | 50ms | 100ms | 1-5秒 |
| 网络使用率 | 70% | 85% | 95% | 5-15秒 |
2. 数据库层面指标
| 指标名称 | 警告级阈值 | 严重级阈值 | 紧急级阈值 | 建议采样频率 |
|---|---|---|---|---|
| 连接使用率 | 70% | 85% | 95% | 5-10秒 |
| 事务回滚率 | 5% | 10% | 20% | 10-30秒 |
| 缓存命中率 | 90% | 85% | 80% | 1-5分钟 |
| 慢查询数 | 5个/分钟 | 10个/分钟 | 20个/分钟 | 1-5分钟 |
| 长事务数 | 5个 | 10个 | 20个 | 5-15秒 |
3. WAL 与复制指标
| 指标名称 | 警告级阈值 | 严重级阈值 | 紧急级阈值 | 建议采样频率 |
|---|---|---|---|---|
| WAL 生成速率 | 500MB/小时 | 1GB/小时 | 2GB/小时 | 5-15分钟 |
| 复制延迟 | 30秒 | 60秒 | 120秒 | 1-5秒 |
| WAL 归档失败 | 1次 | 3次 | 5次 | 1-5分钟 |
| 复制槽 WAL 积压 | 5GB | 10GB | 20GB | 5-15分钟 |
告警阈值配置方法
1. Prometheus 告警规则配置
yaml
# 1. CPU 使用率告警规则
ALERT HighCPUUsage
IF (100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 85
FOR 5m
LABELS { severity="warning" }
ANNOTATIONS {
summary = "High CPU usage on {{ $labels.instance }}",
description = "CPU usage is {{ $value }}% for 5 minutes"
}
# 2. 连接数告警规则
ALERT HighConnectionUsage
IF (sum by(instance) (pg_stat_activity_count{datname!~"template.*"}) / pg_settings_max_connections * 100) > 85
FOR 5m
LABELS { severity="warning" }
ANNOTATIONS {
summary = "High connection usage on {{ $labels.instance }}",
description = "Connection usage is {{ $value }}% for 5 minutes"
}
# 3. 复制延迟告警规则
ALERT HighReplicationLag
IF pg_stat_replication_replay_lag_seconds > 60
FOR 5m
LABELS { severity="critical" }
ANNOTATIONS {
summary = "High replication lag on {{ $labels.instance }}",
description = "Replication lag is {{ $value }} seconds for 5 minutes"
}2. Zabbix 告警配置
sql
-- 1. 在 Zabbix 中配置 PostgreSQL 模板
-- 导入官方 PostgreSQL 模板或自定义模板
-- 2. 配置监控项
-- 例如,配置连接数监控项
-- 键值:postgres.connections[<connection_string>,<database>]
-- 3. 配置触发器
-- 例如,连接数告警触发器
-- 表达式:{Template App PostgreSQL:postgres.connections[<connection_string>,<database>].last()} > 80
-- 严重程度:警告
-- 持续时间:5分钟3. 内置告警配置
sql
-- 1. 配置慢查询日志告警
ALTER SYSTEM SET log_min_duration_statement = '1000ms';
ALTER SYSTEM SET log_checkpoints = 'on';
ALTER SYSTEM SET log_connections = 'on';
ALTER SYSTEM SET log_disconnections = 'on';
-- 2. 配置自动真空告警
ALTER SYSTEM SET autovacuum_vacuum_scale_factor = '0.05';
ALTER SYSTEM SET autovacuum_analyze_scale_factor = '0.025';
ALTER SYSTEM SET log_autovacuum_min_duration = '1000ms';告警阈值最佳实践
1. 配置建议
sql
-- 1. 针对不同环境设置不同阈值
-- 生产环境:较为敏感的阈值,及时发现问题
-- 测试环境:较为宽松的阈值,减少误报
-- 2. 结合业务特点设置
-- 高峰期:适当调整阈值,避免误报
-- 低谷期:恢复正常阈值
-- 3. 定期审查和调整
-- 每月审查一次告警阈值
-- 根据业务变化和系统调整及时更新2. 告警管理建议
sql
-- 1. 配置告警通知方式
-- 邮件:适合非紧急告警
-- 短信:适合严重和紧急告警
-- 即时通讯工具(钉钉、Slack):适合所有告警
-- 2. 配置告警接收人
-- 警告级:DBA 团队邮件组
-- 严重级:DBA 团队邮件组 + 值班人员短信
-- 紧急级:DBA 团队所有成员 + 值班经理
-- 3. 配置告警升级机制
-- 警告级:30分钟未处理升级为严重级
-- 严重级:15分钟未处理升级为紧急级
-- 紧急级:5分钟未处理升级为管理层3. 减少误报建议
sql
-- 1. 设置合理的告警延迟
-- 例如,CPU 使用率超过阈值持续 5 分钟才触发告警
-- 2. 配置告警抑制
-- 例如,当主库宕机时,抑制备库的相关告警
-- 3. 优化监控数据采集
-- 调整采样频率,减少瞬时波动导致的误报
-- 使用平滑函数处理监控数据
-- 4. 结合多个指标判断
-- 例如,同时满足 CPU 使用率高和 I/O 延迟高才触发告警常见问题处理
1. 告警误报
问题:频繁收到不必要的告警,导致告警疲劳
解决方法:
- 调整告警阈值,使其更符合实际业务场景
- 增加告警延迟时间,避免瞬时波动导致的误报
- 配置告警抑制规则,避免相关告警同时触发
- 优化监控数据采集,使用平滑函数处理数据
2. 告警漏报
问题:数据库出现问题但未收到告警
解决方法:
- 检查告警规则是否正确配置
- 调整告警阈值,使其更敏感
- 增加监控指标覆盖范围
- 检查告警通知渠道是否正常
3. 告警风暴
问题:短时间内收到大量告警
解决方法:
- 配置告警抑制规则,避免相关告警同时触发
- 增加告警分级,只关注重要告警
- 优化告警规则,减少重复告警
- 检查监控目标,找出问题根源
4. 告警处理不及时
问题:告警触发后未及时处理,导致问题扩大
解决方法:
- 配置多级告警,确保告警能及时送达
- 建立告警响应流程,明确责任人
- 配置告警升级机制,确保问题能得到及时处理
- 定期进行告警演练,提高处理效率
常见问题(FAQ)
Q1:如何确定合适的告警阈值?
A1:确定合适的告警阈值需要:
- 收集系统正常运行时的性能数据,建立基线
- 根据业务需求和 RTO/RPO 目标设置阈值
- 参考行业标准和最佳实践
- 定期调整和优化阈值
Q2:告警阈值设置得越敏感越好吗?
A2:不是。过于敏感的告警阈值会导致大量误报,增加运维人员的负担,甚至导致告警疲劳。告警阈值应根据实际业务需求和系统特性设置,在及时性和准确性之间找到平衡。
Q3:如何处理不同环境的告警阈值?
A3:可以为不同环境设置不同的告警阈值:
- 生产环境:较为敏感的阈值,及时发现问题
- 测试环境:较为宽松的阈值,减少误报
- 开发环境:可以禁用部分告警,只保留关键告警
Q4:如何定期调整告警阈值?
A4:定期调整告警阈值的步骤:
- 收集最近一段时间的性能数据
- 分析性能趋势和业务变化
- 根据分析结果调整阈值
- 测试调整后的效果
- 正式应用新的阈值
Q5:如何结合多个指标设置告警规则?
A5:可以使用逻辑运算符结合多个指标设置告警规则:
- 例如,CPU 使用率 > 85% AND 内存使用率 > 85% 才触发告警
- 或者,磁盘使用率 > 90% OR 磁盘 I/O 延迟 > 100ms 触发告警
- 这样可以减少误报,提高告警的准确性
Q6:如何配置告警通知方式?
A6:可以根据告警级别配置不同的通知方式:
- 警告级:邮件通知
- 严重级:邮件 + 短信通知
- 紧急级:邮件 + 短信 + 即时通讯工具通知
- 这样可以确保不同级别的告警得到合适的关注
Q7:如何避免告警风暴?
A7:避免告警风暴的方法:
- 配置告警抑制规则,避免相关告警同时触发
- 增加告警延迟时间,避免瞬时波动导致的误报
- 优化告警规则,减少重复告警
- 对告警进行分级,只关注重要告警
Q8:如何评估告警阈值的有效性?
A8:评估告警阈值有效性的方法:
- 统计告警的误报率和漏报率
- 分析告警的处理时间和效果
- 定期回顾告警历史,找出可以优化的地方
- 结合业务反馈,调整告警策略
- 这样可以不断优化告警阈值,提高监控系统的 effectiveness
