外观
PostgreSQL 告警策略
告警策略是PostgreSQL监控体系中的重要组成部分,它能够在数据库出现异常时及时通知DBA,以便快速响应和解决问题。一个完善的告警策略应该包括合理的告警指标选择、适当的阈值设置、清晰的告警分级和高效的通知机制。
告警指标选择
选择合适的告警指标是建立有效告警策略的基础。应该优先选择那些能够直接反映数据库健康状态和性能问题的指标。
1. 可用性指标
- 数据库连接状态:监控数据库是否可以正常连接
- 实例运行状态:监控PostgreSQL实例是否正常运行
- 复制状态:监控主从复制是否正常,包括复制延迟、同步状态等
- WAL归档状态:监控WAL归档是否正常,确保数据安全性
2. 性能指标
- 连接数:监控当前连接数,避免连接池耗尽
- TPS/QPS:监控事务数和查询数,识别异常流量
- 慢查询数量:监控慢查询的数量,及时发现性能问题
- 锁等待时间:监控锁等待时间和数量,识别锁竞争问题
- 缓存命中率:监控共享缓冲区和索引缓存的命中率,识别内存配置问题
3. 资源指标
- CPU使用率:监控数据库主机的CPU使用率
- 内存使用率:监控数据库主机和PostgreSQL进程的内存使用率
- 磁盘空间:监控表空间和数据目录的磁盘空间使用情况
- 磁盘I/O:监控磁盘的读写速率和等待时间
- 网络I/O:监控网络流量,识别异常网络活动
4. 可靠性指标
- 死锁数量:监控数据库中的死锁数量
- 无效索引比例:监控无效或未使用的索引比例
- 表膨胀率:监控表和索引的膨胀情况
- Vacuum状态:监控Autovacuum的运行情况,避免事务ID回卷
- 错误日志数量:监控数据库错误日志的数量,识别异常情况
告警阈值设置
告警阈值的设置需要根据实际业务负载和数据库性能进行调整,避免误报和漏报。
1. 阈值设置原则
- 基于历史数据:分析历史性能数据,设置合理的阈值
- 考虑业务峰值:区分正常业务峰值和异常情况
- 避免频繁告警:设置适当的告警持续时间,避免抖动导致的频繁告警
- 分级设置:根据问题的严重程度设置不同的阈值级别
- 定期调整:根据业务变化和性能优化结果,定期调整阈值
2. 常用指标阈值参考
| 指标 | 警告阈值 | 严重阈值 | 备注 |
|---|---|---|---|
| 连接数 | 80% | 95% | 基于max_connections设置 |
| CPU使用率 | 70% | 90% | 持续5分钟以上 |
| 内存使用率 | 80% | 95% | 持续5分钟以上 |
| 磁盘空间 | 80% | 90% | 考虑增长率 |
| 复制延迟 | 30秒 | 5分钟 | 基于业务对数据一致性的要求 |
| 慢查询数量 | 10个/分钟 | 50个/分钟 | 基于业务复杂度 |
| 锁等待时间 | 1秒 | 10秒 | 持续1分钟以上 |
| 缓存命中率 | 95% | 90% | 持续5分钟以上 |
| 死锁数量 | 1个/小时 | 5个/小时 | 基于业务特性 |
3. 动态阈值设置
对于某些指标,可以考虑使用动态阈值,根据业务负载的变化自动调整:
- 基于百分比:如连接数使用百分比,而不是固定数值
- 基于基线:如TPS/QPS超过历史基线的200%
- 基于趋势:如磁盘空间增长率超过正常水平
- 基于机器学习:使用机器学习算法自动识别异常模式
告警分级
根据告警的严重程度和影响范围,将告警分为不同级别,便于DBA优先处理紧急问题。
1. 告警级别定义
| 级别 | 名称 | 颜色 | 影响范围 | 响应时间要求 |
|---|---|---|---|---|
| 1 | 紧急 | 红色 | 业务中断或数据丢失风险 | 立即响应(5分钟内) |
| 2 | 严重 | 橙色 | 重要业务受影响 | 15分钟内响应 |
| 3 | 警告 | 黄色 | 性能下降或潜在问题 | 1小时内响应 |
| 4 | 信息 | 蓝色 | 正常状态变化或提示信息 | 24小时内查看 |
2. 告警级别映射
| 告警指标 | 紧急 | 严重 | 警告 | 信息 |
|---|---|---|---|---|
| 数据库连接失败 | ✓ | |||
| 实例宕机 | ✓ | |||
| 复制中断 | ✓ | |||
| WAL归档失败 | ✓ | |||
| 磁盘空间不足(>95%) | ✓ | |||
| 复制延迟 > 5分钟 | ✓ | |||
| 连接数 > 95% | ✓ | |||
| CPU使用率 > 90% | ✓ | |||
| 内存使用率 > 95% | ✓ | |||
| 慢查询数量突增 | ✓ | |||
| 锁等待时间 > 10秒 | ✓ | |||
| 缓存命中率 < 90% | ✓ | |||
| 表膨胀率 > 50% | ✓ | |||
| Autovacuum长时间运行 | ✓ | |||
| 新的连接建立 | ✓ | |||
| 备份完成通知 | ✓ |
告警通知机制
告警通知机制确保告警能够及时传递给相关人员,以便快速响应和解决问题。
1. 通知渠道
- Email:最常用的通知渠道,适合大多数告警场景
- SMS:适合紧急告警,确保在手机无网络时也能收到通知
- 即时通讯工具:如Slack、钉钉、企业微信等,支持群组通知和@功能
- 电话告警:适合最紧急的告警,确保DBA能够立即收到通知
- PagerDuty/OpsGenie:专业的告警管理平台,支持告警升级和排班管理
- Webhook:支持自定义集成,如集成到内部运维平台
2. 通知策略
- 按级别通知:不同级别的告警使用不同的通知渠道
- 按时间段通知:工作时间和非工作时间使用不同的通知策略
- 告警升级机制:如果告警在指定时间内未被处理,自动升级通知级别
- 重复通知抑制:避免同一问题的频繁告警,设置合理的重复通知间隔
- 通知组管理:根据告警类型和级别,通知不同的DBA团队
3. 告警升级策略
| 级别 | 初始通知 | 10分钟未处理 | 30分钟未处理 | 60分钟未处理 |
|---|---|---|---|---|
| 紧急 | Email + SMS + 即时通讯 | 电话告警 | 升级到团队负责人 | 升级到部门负责人 |
| 严重 | Email + 即时通讯 | SMS | 电话告警 | 升级到团队负责人 |
| 警告 | Email + 即时通讯 | 重复通知 | 升级到团队负责人 | |
| 信息 |
告警管理最佳实践
1. 告警生命周期管理
- 告警触发:监控系统检测到指标超过阈值,生成告警
- 告警通知:按照通知策略发送告警通知
- 告警确认:DBA确认收到告警,开始处理
- 告警处理:DBA分析和解决问题
- 告警恢复:问题解决后,告警自动恢复或手动关闭
- 告警归档:告警记录归档,便于后续分析和审计
2. 告警降噪
- 聚合相似告警:将同一问题导致的多个告警聚合为一个告警
- 设置合理的告警持续时间:避免瞬间抖动导致的误报
- 排除已知问题:对于已知的、不影响业务的问题,设置告警抑制
- 定期清理无效告警:移除不再适用的告警规则
- 优化告警规则:根据实际情况调整告警规则,减少误报
3. 告警测试
- 定期测试告警:每月或每季度测试一次告警系统,确保其正常工作
- 测试所有通知渠道:确保所有通知渠道都能正常发送告警
- 模拟各种告警场景:测试不同级别的告警和升级机制
- 记录测试结果:记录测试结果,便于后续改进
4. 告警分析与优化
- 定期分析告警历史:分析告警的频率、原因和处理时间
- 识别常见问题:找出频繁发生的问题,进行根本原因分析
- 优化告警规则:根据分析结果,调整告警阈值和规则
- 优化处理流程:根据告警处理经验,优化问题处理流程
- 更新知识库:将常见问题和解决方案记录到知识库中
不同监控系统的告警配置
1. Prometheus + Alertmanager
配置告警规则
yaml
# prometheus/rules/postgresql.rules.yml
groups:
- name: postgresql-alerts
rules:
# 数据库不可用告警
- alert: PostgreSQLDown
expr: pg_up == 0
for: 5m
labels:
severity: critical
annotations:
summary: "PostgreSQL实例宕机"
description: "PostgreSQL实例 {{ $labels.instance }} 已经宕机超过5分钟"
# 连接数过高告警
- alert: PostgreSQLHighConnections
expr: pg_stat_database_numbackends / pg_settings_max_connections * 100 > 80
for: 10m
labels:
severity: warning
annotations:
summary: "PostgreSQL连接数过高"
description: "PostgreSQL实例 {{ $labels.instance }} 连接数使用率超过80% (当前: {{ $value | printf \"%.2f\" }}%)"
# 复制延迟告警
- alert: PostgreSQLReplicationLag
expr: pg_stat_replication_replay_lag_seconds > 300
for: 5m
labels:
severity: critical
annotations:
summary: "PostgreSQL复制延迟过高"
description: "PostgreSQL实例 {{ $labels.instance }} 复制延迟超过5分钟 (当前: {{ $value | printf \"%.2f\" }}秒)"
# 磁盘空间告警
- alert: PostgreSQLDiskSpaceLow
expr: (pg_database_size_bytes / pg_filesystem_size_bytes) * 100 > 85
for: 1h
labels:
severity: warning
annotations:
summary: "PostgreSQL磁盘空间不足"
description: "PostgreSQL实例 {{ $labels.instance }} 磁盘空间使用率超过85% (当前: {{ $value | printf \"%.2f\" }}%)"配置Alertmanager
yaml
# alertmanager.yml
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.example.com:587'
smtp_from: 'alerts@example.com'
smtp_auth_username: 'alerts@example.com'
smtp_auth_password: 'password'
smtp_require_tls: true
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'team-dba'
routes:
- match:
severity: critical
receiver: 'team-dba-critical'
receivers:
- name: 'team-dba'
email_configs:
- to: 'dba-team@example.com'
webhook_configs:
- url: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX'
- name: 'team-dba-critical'
email_configs:
- to: 'dba-team@example.com'
sms_configs:
- phone_number: '+15551234567'
webhook_configs:
- url: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX'
pagerduty_configs:
- service_key: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'2. Zabbix告警配置
创建告警媒介
- 登录Zabbix Frontend
- 点击"Administration" -> "Media types"
- 点击"Create media type"
- 选择媒介类型(如Email、SMS、Slack等)
- 配置媒介参数
- 点击"Add"完成创建
配置用户告警媒介
- 点击"Administration" -> "Users"
- 找到目标用户,点击"Media"
- 点击"Add"
- 配置告警媒介:
- Type: 选择告警媒介
- Send to: 接收地址
- When active: 告警有效时间
- Use if severity: 适用的告警级别
- 点击"Add"完成配置
配置告警动作
- 点击"Configuration" -> "Actions"
- 点击"Create action"
- 填写动作信息:
- Name: 动作名称
- Conditions: 触发条件
- Operations: 告警操作(发送通知、执行命令等)
- Recovery operations: 恢复操作
- 点击"Add"完成创建
告警策略案例
1. 电商平台PostgreSQL告警策略
核心业务指标
- 订单创建成功率:监控订单创建的成功率,低于99.9%触发告警
- 支付延迟:监控支付相关查询的执行时间,超过500ms触发告警
- 用户登录延迟:监控用户登录相关查询的执行时间,超过300ms触发告警
数据库指标
- 连接数:警告阈值80%,严重阈值95%
- TPS/QPS:超过历史峰值200%触发告警
- 慢查询数量:每分钟超过10个触发警告,超过50个触发严重告警
- 复制延迟:超过30秒触发警告,超过5分钟触发严重告警
- 磁盘空间:使用率超过80%触发警告,超过90%触发严重告警
- 死锁数量:每小时超过5个触发警告
通知策略
- 工作时间(9:00-18:00):所有告警通过Email和企业微信发送
- 非工作时间:警告级别及以上通过SMS和企业微信发送,紧急级别通过电话告警
- 告警升级:10分钟未处理升级到团队负责人,30分钟未处理升级到部门负责人
2. 金融系统PostgreSQL告警策略
核心业务指标
- 交易成功率:监控金融交易的成功率,低于99.99%触发告警
- 交易延迟:监控交易相关查询的执行时间,超过200ms触发告警
- 数据一致性:监控主从数据一致性,出现不一致立即触发紧急告警
数据库指标
- 连接数:警告阈值70%,严重阈值85%
- CPU使用率:超过80%持续5分钟触发警告,超过90%持续2分钟触发严重告警
- 内存使用率:超过85%触发警告,超过95%触发严重告警
- 复制延迟:超过10秒触发警告,超过30秒触发严重告警
- WAL归档失败:立即触发紧急告警
- 错误日志数量:每分钟超过5个错误日志触发警告
通知策略
- 所有时间:严重级别及以上通过Email、SMS和企业微信发送
- 紧急级别:立即通过电话告警,10分钟未处理升级到团队负责人
- 审计要求:所有告警记录保存7年,便于审计
常见问题与解决方案
1. 频繁误报
问题:告警系统频繁发送误报,影响DBA的工作效率
解决方案:
- 调整告警阈值,增加告警持续时间
- 聚合相似告警,减少告警数量
- 排除已知问题,设置告警抑制
- 使用动态阈值,适应业务变化
2. 漏报重要问题
问题:重要问题没有触发告警,导致业务受到影响
解决方案:
- 检查告警规则是否覆盖所有重要指标
- 验证告警系统是否正常工作
- 调整阈值设置,确保能够检测到异常情况
- 增加监控频率,缩短检测间隔
3. 告警响应不及时
问题:告警发送后,DBA没有及时响应
解决方案:
- 优化通知渠道,确保告警能够及时送达
- 完善告警升级机制,确保告警能够得到处理
- 合理安排DBA值班,确保24小时有人响应
- 定期培训DBA,提高告警处理效率
4. 告警处理效率低下
问题:DBA处理告警的效率低下,导致问题解决时间过长
解决方案:
- 建立告警处理流程,规范处理步骤
- 创建知识库,记录常见问题的解决方案
- 定期分析告警历史,优化处理流程
- 使用自动化工具,减少手动操作
版本差异注意事项
PostgreSQL版本差异
| 版本 | 告警指标差异 |
|---|---|
| PostgreSQL 16 | 新增了更多的性能监控指标,如pg_stat_io等 |
| PostgreSQL 14-15 | 支持大多数告警指标,包括复制状态、WAL监控等 |
| PostgreSQL 10-13 | 基本告警指标都支持,但某些高级指标可能不可用 |
| PostgreSQL 9.x | 支持基本的可用性和性能指标,但缺少部分高级监控功能 |
监控系统版本差异
| 系统 | 版本 | 告警功能差异 |
|---|---|---|
| Prometheus | 2.40+ | 支持native histograms,提高告警精度 |
| Zabbix | 6.0+ | 增强了告警功能,支持更多通知渠道 |
| Grafana | 9.0+ | 增强了告警功能,支持告警分组和升级 |
