6.10.2 告警策略设计与分级

告警策略设计与分级的目标是用最少的告警噪声覆盖最关键的业务风险,确保可感知、可定位、可处置。本节给出告警对象、分级原则、阈值设计、抑制与关联、值班响应与演练的完整方法,并包含可执行示例、安装、排错与练习。

一、告警体系原理与对象范围(含草图)
- 实例可用性:mysqld存活、端口连通、主从复制、仲裁状态。
- 性能与资源:QPS/TPS、响应时间、CPU/IO/内存、连接数、线程数、InnoDB命中率、IO等待。
- 容量与趋势:磁盘使用率、表空间膨胀、日志增长、备份库容量。
- 数据安全:复制延迟、GTID一致性、binlog丢失风险、备份失败、权限变更。
- 业务风险:错误率、慢查询比例、锁等待、死锁频率、事务回滚率。

文章图片

二、告警分级与定义(含示例落地)
- P1(致命):服务不可用或数据安全风险高,需立即响应与升级
例:主库宕机或不可写、复制链路断裂且无可用副本、磁盘写满停止写入。
- P2(严重):影响性能或业务部分不可用,需短时间处理
例:复制延迟持续、连接数打满、IO等待持续高、P95响应时间显著恶化。
- P3(一般):趋势性问题或轻微异常,需排期处理
例:磁盘使用率接近阈值、缓存命中率下降、索引失效风险提示。
- P4(提示):信息性告警或提醒
例:备份完成、主从切换完成、参数变更通知。

三、阈值设计方法与命令示例(含基线与容量法)
- 基线法:用历史分位数建立阈值(如P95+20%)。
- 容量法:按最大安全容量设置(磁盘80%告警、85%严重、90%致命)。
- 持续时间:避免瞬时抖动,要求持续N分钟触发。
- 多指标组合:IO高+响应时间高共同触发,降低误报。

示例:用SQL采集基础基线(QPS、慢查询比例)并生成阈值建议

-- 近1小时QPS和慢查询比例采样(示例)
SHOW GLOBAL STATUS LIKE 'Questions';
SHOW GLOBAL STATUS LIKE 'Slow_queries';
SHOW GLOBAL STATUS LIKE 'Uptime';
-- 计算QPS: Questions/Uptime

四、采集与告警安装示例(Prometheus + mysqld_exporter)
1) 安装mysqld_exporter(Linux)

# 下载与解压
cd /opt
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.0/mysqld_exporter-0.15.0.linux-amd64.tar.gz
tar -xzf mysqld_exporter-0.15.0.linux-amd64.tar.gz
ln -s /opt/mysqld_exporter-0.15.0.linux-amd64/mysqld_exporter /usr/local/bin/mysqld_exporter

# 创建低权限账号(仅采集)
mysql -uroot -p -e "CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'Export3r!';"
mysql -uroot -p -e "GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';"

# 配置采集账号
cat >/etc/.mysqld_exporter.cnf <<'EOF'
[client]
user=exporter
password=Export3r!
EOF
chmod 600 /etc/.mysqld_exporter.cnf

2) 配置systemd并启动

cat >/etc/systemd/system/mysqld_exporter.service <<'EOF'
[Unit]
Description=Prometheus MySQL Exporter
After=network.target mysql.service

[Service]
User=root
Environment=DATA_SOURCE_NAME=exporter:Export3r!@unix(/var/lib/mysql/mysql.sock)/
ExecStart=/usr/local/bin/mysqld_exporter --config.my-cnf=/etc/.mysqld_exporter.cnf --web.listen-address=:9104
Restart=always

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now mysqld_exporter
ss -lntp | grep 9104

3) Prometheus抓取配置示例(/etc/prometheus/prometheus.yml)

scrape_configs:
  - job_name: 'mysql'
    static_configs:
      - targets: ['10.0.0.10:9104','10.0.0.11:9104']

五、告警规则示例(分级、持续时间与组合)

# /etc/prometheus/rules/mysql_alerts.yml
groups:
- name: mysql.rules
  rules:
  - alert: MySQL_Instance_Down
    expr: up{job="mysql"} == 0
    for: 1m
    labels:
      severity: P1
    annotations:
      summary: "MySQL实例不可达"
      description: "实例{{ $labels.instance }} 无响应超过1分钟"

  - alert: MySQL_Replication_Lag
    expr: mysql_slave_status_seconds_behind_master > 300
    for: 10m
    labels:
      severity: P2
    annotations:
      summary: "复制延迟过高"
      description: "实例{{ $labels.instance }} 复制延迟超过300s持续10分钟"

  - alert: MySQL_Disk_Usage_High
    expr: (node_filesystem_size_bytes{mountpoint="/"}-node_filesystem_free_bytes{mountpoint="/"}) / node_filesystem_size_bytes{mountpoint="/"} > 0.85
    for: 10m
    labels:
      severity: P2
    annotations:
      summary: "磁盘使用率过高"
      description: "根分区使用率>85%持续10分钟"

  - alert: MySQL_Conn_Usage_High
    expr: mysql_global_status_threads_connected / mysql_global_variables_max_connections > 0.9
    for: 5m
    labels:
      severity: P2
    annotations:
      summary: "连接数接近上限"
      description: "连接占用超过90%持续5分钟"

  - alert: MySQL_SlowQuery_Ratio
    expr: rate(mysql_global_status_slow_queries[5m]) / rate(mysql_global_status_questions[5m]) > 0.05
    for: 5m
    labels:
      severity: P2
    annotations:
      summary: "慢查询比例过高"
      description: "慢查询比例超过5%持续5分钟"

六、告警抑制与关联(Alertmanager示例)

# /etc/alertmanager/alertmanager.yml
route:
  receiver: 'default'
  group_by: ['alertname','instance']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 2h
  routes:
  - match:
      severity: P1
    receiver: 'p1-oncall'
  - match:
      severity: P2
    receiver: 'p2-oncall'

inhibit_rules:
- source_match:
    alertname: MySQL_Instance_Down
  target_match_re:
    alertname: MySQL_.*
  equal: ['instance']

receivers:
- name: 'default'
- name: 'p1-oncall'
  webhook_configs:
  - url: 'http://im-gateway.local/notify'
- name: 'p2-oncall'
  webhook_configs:
  - url: 'http://im-gateway.local/notify'

七、值班响应与排错示例(Runbook片段)
- P1:实例不可达
1) 验证端口与进程
bash systemctl status mysqld ss -lntp | grep 3306 ping -c 2 10.0.0.10
2) 快速恢复
bash systemctl restart mysqld journalctl -u mysqld -n 100 --no-pager
3) 若磁盘满
bash df -h du -sh /var/lib/mysql/* # 清理binlog(示例谨慎执行) mysql -uroot -p -e "PURGE BINARY LOGS TO 'mysql-bin.000123';"

  • P2:复制延迟
    bash mysql -uroot -p -e "SHOW SLAVE STATUS\G" # 检查IO/SQL线程、Seconds_Behind_Master、错误码
    可能原因与动作:
  • SQL线程停止:查看 Last_SQL_Error,修复后 START SLAVE;
  • 主库压力高:检查慢查询与锁等待;
  • 网络抖动:检查链路、丢包。

八、典型故障排查清单(快速定位)

# 1. 资源是否瓶颈
top -b -n1 | head -20
iostat -x 1 3
free -m

# 2. MySQL状态与变量
mysql -uroot -p -e "SHOW GLOBAL STATUS LIKE 'Threads%';"
mysql -uroot -p -e "SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';"

# 3. 慢查询趋势
mysql -uroot -p -e "SHOW GLOBAL VARIABLES LIKE 'slow_query_log';"

九、演练与验证(告警闭环)
- 演练场景:主库宕机、磁盘满、复制中断、慢查询风暴。
- 演练验证:是否触发告警、是否正确分级、通知是否到达、处理时长是否符合SLA。

十、练习题(含操作要求)
1) 编写一条告警规则:磁盘使用率>90%持续2分钟触发P1,并在Alertmanager中抑制该实例的其他告警。
2) 使用SQL查询计算当前QPS与慢查询比例,给出合理的P2阈值建议。
3) 模拟复制延迟(可通过限制从库IO或停止SQL线程),验证告警是否按P2触发,并记录处理步骤与耗时。