Skip to content

MySQL 告警阈值规范

告警级别与定义

紧急告警(Critical)

  • 定义:严重影响数据库正常运行的问题,需要立即处理
  • 告警方式:电话、短信、即时通讯工具
  • 响应时间:10分钟内响应,30分钟内开始处理
  • 影响范围:数据库不可用或性能严重下降
  • 示例:数据库崩溃、连接数耗尽、磁盘空间不足

重要告警(Major)

  • 定义:影响数据库性能或稳定性的问题,需要尽快处理
  • 告警方式:短信、即时通讯工具、邮件
  • 响应时间:30分钟内响应,1小时内开始处理
  • 影响范围:部分功能受影响或性能明显下降
  • 示例:复制延迟、高 CPU 使用率、慢查询风暴

警告告警(Warning)

  • 定义:可能影响数据库性能的潜在问题,需要关注
  • 告警方式:即时通讯工具、邮件
  • 响应时间:1小时内响应,4小时内开始处理
  • 影响范围:性能轻微下降或存在潜在风险
  • 示例:内存使用率高、锁等待增加、临时表过多

提示告警(Info)

  • 定义:需要了解但不影响数据库正常运行的信息
  • 告警方式:邮件、日志
  • 响应时间:工作时间内处理
  • 影响范围:无直接影响
  • 示例:备份完成、参数修改、版本更新

告警指标分类

1. 连接相关指标

指标名称告警级别阈值建议监控周期描述
连接数使用率紧急> 90%1分钟当前连接数占最大连接数的百分比
连接数使用率重要> 80%1分钟当前连接数占最大连接数的百分比
连接数使用率警告> 70%1分钟当前连接数占最大连接数的百分比
连接错误率重要> 1%5分钟连接错误次数占总连接请求的百分比
最大连接数警告> 历史峰值1小时超过历史最大连接数

2. CPU 与内存指标

指标名称告警级别阈值建议监控周期描述
CPU 使用率紧急> 95%1分钟数据库进程 CPU 使用率
CPU 使用率重要> 90%1分钟数据库进程 CPU 使用率
CPU 使用率警告> 80%5分钟数据库进程 CPU 使用率
系统 CPU 使用率重要> 90%1分钟系统总体 CPU 使用率
内存使用率重要> 90%5分钟数据库进程内存使用率
系统内存使用率警告> 90%5分钟系统总体内存使用率

3. 磁盘相关指标

指标名称告警级别阈值建议监控周期描述
磁盘空间使用率紧急> 95%30分钟数据目录所在磁盘的使用率
磁盘空间使用率重要> 90%1小时数据目录所在磁盘的使用率
磁盘空间使用率警告> 80%2小时数据目录所在磁盘的使用率
磁盘 I/O 使用率重要> 90%1分钟磁盘 I/O 使用率
磁盘读写延迟重要> 50ms1分钟磁盘平均读写延迟
磁盘写入错误紧急> 01分钟磁盘写入错误次数

4. 存储引擎指标

指标名称告警级别阈值建议监控周期描述
InnoDB 缓冲池命中率警告< 95%5分钟InnoDB 缓冲池命中率
InnoDB 缓冲池使用率警告> 90%5分钟InnoDB 缓冲池使用率
InnoDB 日志等待率重要> 1%1分钟InnoDB 日志缓冲等待次数占总请求的百分比
InnoDB 锁等待次数重要> 100/分钟5分钟每分钟 InnoDB 锁等待次数
InnoDB 死锁次数重要> 0/小时1小时每小时 InnoDB 死锁次数
InnoDB 脏页比例警告> 50%5分钟InnoDB 脏页占总页数的比例

5. 复制相关指标

指标名称告警级别阈值建议监控周期描述
复制延迟紧急> 300秒1分钟主从复制延迟时间
复制延迟重要> 60秒1分钟主从复制延迟时间
复制延迟警告> 30秒1分钟主从复制延迟时间
复制线程状态紧急停止1分钟复制线程异常停止
复制错误紧急> 01分钟复制过程中出现错误
GTID 一致性紧急不一致1分钟主从 GTID 集合不一致

6. 查询相关指标

指标名称告警级别阈值建议监控周期描述
慢查询数紧急> 100/分钟1分钟每分钟慢查询次数
慢查询数重要> 50/分钟1分钟每分钟慢查询次数
慢查询数警告> 10/分钟5分钟每分钟慢查询次数
查询执行时间警告> 1秒1分钟平均查询执行时间
QPS警告> 历史峰值的 150%1分钟每秒查询数超过历史峰值
TPS警告> 历史峰值的 150%1分钟每秒事务数超过历史峰值

7. 日志相关指标

指标名称告警级别阈值建议监控周期描述
错误日志增长速度重要> 10MB/小时1小时错误日志增长速度过快
二进制日志增长速度警告> 1GB/小时1小时二进制日志增长速度过快
慢查询日志增长速度警告> 500MB/小时1小时慢查询日志增长速度过快
日志写入错误紧急> 01分钟日志写入错误次数

8. 其他指标

指标名称告警级别阈值建议监控周期描述
临时表使用比例警告> 50%5分钟磁盘临时表占总临时表的比例
打开表数量警告> 最大打开表数量的 80%5分钟当前打开表数量占最大允许值的比例
连接池使用率警告> 80%5分钟连接池使用率
权限错误次数重要> 10/分钟5分钟每分钟权限错误次数

告警阈值设置方法

1. 基于历史数据

  • 收集历史数据:收集至少 7 天的历史监控数据
  • 分析峰值:确定各指标的正常范围和峰值
  • 设置基线:基于历史平均值和峰值设置告警基线
  • 动态调整:根据业务变化定期调整告警阈值

2. 基于业务需求

  • 业务优先级:根据业务重要性调整告警级别
  • SLA 要求:结合服务级别协议设置告警阈值
  • 用户体验:考虑用户体验影响设置告警阈值
  • 成本因素:平衡告警频率和处理成本

3. 基于行业标准

  • 参考最佳实践:参考 MySQL 官方和行业最佳实践
  • 咨询专家:咨询数据库专家或第三方服务提供商
  • 对比同行:参考同行业类似规模企业的告警设置

4. 基于风险评估

  • 风险分析:评估各指标异常对业务的影响
  • 概率分析:分析各指标异常发生的概率
  • 影响范围:考虑异常影响的业务范围
  • 恢复成本:评估异常恢复的时间和成本

告警阈值设置步骤

1. 确定监控指标

  • 核心指标:必须监控的关键指标
  • 次要指标:根据业务需求选择的指标
  • 自定义指标:根据特定业务场景定义的指标

2. 收集基线数据

  • 收集周期:至少收集 7 天的历史数据
  • 数据粒度:根据指标特性选择合适的监控粒度
  • 数据存储:使用监控系统存储历史数据
  • 数据分析:分析数据分布和趋势

3. 设置初始阈值

  • 基于百分位:使用 95% 或 99% 百分位值作为初始阈值
  • 基于标准差:使用平均值 ± 3 倍标准差作为阈值范围
  • 基于固定值:对于某些指标使用固定阈值
  • 分级设置:为不同级别设置不同阈值

4. 测试和调整

  • 模拟测试:模拟各种异常场景,测试告警触发情况
  • 实际测试:在生产环境中观察告警触发情况
  • 调整优化:根据测试结果调整告警阈值
  • 持续优化:定期回顾和调整告警阈值

5. 文档化

  • 记录阈值:详细记录各指标的告警阈值和级别
  • 说明原因:说明设置该阈值的原因和依据
  • 更新记录:记录阈值调整的历史和原因
  • 培训文档:为运维人员提供告警处理培训

告警通知与处理流程

1. 告警通知方式

告警级别通知方式通知频率通知对象
紧急告警电话 + 短信 + 即时通讯立即通知,5分钟未确认则升级值班 DBA + 数据库负责人
重要告警短信 + 即时通讯立即通知值班 DBA
警告告警即时通讯 + 邮件立即通知值班 DBA
提示告警邮件每日汇总数据库团队

2. 告警处理流程

紧急告警处理流程

  1. 告警触发:监控系统检测到紧急告警
  2. 通知发送:通过多种方式通知相关人员
  3. 确认接收:接收人确认收到告警
  4. 问题定位:快速定位问题原因
  5. 紧急处理:采取紧急措施恢复服务
  6. 验证恢复:验证服务是否恢复正常
  7. 根因分析:分析问题根本原因
  8. 改进措施:采取措施防止再次发生
  9. 告警关闭:关闭告警,记录处理过程

重要告警处理流程

  1. 告警触发:监控系统检测到重要告警
  2. 通知发送:通过短信和即时通讯通知
  3. 问题分析:分析问题原因和影响
  4. 计划处理:制定处理计划
  5. 实施处理:按照计划处理问题
  6. 验证效果:验证处理效果
  7. 告警关闭:关闭告警,记录处理过程

警告告警处理流程

  1. 告警触发:监控系统检测到警告告警
  2. 通知发送:通过即时通讯和邮件通知
  3. 趋势分析:分析指标变化趋势
  4. 预防措施:采取预防措施
  5. 持续监控:持续监控指标变化
  6. 告警关闭:问题解决后关闭告警

3. 告警升级机制

告警级别首次通知未确认升级未解决升级
紧急告警值班 DBA5分钟未确认,升级到数据库负责人30分钟未解决,升级到技术总监
重要告警值班 DBA15分钟未确认,升级到数据库负责人2小时未解决,升级到技术总监
警告告警值班 DBA1小时未确认,升级到数据库负责人4小时未解决,升级到技术总监
提示告警数据库团队

告警阈值优化

1. 减少误告警

  • 调整阈值:根据实际情况调整告警阈值
  • 增加持续时间:设置告警持续时间,避免瞬时波动
  • 使用复合条件:使用多个指标联合判断
  • 智能告警:使用机器学习算法减少误告警

2. 提高告警准确性

  • 细化指标:使用更细化的指标进行告警
  • 动态阈值:根据时间、业务量等因素动态调整阈值
  • 基线学习:自动学习正常基线,检测异常
  • 关联分析:关联多个指标,提高告警准确性

3. 优化告警频率

  • 合并告警:合并相关告警,减少告警数量
  • 抑制重复告警:设置告警抑制规则,避免重复告警
  • 告警分组:按业务、组件等维度分组告警
  • 告警静默:在维护窗口设置告警静默

4. 告警效果评估

  • 告警有效性:评估告警是否准确反映问题
  • 告警及时性:评估告警是否及时触发
  • 告警处理时间:评估告警处理时间
  • 告警抑制率:评估误告警抑制效果

告警工具配置

1. Zabbix 配置

xml
<!-- Zabbix 告警媒介配置示例 -->
<媒介类型>
  <name>Email</name>
  <type>1</type>
  <smtp_server>smtp.example.com</smtp_server>
  <smtp_helo>example.com</smtp_helo>
  <smtp_email>zabbix@example.com</smtp_email>
  <exec_path/>
  <exec_params/>
  <status>0</status>
  <ssl_connect>1</ssl_connect>
  <ssl_verify>1</ssl_verify>
  <details>
    <name>SMTP server port</name>
    <value>587</value>
    <type>0</type>
  </details>
</媒介类型>
xml
<!-- Zabbix 触发器配置示例 -->
<触发器>
  <name>MySQL: High Connection Usage</name>
  <expression>{mysql_template:mysql.connections.pct.last(0)}>90</expression>
  <recovery_mode>0</recovery_mode>
  <recovery_expression/>
  <priority>4</priority>
  <description>MySQL connection usage is above 90% for 5 minutes</description>
  <type>0</type>
  <state>0</state>
  <status>0</status>
  <allowed_hosts/>
  <hosts>
    <host>
      <hostid>10001</hostid>
    </host>
  </hosts>
</触发器>

2. Prometheus + Alertmanager 配置

yaml
# Alertmanager 配置示例
global:
  smtp_smarthost: 'smtp.example.com:587'
  smtp_from: 'alertmanager@example.com'
  smtp_auth_username: 'alertmanager'
  smtp_auth_password: 'password'
  smtp_require_tls: true

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'email-notifications'
  routes:
  - match:
      severity: critical
    receiver: 'phone-notifications'
    continue: true

receivers:
- name: 'email-notifications'
  email_configs:
  - to: 'dba@example.com'

- name: 'phone-notifications'
  webhook_configs:
  - url: 'http://pagerduty-webhook.example.com'
yaml
# Prometheus 告警规则示例
groups:
- name: mysql-alerts
  rules:
  - alert: MySQLHighConnectionUsage
    expr: mysql_global_status_threads_connected / mysql_global_variables_max_connections * 100 > 90
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "MySQL high connection usage"
      description: "MySQL connection usage is {{ $value }}% for 5 minutes on {{ $labels.instance }}"

  - alert: MySQLReplicationLag
    expr: mysql_slave_status_seconds_behind_master > 300
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "MySQL replication lag"
      description: "Replication lag is {{ $value }} seconds on {{ $labels.instance }}"

3. Nagios 配置

txt
# Nagios 服务配置示例
define service {
    use                     generic-service
    hostgroup_name          mysql-servers
    service_description     MySQL Connections
    check_command           check_mysql_connections!user!password!90!95
    notifications_enabled   1
    contact_groups          dba-group
}

# Nagios 命令配置示例
define command {
    command_name    check_mysql_connections
    command_line    $USER1$/check_mysql_health --hostname $HOSTADDRESS$ --username $ARG1$ --password $ARG2$ --mode connections --warning $ARG3$ --critical $ARG4$
}

告警阈值最佳实践

1. 分级设置原则

  • 分级告警:根据影响程度设置不同级别
  • 分级响应:不同级别采用不同的响应策略
  • 分级通知:不同级别采用不同的通知方式
  • 分级升级:不同级别采用不同的升级机制

2. 动态调整原则

  • 时间维度:根据业务时间调整阈值
  • 业务维度:根据业务量调整阈值
  • 季节性:考虑季节性业务变化
  • 趋势性:考虑业务增长趋势

3. 避免告警风暴

  • 告警合并:合并相关告警
  • 告警抑制:设置告警抑制规则
  • 告警分组:按维度分组告警
  • 告警静默:维护窗口设置静默

4. 持续优化原则

  • 定期回顾:每月回顾告警设置
  • 数据分析:分析告警数据,优化阈值
  • 反馈机制:收集运维人员反馈
  • 持续改进:不断优化告警机制

5. 文档化原则

  • 详细记录:记录告警设置和调整历史
  • 说明原因:说明设置该阈值的依据
  • 培训文档:为运维人员提供培训
  • 更新及时:及时更新告警文档

常见告警场景与处理

场景 1:连接数耗尽

告警信息

告警级别:紧急
告警指标:连接数使用率 > 95%
告警对象:mysql-server-01
告警时间:2023-01-01 12:00:00

处理步骤

  1. 紧急处理

    • 增加临时最大连接数
    • 终止空闲连接
    • 检查连接泄漏
  2. 根因分析

    • 分析连接增长趋势
    • 检查应用连接池配置
    • 检查是否存在连接泄漏
  3. 长期解决方案

    • 优化应用连接池配置
    • 增加数据库资源
    • 优化查询,减少连接占用时间

场景 2:复制延迟

告警信息

告警级别:重要
告警指标:复制延迟 > 60秒
告警对象:mysql-slave-01
告警时间:2023-01-01 13:00:00

处理步骤

  1. 紧急处理

    • 检查复制状态
    • 重启复制线程
    • 检查主库负载
  2. 根因分析

    • 分析复制延迟原因
    • 检查从库资源使用
    • 检查网络延迟
  3. 长期解决方案

    • 优化从库配置
    • 增加从库资源
    • 优化主库写入性能
    • 考虑使用并行复制

场景 3:磁盘空间不足

告警信息

告警级别:紧急
告警指标:磁盘空间使用率 > 95%
告警对象:mysql-server-01
告警时间:2023-01-01 14:00:00

处理步骤

  1. 紧急处理

    • 清理临时文件
    • 清理过期日志
    • 扩容磁盘空间
  2. 根因分析

    • 分析磁盘空间增长原因
    • 检查数据增长趋势
    • 检查日志配置
  3. 长期解决方案

    • 优化数据存储
    • 调整日志配置
    • 实施数据归档策略
    • 制定扩容计划

场景 4:高 CPU 使用率

告警信息

告警级别:重要
告警指标:CPU 使用率 > 90%
告警对象:mysql-server-01
告警时间:2023-01-01 15:00:00

处理步骤

  1. 紧急处理

    • 检查慢查询
    • 终止消耗 CPU 的查询
    • 检查系统负载
  2. 根因分析

    • 分析 CPU 使用率来源
    • 检查慢查询日志
    • 检查索引使用情况
  3. 长期解决方案

    • 优化慢查询
    • 增加索引
    • 优化数据库配置
    • 增加 CPU 资源

告警阈值规范模板

模板 1:基础告警阈值

指标名称紧急阈值重要阈值警告阈值监控周期告警级别
连接数使用率> 95%> 90%> 80%1分钟紧急/重要/警告
CPU 使用率> 95%> 90%> 80%1分钟紧急/重要/警告
磁盘空间使用率> 95%> 90%> 80%30分钟紧急/重要/警告
复制延迟> 300秒> 60秒> 30秒1分钟紧急/重要/警告
慢查询数> 100/分钟> 50/分钟> 10/分钟1分钟紧急/重要/警告

模板 2:详细告警阈值

指标类别指标名称阈值持续时间告警级别通知方式
连接连接数使用率> 95%1分钟紧急电话+短信+IM
连接连接数使用率> 90%1分钟重要短信+IM
连接连接数使用率> 80%5分钟警告IM+邮件
CPUCPU 使用率> 95%1分钟紧急电话+短信+IM
CPUCPU 使用率> 90%1分钟重要短信+IM
CPUCPU 使用率> 80%5分钟警告IM+邮件
磁盘磁盘空间使用率> 95%30分钟紧急电话+短信+IM
磁盘磁盘空间使用率> 90%1小时重要短信+IM
磁盘磁盘空间使用率> 80%2小时警告IM+邮件
复制复制延迟> 300秒1分钟紧急电话+短信+IM
复制复制延迟> 60秒1分钟重要短信+IM
复制复制延迟> 30秒1分钟警告IM+邮件
查询慢查询数> 100/分钟1分钟紧急电话+短信+IM
查询慢查询数> 50/分钟1分钟重要短信+IM
查询慢查询数> 10/分钟5分钟警告IM+邮件

性能优化案例

案例 1:告警阈值优化

问题描述

某 MySQL 数据库频繁收到连接数使用率警告告警,但实际业务未受影响,导致告警疲劳。

分析过程

  1. 查看历史连接数数据,发现连接数使用率经常在 80%-90% 之间波动
  2. 分析业务高峰期,发现连接数使用率峰值可达 95%,但持续时间短
  3. 检查应用连接池配置,发现连接池大小设置合理

解决方案

  1. 调整连接数使用率告警阈值:

    • 警告阈值:> 85%(持续 5 分钟)
    • 重要阈值:> 92%(持续 2 分钟)
    • 紧急阈值:> 97%(持续 1 分钟)
  2. 增加持续时间条件,避免瞬时波动触发告警

  3. 优化告警通知方式,不同级别使用不同通知渠道

优化效果

  • 告警数量减少 60%
  • 误告警率降低 80%
  • 运维人员专注于真正需要处理的告警
  • 告警处理效率提高 50%

案例 2:复制延迟告警优化

问题描述

某主从复制架构中,从库经常出现复制延迟告警,但实际延迟时间较短,不影响业务。

分析过程

  1. 查看复制延迟历史数据,发现延迟主要发生在业务高峰期
  2. 分析主库写入情况,发现高峰期有大量批量写入
  3. 检查从库配置,发现从库配置较低

解决方案

  1. 调整复制延迟告警阈值:

    • 警告阈值:> 60秒(持续 2 分钟)
    • 重要阈值:> 120秒(持续 1 分钟)
    • 紧急阈值:> 300秒(持续 1 分钟)
  2. 优化从库配置,增加从库资源

  3. 启用并行复制,提高从库复制效率

  4. 调整主库批量写入策略,分散写入压力

优化效果

  • 复制延迟告警数量减少 70%
  • 从库复制效率提高 50%
  • 业务高峰期复制延迟降低 60%
  • 运维人员工作量减少 40%

常见问题(FAQ)

Q1: 如何确定合适的告警阈值?

A1: 确定合适的告警阈值需要考虑:

  • 历史数据和业务基线
  • 业务重要性和 SLA 要求
  • 行业最佳实践
  • 系统资源和容量
  • 运维团队的响应能力

Q2: 如何避免告警风暴?

A2: 避免告警风暴的方法:

  • 合并相关告警
  • 设置告警抑制规则
  • 按维度分组告警
  • 维护窗口设置告警静默
  • 使用智能告警算法

Q3: 如何处理误告警?

A3: 处理误告警的方法:

  • 调整告警阈值,增加持续时间条件
  • 使用复合条件告警
  • 分析误告警原因,优化告警规则
  • 收集运维人员反馈,持续改进

Q4: 如何设置动态告警阈值?

A4: 设置动态告警阈值的方法:

  • 根据时间动态调整(如业务高峰期和低谷期)
  • 根据业务量动态调整
  • 使用机器学习算法自动学习基线
  • 结合趋势分析调整阈值

Q5: 如何评估告警效果?

A5: 评估告警效果的指标:

  • 告警准确率:正确告警数/总告警数
  • 告警覆盖率:覆盖的异常场景比例
  • 告警及时性:告警触发到问题发生的时间差
  • 告警处理时间:从告警触发到问题解决的时间
  • 误告警率:误告警数/总告警数

Q6: 如何优化告警通知方式?

A6: 优化告警通知方式的方法:

  • 根据告警级别选择不同通知方式
  • 重要告警使用多种通知方式
  • 考虑不同时间段的通知方式
  • 建立告警升级机制
  • 提供告警详情和处理建议

Q7: 如何建立告警处理流程?

A7: 建立告警处理流程的步骤:

  1. 定义告警级别和响应时间
  2. 制定不同级别的处理流程
  3. 明确各角色的职责
  4. 建立告警升级机制
  5. 记录和分析告警处理过程
  6. 持续优化处理流程

Q8: 如何定期优化告警阈值?

A8: 定期优化告警阈值的方法:

  • 每月回顾告警数据
  • 分析告警触发情况和处理效果
  • 收集运维人员反馈
  • 考虑业务变化和系统升级
  • 重新评估告警阈值设置

Q9: 如何使用监控工具设置告警?

A9: 使用监控工具设置告警的步骤:

  1. 选择合适的监控工具(Zabbix、Prometheus 等)
  2. 配置监控指标采集
  3. 设置告警规则和阈值
  4. 配置告警通知方式
  5. 测试告警触发和通知
  6. 上线后持续优化

Q10: 如何处理大量告警?

A10: 处理大量告警的方法:

  • 优化告警规则,减少误告警
  • 合并相关告警,减少告警数量
  • 建立告警优先级机制
  • 自动化处理部分告警
  • 增加运维人员或使用告警平台