14.2.2 核心线程与模块分工
ProxySQL 采用多线程事件驱动模型,将连接接入、查询解析、路由决策、后端连接复用与统计采集拆分为独立模块,降低锁竞争并保持高并发下的可预测性。核心线程围绕“前端连接处理—路由与重写—后端连接池—结果回传”的主链路协作。
核心线程与模块分工如下(原理草图):
-
Listener/Acceptor 线程
监听前端与管理端口,完成握手并将连接分发给 worker。 -
I/O Worker 线程
处理读写事件、协议解析、查询生命周期管理,投递路由并回写结果。 -
Parser/Router 模块
解析 SQL,结合规则、用户属性与主机组状态完成路由/重写。 -
Backend Connection Pool 模块
管理后端连接池,连接复用、健康检测、超时回收与连接上限控制。 -
Multiplexing/Session 模块
多前端会话复用少量后端连接,隔离事务与会话状态。 -
Admin Thread/管理模块
处理管理端口命令,读写配置库并触发运行时重载。 -
Monitor/HealthCheck 线程
周期探测后端,更新主机组状态并触发故障切换。 -
Stats/Telemetry 模块
采集连接、路由命中率、延迟与健康指标供监控使用。
安装与最小可运行示例(用于观察线程与模块)#
以 Ubuntu 为例,安装并启用服务:
sudo apt update
sudo apt install -y proxysql
sudo systemctl enable --now proxysql
# 查看进程与线程
ps -ef | grep proxysql
pidof proxysql | xargs -I{} ps -T -p {} | head -n 10
管理端口默认 6032,连接后查询线程相关统计:
mysql -u admin -padmin -h 127.0.0.1 -P 6032 <<'SQL'
SHOW VARIABLES LIKE 'mysql-threads';
SHOW VARIABLES LIKE 'mysql-poll_timeout';
SELECT * FROM stats_mysql_processlist LIMIT 5;
SELECT * FROM stats_stats_mysql_global LIMIT 5;
SQL
示例输出解读:
- mysql-threads 表示 I/O Worker 线程数量。
- stats_mysql_processlist 可观察会话与线程分配情况。
核心线程与模块的配置示例#
在 /etc/proxysql.cnf 中设置线程数量并重载:
# /etc/proxysql.cnf
mysql-threads=8
mysql-max_connections=2048
mysql-poll_timeout=2000
应用并验证:
sudo systemctl restart proxysql
mysql -u admin -padmin -h 127.0.0.1 -P 6032 <<'SQL'
SHOW VARIABLES LIKE 'mysql-threads';
SQL
预期效果:mysql-threads 返回 8,I/O Worker 线程增加。
排错示例(高延迟与连接池拥塞)#
症状:请求延迟升高、连接池耗尽。
排查步骤:
# 1) 查看后端连接池使用率
mysql -u admin -padmin -h 127.0.0.1 -P 6032 <<'SQL'
SELECT hostgroup, srv_host, srv_port, status, ConnUsed, ConnFree, ConnOK
FROM stats_mysql_connection_pool;
SQL
# 2) 查看慢查询路由与规则命中
mysql -u admin -padmin -h 127.0.0.1 -P 6032 <<'SQL'
SELECT * FROM stats_mysql_query_rules LIMIT 5;
SELECT * FROM stats_mysql_query_digest ORDER BY sum_time DESC LIMIT 5;
SQL
常见原因与处理:
- ConnUsed 接近上限:增加后端连接上限或扩展后端实例。
- sum_time 很高:优化 SQL 或增加读写分离规则,减轻主库压力。
练习#
- 将
mysql-threads从 4 调整到 8,观察stats_mysql_processlist中线程变化。 - 设置一个简单规则,将 SELECT 发送到只读主机组,验证
stats_mysql_connection_pool的ConnUsed变化。 - 人为降低后端连接上限,观察连接池拥塞现象并记录指标变化。