14.2.6 监控与统计子系统

监控与统计子系统是 ProxySQL 运维可观测性的核心,负责采集连接、会话、路由、后端健康、SQL 性能与缓存命中等指标,并通过管理端口暴露统计表供查询分析。它与调度、连接池、路由引擎深度耦合,既提供实时运行态数据,也沉淀历史统计用于容量规划与故障定位。

原理草图(数据流与统计出口):

文章图片

核心统计维度与关键表(按运维场景划分):
- 连接与会话:stats_mysql_connectionsstats_mysql_processlist
- 后端健康与延迟:stats_mysql_connection_poolstats_mysql_connection_pool_reset
- SQL 摘要与耗时:stats_mysql_query_digeststats_mysql_query_rules
- 路由与规则命中:stats_mysql_query_rulesstats_mysql_query_rules_fast_routing
- 错误与告警:stats_mysql_errorsstats_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_poolstatus=ONLINE 代表后端健康。
- stats_mysql_query_digestavg_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)常见排错清单与命令#

  1. 统计表为空或更新慢
    - 原因:采样关闭、聚合周期过长、未写入运行时
    - 排查:
    sql SELECT variable_name, variable_value FROM global_variables WHERE variable_name LIKE 'mysql-query_digest%';

  2. 后端全部显示 SHUNNED
    - 原因:后端不可达或健康检查失败
    - 排查:
    sql SELECT hostgroup, srv_host, status, error FROM stats_mysql_connection_pool;

  3. 规则命中为 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)练习题(含验证命令)#

  1. 统计 Top 5 慢 SQL,并找出所属主机组
    - 提示:stats_mysql_query_digeststats_mysql_query_rules 联合分析
    - 验证命令:
    sql SELECT digest_text, avg_time FROM stats_mysql_query_digest ORDER BY avg_time DESC LIMIT 5;

  2. 检查读写分离是否按预期生效
    - 要求:写请求命中写库主机组,读请求命中读库主机组
    - 验证命令:
    sql SELECT rule_id, hits, applied FROM stats_mysql_query_rules ORDER BY hits DESC;

  3. 调整采样比例并观察摘要记录数量变化
    - 步骤:修改 mysql-query_digest_sampling、执行 1 分钟压测
    - 验证命令:
    sql SELECT COUNT(*) FROM stats_mysql_query_digest;