14.2.2 核心线程与模块分工

ProxySQL 采用多线程事件驱动模型,将连接接入、查询解析、路由决策、后端连接复用与统计采集拆分为独立模块,降低锁竞争并保持高并发下的可预测性。核心线程围绕“前端连接处理—路由与重写—后端连接池—结果回传”的主链路协作。

核心线程与模块分工如下(原理草图):

文章图片
  1. Listener/Acceptor 线程
    监听前端与管理端口,完成握手并将连接分发给 worker。

  2. I/O Worker 线程
    处理读写事件、协议解析、查询生命周期管理,投递路由并回写结果。

  3. Parser/Router 模块
    解析 SQL,结合规则、用户属性与主机组状态完成路由/重写。

  4. Backend Connection Pool 模块
    管理后端连接池,连接复用、健康检测、超时回收与连接上限控制。

  5. Multiplexing/Session 模块
    多前端会话复用少量后端连接,隔离事务与会话状态。

  6. Admin Thread/管理模块
    处理管理端口命令,读写配置库并触发运行时重载。

  7. Monitor/HealthCheck 线程
    周期探测后端,更新主机组状态并触发故障切换。

  8. 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 或增加读写分离规则,减轻主库压力。


练习#

  1. mysql-threads 从 4 调整到 8,观察 stats_mysql_processlist 中线程变化。
  2. 设置一个简单规则,将 SELECT 发送到只读主机组,验证 stats_mysql_connection_poolConnUsed 变化。
  3. 人为降低后端连接上限,观察连接池拥塞现象并记录指标变化。