外观
PostgreSQL 告警阈值规范
核心概念
告警阈值规范是数据库监控体系的重要组成部分,用于定义各种监控指标的告警触发条件。合理的告警阈值设置有助于:
- 及时发现和处理数据库异常情况
- 避免误告警和漏告警
- 确保数据库服务的高可用性和稳定性
- 帮助DBA快速定位问题
告警等级定义
1. 告警等级分类
| 等级 | 名称 | 定义 | 处理要求 |
|---|---|---|---|
| P0 | 紧急 | 数据库服务不可用,直接影响业务 | 立即处理(10分钟内响应) |
| P1 | 严重 | 数据库性能严重下降,业务受到明显影响 | 优先处理(30分钟内响应) |
| P2 | 警告 | 数据库出现异常,但暂时不影响业务 | 尽快处理(2小时内响应) |
| P3 | 注意 | 数据库存在潜在问题,需要关注 | 定期检查(24小时内响应) |
2. 告警等级判断标准
- P0:数据库无法连接、主库宕机、复制中断且数据丢失
- P1:CPU使用率持续90%以上、内存不足导致OOM风险、连接数达到上限
- P2:锁等待时间过长、复制延迟持续增加、磁盘空间不足30%
- P3:索引使用率低、慢查询增加、配置参数不合理
关键指标告警阈值
1. 资源使用率指标
CPU使用率
| 监控对象 | 告警等级 | 阈值 | 持续时间 | 建议处理方式 |
|---|---|---|---|---|
| 数据库主机CPU | P1 | ≥ 90% | 5分钟 | 检查SQL执行计划,优化慢查询 |
| 数据库主机CPU | P2 | ≥ 80% | 10分钟 | 关注高CPU进程,分析资源消耗 |
| 数据库进程CPU | P1 | ≥ 90% | 5分钟 | 检查当前执行的SQL,终止长时间运行的查询 |
内存使用率
| 监控对象 | 告警等级 | 阈值 | 持续时间 | 建议处理方式 |
|---|---|---|---|---|
| 数据库主机内存 | P1 | ≥ 95% | 5分钟 | 检查内存泄漏,调整shared_buffers等参数 |
| 数据库主机内存 | P2 | ≥ 85% | 10分钟 | 优化内存使用,考虑升级硬件 |
| 数据库进程内存 | P1 | ≥ 90% | 5分钟 | 检查连接数,调整work_mem等参数 |
磁盘空间
| 监控对象 | 告警等级 | 阈值 | 持续时间 | 建议处理方式 |
|---|---|---|---|---|
| 数据目录磁盘 | P0 | ≤ 5% | 立即 | 紧急清理空间,扩展磁盘容量 |
| 数据目录磁盘 | P1 | ≤ 10% | 30分钟 | 清理日志文件,归档历史数据 |
| 数据目录磁盘 | P2 | ≤ 20% | 1小时 | 规划磁盘扩展,优化存储使用 |
| WAL目录磁盘 | P0 | ≤ 10% | 立即 | 检查归档是否正常,清理旧WAL文件 |
2. 数据库连接指标
| 监控对象 | 告警等级 | 阈值 | 持续时间 | 建议处理方式 |
|---|---|---|---|---|
| 连接数 | P1 | ≥ 90% of max_connections | 5分钟 | 检查连接泄漏,调整max_connections参数 |
| 连接数 | P2 | ≥ 80% of max_connections | 10分钟 | 优化连接池配置,关闭空闲连接 |
| 空闲连接数 | P3 | ≥ 60% of total_connections | 30分钟 | 配置idle_in_transaction_session_timeout参数 |
3. 锁和阻塞指标
| 监控对象 | 告警等级 | 阈值 | 持续时间 | 建议处理方式 |
|---|---|---|---|---|
| 锁等待时间 | P1 | ≥ 60秒 | 立即 | 检查阻塞进程,终止长时间运行的查询 |
| 锁等待时间 | P2 | ≥ 30秒 | 5分钟 | 分析锁竞争原因,优化SQL或索引 |
| 阻塞进程数 | P1 | ≥ 5个 | 立即 | 检查阻塞链,优先处理根因进程 |
| 死锁数量 | P2 | ≥ 1个 | 立即 | 分析死锁日志,优化事务设计 |
4. 复制相关指标
| 监控对象 | 告警等级 | 阈值 | 持续时间 | 建议处理方式 |
|---|---|---|---|---|
| 复制延迟(字节) | P1 | ≥ 1GB | 5分钟 | 检查网络状况,调整wal_sender_timeout参数 |
| 复制延迟(字节) | P2 | ≥ 500MB | 10分钟 | 优化网络带宽,检查备库性能 |
| 复制延迟(时间) | P1 | ≥ 30分钟 | 5分钟 | 检查备库是否宕机,重启wal_receiver进程 |
| 复制状态 | P0 | 中断 | 立即 | 检查主备连接,重建复制关系 |
5. SQL性能指标
| 监控对象 | 告警等级 | 阈值 | 持续时间 | 建议处理方式 |
|---|---|---|---|---|
| 慢查询数量 | P2 | ≥ 10个/分钟 | 10分钟 | 分析慢查询日志,优化SQL执行计划 |
| 全表扫描数量 | P3 | ≥ 50个/分钟 | 30分钟 | 检查缺失索引,添加合适的索引 |
| 临时文件数量 | P2 | ≥ 100个/小时 | 1小时 | 调整work_mem参数,优化SQL查询 |
6. 其他重要指标
| 监控对象 | 告警等级 | 阈值 | 持续时间 | 建议处理方式 |
|---|---|---|---|---|
| 检查点频率 | P2 | ≥ 30次/小时 | 1小时 | 调整checkpoint_timeout和checkpoint_completion_target参数 |
| WAL生成速率 | P2 | ≥ 100MB/分钟 | 10分钟 | 检查是否有大量写入操作,优化事务批量处理 |
| 索引使用率 | P3 | ≤ 50% | 1天 | 分析索引使用情况,删除无用索引 |
告警配置最佳实践
1. 配置原则
- 分级告警:根据问题严重程度设置不同的告警等级
- 避免误告警:合理设置持续时间阈值,避免瞬时峰值触发告警
- 告警聚合:对同一类型的告警进行聚合,避免告警风暴
- 告警抑制:在维护窗口内抑制非紧急告警
- 告警通知:配置多种通知方式(邮件、短信、钉钉、企业微信等)
2. 配置建议
- 对于核心业务数据库,建议启用所有P0和P1级别的告警
- 对于非核心业务数据库,可以只启用P0级别的告警
- 根据实际业务需求调整告警阈值,避免过多误告警
- 定期回顾告警历史,优化告警配置
3. 告警响应流程
- 告警接收:DBA收到告警通知
- 告警确认:验证告警是否真实有效
- 问题定位:根据告警信息定位问题原因
- 问题处理:采取相应的处理措施
- 恢复验证:验证问题是否已解决
- 告警关闭:关闭告警,并记录处理过程
- 根因分析:分析问题根本原因,制定预防措施
常见问题(FAQ)
Q1:如何设置合适的告警阈值?
A1:告警阈值设置应考虑以下因素:
- 数据库硬件配置和性能基线
- 业务高峰期和低峰期的差异
- 历史性能数据和告警记录
- 业务对数据库的依赖程度
- DBA团队的响应能力
建议先设置较为宽松的阈值,然后根据实际运行情况逐步调整优化。
Q2:如何避免告警风暴?
A2:可以采取以下措施避免告警风暴:
- 设置合理的持续时间阈值,避免瞬时峰值触发告警
- 对同一指标的告警进行聚合,设置告警间隔
- 在维护窗口内抑制非紧急告警
- 对相关联的告警进行分组,只发送最高级别的告警
- 配置告警静默规则,避免重复发送相同告警
Q3:告警阈值需要定期调整吗?
A3:是的,告警阈值需要定期调整。原因包括:
- 业务量变化导致性能基线改变
- 数据库配置参数调整
- 硬件升级或变更
- 历史告警数据分析结果
建议每季度回顾一次告警配置,根据实际情况进行调整。
Q4:如何验证告警配置的有效性?
A4:可以通过以下方式验证告警配置:
- 模拟故障场景,检查是否能正常触发告警
- 分析历史告警数据,统计误告警率和漏告警率
- 定期进行告警演练,测试DBA团队的响应能力
- 收集DBA团队的反馈,优化告警配置
Q5:不同环境的告警阈值应该一致吗?
A5:不同环境的告警阈值可以有所不同:
- 生产环境:阈值设置较为严格,告警等级划分详细
- 测试环境:阈值可以适当宽松,重点关注P0和P1级别的告警
- 开发环境:可以只启用基本的告警,避免过多干扰开发工作
建议根据环境的重要性和使用场景设置不同的告警阈值。
