Skip to content

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. 告警级别设置原则

  1. 基于影响范围:根据告警对业务的影响范围确定级别
  2. 基于紧急程度:根据问题的紧急程度确定级别
  3. 基于恢复难度:根据问题的恢复难度确定级别
  4. 基于数据风险:根据数据丢失或损坏的风险确定级别
  5. 基于频率调整:根据告警的发生频率调整级别,避免告警疲劳

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:如何确定告警的级别?

解决方案

确定告警级别时,应综合考虑以下因素:

  1. 影响范围:是否影响核心业务功能
  2. 紧急程度:是否需要立即处理
  3. 数据风险:是否存在数据丢失或损坏风险
  4. 恢复难度:修复所需的时间和资源
  5. 发生频率:是否是常见问题

示例判断流程

  • 如果数据库实例宕机 → 影响范围大,紧急程度高 → 紧急告警
  • 如果从库复制延迟5分钟 → 影响范围小,紧急程度低 → 警告告警

Q2:如何避免告警风暴?

解决方案

  1. 合理设置告警阈值:避免设置过于敏感的阈值
  2. 使用告警抑制规则
    yaml
    # Prometheus告警抑制规则示例
    - source_match:
        severity: 'critical'
      target_match:
        severity: 'warning'
      equal:
        - 'instance'
  3. 使用告警聚合:将多个相关告警聚合为一个
  4. 设置告警静默期
    yaml
    # Prometheus告警静默期示例
    - alert: PostgresqlHighCpuUsage
      expr: avg(rate(process_cpu_seconds_total{job="postgres"}[5m])) > 0.9
      for: 5m  # 持续5分钟才触发告警
      labels:
        severity: major
  5. 定期清理无效告警规则

Q3:如何优化告警响应流程?

解决方案

  1. 建立清晰的响应流程:明确不同级别告警的响应时间和责任人
  2. 使用自动化工具
    sql
    -- 自动清理旧的WAL日志示例
    SELECT pg_switch_wal();
    VACUUM VERBOSE ANALYZE;
  3. 建立告警知识库:记录常见告警的处理方法
  4. 定期演练:模拟各种告警场景,提高响应速度
  5. 持续优化:根据实际响应情况不断优化流程

Q4:如何验证告警规则的有效性?

解决方案

  1. 模拟告警场景
    sql
    -- 模拟高CPU使用率
    SELECT pg_sleep(60);
  2. 使用告警测试工具:如Prometheus的amtool
  3. 分析告警历史:查看告警触发情况和处理结果
  4. 收集用户反馈:了解告警是否有效
  5. 定期评审:每季度评审一次告警规则

Q5:如何处理误报告警?

解决方案

  1. 分析误报原因:是否阈值设置不合理,是否监控指标有误
  2. 调整告警规则:修改阈值或告警逻辑
  3. 使用告警静默:暂时静默特定告警
  4. 记录误报情况:用于后续优化
  5. 持续改进:根据误报情况优化监控系统