外观
PostgreSQL 告警级别分类
核心概念
PostgreSQL 告警级别分类是数据库监控系统的重要组成部分,用于根据告警的严重程度和影响范围对告警进行分级管理。合理的告警级别分类有助于:
- 快速识别和响应严重问题
- 避免告警风暴,减少无效告警
- 明确不同级别告警的响应流程和责任
- 优化资源分配,确保关键问题优先处理
- 建立规范的告警管理体系
告警级别定义
根据告警的严重程度、影响范围和紧急程度,PostgreSQL 告警通常分为以下几个级别:
1. 紧急告警(Critical)
严重程度:最高 影响范围:数据库服务完全不可用或数据面临丢失风险 响应时间要求:立即响应(15分钟内)
典型场景:
- 数据库实例崩溃
- 主从复制完全中断
- 磁盘空间100%已满
- 数据库连接数达到100%
- WAL日志完全满,无法写入
- 数据文件损坏
- 超级用户密码泄露
示例告警规则:
yaml
# Prometheus告警规则示例
- alert: PostgresqlInstanceDown
expr: pg_up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "PostgreSQL实例 {{ $labels.instance }} 已宕机"
description: "PostgreSQL实例 {{ $labels.instance }} 已宕机超过1分钟"
- alert: PostgresqlDiskFull
expr: (pg_database_size(current_database()) / pg_settings_max_wal_size_bytes) > 0.95
for: 5m
labels:
severity: critical
annotations:
summary: "PostgreSQL {{ $labels.instance }} 磁盘空间即将满"
description: "PostgreSQL {{ $labels.instance }} 磁盘空间使用率已超过95%"2. 严重告警(Major)
严重程度:高 影响范围:核心业务功能受影响,或存在潜在的服务中断风险 响应时间要求:30分钟内响应
典型场景:
- 从库复制延迟超过30分钟
- 磁盘空间使用率超过90%
- 数据库连接数超过90%
- 持续5分钟以上的高CPU使用率(>90%)
- 持续5分钟以上的高内存使用率(>90%)
- 死锁持续存在超过5分钟
- WAL日志生成速率异常高
- 自动备份失败
示例告警规则:
yaml
# Prometheus告警规则示例
- alert: PostgresqlReplicationLag
expr: pg_replication_lag > 1800
for: 5m
labels:
severity: major
annotations:
summary: "PostgreSQL {{ $labels.instance }} 复制延迟过高"
description: "PostgreSQL {{ $labels.instance }} 复制延迟已超过30分钟"
- alert: PostgresqlHighConnectionCount
expr: pg_stat_activity_count / pg_settings_max_connections > 0.9
for: 5m
labels:
severity: major
annotations:
summary: "PostgreSQL {{ $labels.instance }} 连接数过高"
description: "PostgreSQL {{ $labels.instance }} 连接数使用率已超过90%"3. 警告告警(Warning)
严重程度:中 影响范围:非核心业务功能受影响,或存在潜在的性能问题 响应时间要求:2小时内响应
典型场景:
- 从库复制延迟超过5分钟
- 磁盘空间使用率超过80%
- 数据库连接数超过80%
- 持续5分钟以上的中等CPU使用率(>70%)
- 持续5分钟以上的中等内存使用率(>70%)
- 慢查询数量突然增加
- 自动真空作业运行时间过长
- 索引膨胀率超过50%
示例告警规则:
yaml
# Prometheus告警规则示例
- alert: PostgresqlDiskSpaceWarning
expr: (pg_database_size(current_database()) / pg_settings_max_wal_size_bytes) > 0.8
for: 10m
labels:
severity: warning
annotations:
summary: "PostgreSQL {{ $labels.instance }} 磁盘空间警告"
description: "PostgreSQL {{ $labels.instance }} 磁盘空间使用率已超过80%"
- alert: PostgresqlSlowQueries
expr: increase(pg_stat_statements_total_time[5m]) / increase(pg_stat_statements_calls[5m]) > 1000
for: 5m
labels:
severity: warning
annotations:
summary: "PostgreSQL {{ $labels.instance }} 慢查询数量增加"
description: "PostgreSQL {{ $labels.instance }} 慢查询平均执行时间超过1秒"4. 信息告警(Info)
严重程度:低 影响范围:仅提供信息,不影响业务功能 响应时间要求:24小时内响应或定期处理
典型场景:
- 数据库版本更新
- 配置参数变更
- 新增用户或角色
- 表或索引创建/删除
- 定期维护作业完成
- 备份完成通知
- 监控系统状态变更
示例告警规则:
yaml
# Prometheus告警规则示例
- alert: PostgresqlBackupCompleted
expr: pg_backup_status == 1
for: 1m
labels:
severity: info
annotations:
summary: "PostgreSQL {{ $labels.instance }} 备份完成"
description: "PostgreSQL {{ $labels.instance }} 备份已成功完成"
- alert: PostgresqlConfigurationChanged
expr: pg_config_last_reload_time < time() - 3600
for: 5m
labels:
severity: info
annotations:
summary: "PostgreSQL {{ $labels.instance }} 配置已变更"
description: "PostgreSQL {{ $labels.instance }} 配置在1小时前已变更"告警级别配置最佳实践
1. 告警级别设置原则
- 基于影响范围:根据告警对业务的影响范围确定级别
- 基于紧急程度:根据问题的紧急程度确定级别
- 基于恢复难度:根据问题的恢复难度确定级别
- 基于数据风险:根据数据丢失或损坏的风险确定级别
- 基于频率调整:根据告警的发生频率调整级别,避免告警疲劳
2. 告警级别配置方法
Prometheus告警规则配置:
yaml
# 告警级别配置示例
groups:
- name: postgresql-alerts
rules:
# 紧急告警
- alert: PostgresqlInstanceDown
expr: pg_up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "PostgreSQL实例 {{ $labels.instance }} 已宕机"
description: "PostgreSQL实例 {{ $labels.instance }} 已宕机超过1分钟"
# 严重告警
- alert: PostgresqlReplicationLag
expr: pg_replication_lag > 1800
for: 5m
labels:
severity: major
annotations:
summary: "PostgreSQL {{ $labels.instance }} 复制延迟过高"
description: "PostgreSQL {{ $labels.instance }} 复制延迟已超过30分钟"
# 警告告警
- alert: PostgresqlDiskSpaceWarning
expr: (pg_database_size(current_database()) / pg_settings_max_wal_size_bytes) > 0.8
for: 10m
labels:
severity: warning
annotations:
summary: "PostgreSQL {{ $labels.instance }} 磁盘空间警告"
description: "PostgreSQL {{ $labels.instance }} 磁盘空间使用率已超过80%"
# 信息告警
- alert: PostgresqlBackupCompleted
expr: pg_backup_status == 1
for: 1m
labels:
severity: info
annotations:
summary: "PostgreSQL {{ $labels.instance }} 备份完成"
description: "PostgreSQL {{ $labels.instance }} 备份已成功完成"Zabbix告警级别配置:
xml
<!-- Zabbix告警动作配置示例 -->
<action>
<name>PostgreSQL告警通知</name>
<eventsource>0</eventsource>
<status>0</status>
<esc_period>3600</esc_period>
<def_shortdata>{TRIGGER.STATUS}: {TRIGGER.NAME}</def_shortdata>
<def_longdata>{HOST.NAME}:{HOST.IP} ({TRIGGER.STATUS}: {TRIGGER.NAME})
触发器信息:
{TRIGGER.DESCRIPTION}
告警级别:{TRIGGER.SEVERITY}
问题详情:
{ITEM.NAME1} ({HOST.NAME1}:{HOST.IP1}): {ITEM.VALUE1}
{ITEM.NAME2} ({HOST.NAME2}:{HOST.IP2}): {ITEM.VALUE2}
{ITEM.NAME3} ({HOST.NAME3}:{HOST.IP3}): {ITEM.VALUE3}
事件ID: {EVENT.ID}</def_longdata>
<recovery_msg>1</recovery_msg>
<recovery_mode>0</recovery_mode>
<recovery_def_shortdata>恢复: {TRIGGER.NAME}</recovery_def_shortdata>
<recovery_def_longdata>{HOST.NAME}:{HOST.IP} (恢复: {TRIGGER.NAME})
触发器信息:
{TRIGGER.DESCRIPTION}
告警级别:{TRIGGER.SEVERITY}
恢复详情:
{ITEM.NAME1} ({HOST.NAME1}:{HOST.IP1}): {ITEM.VALUE1}
{ITEM.NAME2} ({HOST.NAME2}:{HOST.IP2}): {ITEM.VALUE2}
{ITEM.NAME3} ({HOST.NAME3}:{HOST.IP3}): {ITEM.VALUE3}
事件ID: {EVENT.ID}</recovery_def_longdata>
<correlation_mode>0</correlation_mode>
<correlation_tag>postgresql</correlation_tag>
<evaltype>0</evaltype>
<conditions>
<condition>
<conditiontype>1</conditiontype>
<operator>0</operator>
<value>PostgreSQL</value>
<formulaid>A</formulaid>
</condition>
</conditions>
<operations>
<!-- 紧急告警:发送短信+邮件+电话 -->
<operation>
<objectid>1</objectid>
<type>0</type>
<esc_step_from>1</esc_step_from>
<esc_step_to>1</esc_step_to>
<esc_period>0</esc_period>
<evaltype>0</evaltype>
<opconditions>
<opcondition>
<conditiontype>2</conditiontype>
<operator>0</operator>
<value>5</value>
</opcondition>
</opconditions>
<details>
<detail>
<type>0</type>
<value>{ALERT.MESSAGE}</value>
</detail>
</details>
</operation>
<!-- 严重告警:发送短信+邮件 -->
<!-- 警告告警:发送邮件 -->
<!-- 信息告警:仅记录日志 -->
</operations>
</action>3. 告警响应流程
| 告警级别 | 响应时间 | 响应人员 | 响应方式 | 处理流程 |
|---|---|---|---|---|
| 紧急告警 | 15分钟内 | 数据库管理员(DBA) | 电话+短信+邮件 | 立即响应 → 故障诊断 → 紧急修复 → 验证恢复 → 根因分析 → 文档记录 |
| 严重告警 | 30分钟内 | DBA或资深开发人员 | 短信+邮件 | 快速响应 → 问题分析 → 修复方案 → 实施修复 → 验证效果 → 文档记录 |
| 警告告警 | 2小时内 | 值班人员或DBA | 邮件 | 定期处理 → 问题评估 → 优化方案 → 实施优化 → 验证效果 |
| 信息告警 | 24小时内 | 运维人员 | 日志记录 | 定期查看 → 趋势分析 → 持续改进 |
告警级别管理最佳实践
1. 避免告警风暴
- 合理设置告警阈值:避免设置过于敏感的阈值
- 使用告警抑制:同一问题只触发一次告警
- 使用告警聚合:将相关告警聚合为一个告警
- 设置告警静默期:避免短时间内重复告警
- 定期清理无效告警:删除不再适用的告警规则
2. 告警级别调整
- 定期评审告警级别:每季度或半年评审一次告警级别
- 根据实际情况调整:根据告警的实际影响调整级别
- 收集用户反馈:根据业务用户的反馈调整告警级别
- 分析告警响应时间:根据实际响应时间调整告警级别
3. 告警监控和优化
- 监控告警触发频率:识别频繁触发的告警
- 分析告警解决时间:优化告警响应流程
- 统计告警准确率:减少误报和漏报
- 跟踪告警闭环率:确保所有告警都得到处理
- 建立告警知识库:积累常见告警的处理经验
常见问题(FAQ)
Q1:如何确定告警的级别?
解决方案:
确定告警级别时,应综合考虑以下因素:
- 影响范围:是否影响核心业务功能
- 紧急程度:是否需要立即处理
- 数据风险:是否存在数据丢失或损坏风险
- 恢复难度:修复所需的时间和资源
- 发生频率:是否是常见问题
示例判断流程:
- 如果数据库实例宕机 → 影响范围大,紧急程度高 → 紧急告警
- 如果从库复制延迟5分钟 → 影响范围小,紧急程度低 → 警告告警
Q2:如何避免告警风暴?
解决方案:
- 合理设置告警阈值:避免设置过于敏感的阈值
- 使用告警抑制规则:yaml
# Prometheus告警抑制规则示例 - source_match: severity: 'critical' target_match: severity: 'warning' equal: - 'instance' - 使用告警聚合:将多个相关告警聚合为一个
- 设置告警静默期:yaml
# Prometheus告警静默期示例 - alert: PostgresqlHighCpuUsage expr: avg(rate(process_cpu_seconds_total{job="postgres"}[5m])) > 0.9 for: 5m # 持续5分钟才触发告警 labels: severity: major - 定期清理无效告警规则
Q3:如何优化告警响应流程?
解决方案:
- 建立清晰的响应流程:明确不同级别告警的响应时间和责任人
- 使用自动化工具:sql
-- 自动清理旧的WAL日志示例 SELECT pg_switch_wal(); VACUUM VERBOSE ANALYZE; - 建立告警知识库:记录常见告警的处理方法
- 定期演练:模拟各种告警场景,提高响应速度
- 持续优化:根据实际响应情况不断优化流程
Q4:如何验证告警规则的有效性?
解决方案:
- 模拟告警场景:sql
-- 模拟高CPU使用率 SELECT pg_sleep(60); - 使用告警测试工具:如Prometheus的amtool
- 分析告警历史:查看告警触发情况和处理结果
- 收集用户反馈:了解告警是否有效
- 定期评审:每季度评审一次告警规则
Q5:如何处理误报告警?
解决方案:
- 分析误报原因:是否阈值设置不合理,是否监控指标有误
- 调整告警规则:修改阈值或告警逻辑
- 使用告警静默:暂时静默特定告警
- 记录误报情况:用于后续优化
- 持续改进:根据误报情况优化监控系统
