14.2.6 监控与统计子系统
监控与统计子系统是 ProxySQL 运维可观测性的核心,负责采集连接、会话、路由、后端健康、SQL 性能与缓存命中等指标,并通过管理端口暴露统计表供查询分析。它与调度、连接池、路由引擎深度耦合,既提供实时运行态数据,也沉淀历史统计用于容量规划与故障定位。
原理草图(数据流与统计出口):
核心统计维度与关键表(按运维场景划分):
- 连接与会话:stats_mysql_connections、stats_mysql_processlist
- 后端健康与延迟:stats_mysql_connection_pool、stats_mysql_connection_pool_reset
- SQL 摘要与耗时:stats_mysql_query_digest、stats_mysql_query_rules
- 路由与规则命中:stats_mysql_query_rules、stats_mysql_query_rules_fast_routing
- 错误与告警:stats_mysql_errors、stats_mysql_global
1)管理端口查询示例(含命令解释)#
前提:管理端口默认 6032,用户名/密码为 admin/admin(以实际配置为准)。
# 进入 ProxySQL 管理端口
mysql -h 127.0.0.1 -P 6032 -u admin -padmin
查询连接与线程状态:
-- 查看前端连接与线程使用情况
SELECT * FROM stats_mysql_connections;
-- 查看前端会话列表(类似 MySQL processlist)
SELECT * FROM stats_mysql_processlist LIMIT 10;
查询后端节点健康与延迟:
-- 查看后端连接池状态、延迟、可用性
SELECT hostgroup, srv_host, status, ConnUsed, ConnFree, Latency_us
FROM stats_mysql_connection_pool
ORDER BY hostgroup, srv_host;
查询 SQL 摘要与慢查询:
-- Top SQL 按平均耗时排序(注意 digest_text 可能很长)
SELECT digest_text, count_star, sum_time, avg_time
FROM stats_mysql_query_digest
ORDER BY avg_time DESC
LIMIT 5;
查看规则命中率:
-- 规则命中统计,查看是否存在路由偏斜
SELECT rule_id, hits, applied
FROM stats_mysql_query_rules
ORDER BY hits DESC;
预期效果说明:
- stats_mysql_connections 能反映当前连接数与线程使用率。
- stats_mysql_connection_pool 中 status=ONLINE 代表后端健康。
- stats_mysql_query_digest 的 avg_time 升高提示慢查询或后端压力。
2)采样与聚合策略示例(降低统计开销)#
将聚合周期与采样策略写入配置(以 admin 端更新运行时为例):
-- 查看当前变量
SELECT variable_name, variable_value
FROM global_variables
WHERE variable_name IN ('mysql-query_digest_sampling', 'mysql-query_digest_interval');
-- 设置采样比例(例如 1/10)与聚合周期(秒)
UPDATE global_variables SET variable_value='10'
WHERE variable_name='mysql-query_digest_sampling';
UPDATE global_variables SET variable_value='60'
WHERE variable_name='mysql-query_digest_interval';
-- 加载到运行时并保存
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
说明:
- mysql-query_digest_sampling 值越大采样越少,降低开销。
- mysql-query_digest_interval 控制摘要刷新周期。
3)对接外部监控示例(导出指标)#
可通过管理端口定时拉取并输出为 Prometheus 格式(示例脚本):
#!/usr/bin/env bash
# /opt/proxysql_exporter/proxysql_stats.sh
# 简单导出:连接数与后端延迟
MYSQL_ADMIN="mysql -h 127.0.0.1 -P 6032 -u admin -padmin -N -e"
conn=$($MYSQL_ADMIN "SELECT COUNT(*) FROM stats_mysql_connections;")
lat=$($MYSQL_ADMIN "SELECT IFNULL(AVG(Latency_us),0) FROM stats_mysql_connection_pool WHERE status='ONLINE';")
cat <<EOF
# HELP proxysql_connections_total Total frontend connections
# TYPE proxysql_connections_total gauge
proxysql_connections_total $conn
# HELP proxysql_backend_latency_us Average backend latency in microseconds
# TYPE proxysql_backend_latency_us gauge
proxysql_backend_latency_us $lat
EOF
运行与验证:
chmod +x /opt/proxysql_exporter/proxysql_stats.sh
/opt/proxysql_exporter/proxysql_stats.sh
4)常见排错清单与命令#
-
统计表为空或更新慢
- 原因:采样关闭、聚合周期过长、未写入运行时
- 排查:
sql SELECT variable_name, variable_value FROM global_variables WHERE variable_name LIKE 'mysql-query_digest%'; -
后端全部显示
SHUNNED
- 原因:后端不可达或健康检查失败
- 排查:
sql SELECT hostgroup, srv_host, status, error FROM stats_mysql_connection_pool; -
规则命中为 0
- 原因:规则未加载到运行时
- 排查:
sql SELECT rule_id, hits, applied FROM stats_mysql_query_rules; SELECT * FROM mysql_query_rules; -- 如果已修改规则,需执行 LOAD MYSQL QUERY RULES TO RUNTIME; SAVE MYSQL QUERY RULES TO DISK;
5)练习题(含验证命令)#
-
统计 Top 5 慢 SQL,并找出所属主机组
- 提示:stats_mysql_query_digest与stats_mysql_query_rules联合分析
- 验证命令:
sql SELECT digest_text, avg_time FROM stats_mysql_query_digest ORDER BY avg_time DESC LIMIT 5; -
检查读写分离是否按预期生效
- 要求:写请求命中写库主机组,读请求命中读库主机组
- 验证命令:
sql SELECT rule_id, hits, applied FROM stats_mysql_query_rules ORDER BY hits DESC; -
调整采样比例并观察摘要记录数量变化
- 步骤:修改mysql-query_digest_sampling、执行 1 分钟压测
- 验证命令:
sql SELECT COUNT(*) FROM stats_mysql_query_digest;