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;
命令解释
- status 为 ONLINE 表示健康,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 故障触发时抑制代理层派生告警。
排错练习(可操作)#
- 连接池耗尽演练
- 手动将后端max_connections调低,观察ConnERR增长。 - 规则未生效演练
- 修改mysql_query_rules不执行LOAD,观察路由命中不变。 - 后端故障演练
- 下线一台后端节点,验证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 指标与日志建立问题链路追踪。
- 定期演练故障切换与规则回滚,验证告警有效性。