14.7.6 故障定位与告警策略

本节聚焦 ProxySQL 在生产环境中的故障定位流程与告警策略设计,建立“快速发现—精准定位—闭环处理”的运维体系,覆盖连接、路由、后端、性能与资源等关键维度,并提供可执行的排查与告警示例。

原理草图:故障定位链路#

文章图片

故障定位流程(含命令)#

1. 连接层快速检查#

  • 连接失败或连接池耗尽时,优先在 Admin 接口检查连接统计。
# 进入 ProxySQL Admin
mysql -uadmin -padmin -h 127.0.0.1 -P6032

# 查看连接统计
SELECT * FROM mysql_stats_connections\G

# 查看连接池状态
SELECT hostgroup, srv_host, ConnUsed, ConnFree, ConnOK, ConnERR, status
FROM stats_mysql_connection_pool;

命令解释
- mysql_stats_connections:统计连接数、错误数、活动连接。
- stats_mysql_connection_pool:连接池使用与后端节点状态。

2. 路由与规则排查#

  • 读写分离异常优先核对 runtime 规则与命中情况。
-- 查看配置与运行态是否一致
SELECT rule_id, active, match_pattern, destination_hostgroup 
FROM mysql_query_rules;

SELECT rule_id, active, match_pattern, destination_hostgroup 
FROM runtime_mysql_query_rules;

-- 查看命中次数与延迟
SELECT rule_id, hits, avg_time, sum_time 
FROM stats_mysql_query_rules
ORDER BY hits DESC;

命令解释
- runtime_mysql_query_rules:运行态规则,决定实时路由。
- stats_mysql_query_rules:规则命中统计,判断是否生效。

3. 后端节点健康与切换状态#

-- 查看后端实例状态
SELECT hostgroup_id, hostname, port, status, weight
FROM mysql_servers;

SELECT hostgroup_id, hostname, port, status, weight
FROM runtime_mysql_servers;

-- 连接池详细状态
SELECT hostgroup, srv_host, status, Current_Conn, Max_Conn, ConnERR
FROM stats_mysql_connection_pool;

命令解释
- statusONLINE 表示健康,OFFLINE_SOFT/HARD 表示不可用。
- ConnERR 过高提示健康检查异常或网络问题。

4. 性能与慢查询定位#

-- 查看慢查询与热点 SQL
SELECT digest, count_star, avg_time, sum_time
FROM stats_mysql_query_digest
ORDER BY avg_time DESC
LIMIT 10;

命令解释
- avg_time 高表示该类 SQL 平均耗时大。
- 结合后端实例监控判断瓶颈位置。

5. 配置未生效排查#

-- 修改规则后必须 LOAD+SAVE
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

-- 校验是否一致
SELECT COUNT(*) FROM mysql_query_rules;
SELECT COUNT(*) FROM runtime_mysql_query_rules;

命令解释
- LOAD 影响运行态,SAVE 落盘防止重启丢失。

常见故障场景与定位要点(示例)#

连接失败/连接池耗尽#

SELECT ConnUsed, ConnFree, Connection_errors
FROM mysql_stats_connections;
  • 判断ConnUsed 高且 ConnFree 低,或 Connection_errors 持续增长。
  • 处理:检查后端 max_connections,或扩容连接池。

读写分离异常#

SELECT rule_id, hits
FROM stats_mysql_query_rules
WHERE rule_id IN (100, 200);
  • 判断:读规则 hits 为 0 或写规则异常增多。
  • 处理:校验规则优先级与正则表达式。

后端节点异常未切换#

SELECT hostname, status, ConnERR
FROM stats_mysql_connection_pool
WHERE status <> 'ONLINE';
  • 判断:状态非 ONLINE 且错误计数增加。
  • 处理:检查监控用户权限、健康检查频率。

告警指标与阈值策略(Prometheus 示例)#

假设已接入 ProxySQL Exporter,并使用 Prometheus 采集。

# /etc/prometheus/rules/proxysql.rules.yml
groups:
- name: proxysql.rules
  rules:
  - alert: ProxySQLConnPoolHigh
    expr: proxysql_connection_pool_used / proxysql_connection_pool_size > 0.8
    for: 5m
    labels:
      severity: P2
    annotations:
      summary: "连接池占用率高"
      description: "连接池占用率超过 80% 持续 5 分钟"

  - alert: ProxySQLBackendDown
    expr: proxysql_backend_online < 2
    for: 1m
    labels:
      severity: P1
    annotations:
      summary: "后端节点不足"
      description: "ONLINE 节点数不足 2"

  - alert: ProxySQLQueryP95High
    expr: histogram_quantile(0.95, rate(proxysql_query_duration_bucket[5m])) > 0.2
    for: 3m
    labels:
      severity: P2
    annotations:
      summary: "P95 延迟过高"
      description: "P95 查询延迟超过 200ms"

命令解释
- proxysql_connection_pool_used/size:连接池占用率。
- proxysql_backend_online:后端在线节点数。
- proxysql_query_duration_bucket:查询延迟分布直方图。

告警分级与处理流程#

  • P1(高危):连接中断、所有后端不可用、请求大量失败。
  • 处理:立即切换/扩容/回滚配置。
  • P2(中危):性能下降、后端节点部分失效。
  • 处理:流量降级、剔除异常节点、优化查询。
  • P3(低危):资源趋势异常、命中率波动。
  • 处理:容量评估、策略优化。

告警抑制与收敛#

  • 去重与合并:同类告警在时间窗口内合并。
  • 维护窗口:变更期间自动降噪。
  • 依赖判断:后端 MySQL 故障触发时抑制代理层派生告警。

排错练习(可操作)#

  1. 连接池耗尽演练
    - 手动将后端 max_connections 调低,观察 ConnERR 增长。
  2. 规则未生效演练
    - 修改 mysql_query_rules 不执行 LOAD,观察路由命中不变。
  3. 后端故障演练
    - 下线一台后端节点,验证 ProxySQLBackendDown 告警触发。
# 示例:下线后端节点
mysql -uadmin -padmin -h 127.0.0.1 -P6032 -e "
UPDATE mysql_servers SET status='OFFLINE_SOFT'
WHERE hostname='10.0.0.11' AND port=3306;
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;"

运维建议#

  • 配置变更必须走“灰度—验证—全量”流程,并记录版本。
  • 结合 Prometheus 指标与日志建立问题链路追踪。
  • 定期演练故障切换与规则回滚,验证告警有效性。