14.2.1 ProxySQL整体架构与数据流

ProxySQL整体架构与数据流#

ProxySQL位于应用与后端MySQL之间,采用多线程事件驱动模型,将连接管理、路由决策、查询重写、健康检查与统计监控集中在代理层。本节通过架构草图、数据流示例、关键命令与排错演练,明确各组件职责与请求流向。

整体架构原理草图(简化)

文章图片

数据流动路径(步骤化)
1. 连接建立:应用连接ProxySQL数据库端口,完成用户认证与会话初始化。
2. SQL解析:解析SQL语句并计算指纹。
3. 规则匹配:按规则决定路由/重写/读写分离。
4. 连接复用:从目标主机组连接池取后端连接执行SQL。
5. 结果返回:响应返回客户端,统计指标写入内存/统计表。


示例:最小可运行数据流验证#

1)准备:启动ProxySQL并登录管理端口

# 1. 启动服务
systemctl start proxysql
systemctl status proxysql --no-pager

# 2. 登录管理端口(默认6032)
mysql -u admin -padmin -h 127.0.0.1 -P 6032

预期效果:进入proxysql>管理端会话。

2)配置后端主机组与账户(完整可执行示例)

-- 管理端执行
INSERT INTO mysql_servers(hostgroup_id, hostname, port, weight, max_connections)
VALUES
(10, '10.0.0.11', 3306, 1, 200),   -- 主库
(20, '10.0.0.12', 3306, 1, 200),   -- 从库1
(20, '10.0.0.13', 3306, 1, 200);   -- 从库2

INSERT INTO mysql_users(username, password, default_hostgroup, transaction_persistent)
VALUES ('appuser', 'appPass', 10, 1);

LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;

预期效果:后端连接池建立,用户可通过ProxySQL连接后端。

3)配置读写分离规则

-- 把SELECT路由到只读主机组20,其余到默认主机组10
INSERT INTO mysql_query_rules(rule_id, active, match_digest, destination_hostgroup, apply)
VALUES (100, 1, '^SELECT .*', 20, 1);

LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

预期效果:SELECT走20组,从库;非SELECT走10组主库。

4)应用侧验证数据流

# 连接数据库端口(默认6033)
mysql -u appuser -pappPass -h 127.0.0.1 -P 6033 -e "SELECT @@hostname;"
mysql -u appuser -pappPass -h 127.0.0.1 -P 6033 -e "INSERT INTO t1(id) VALUES (1);"

预期效果
- SELECT @@hostname;返回从库主机名
- INSERT走主库

5)查看统计与路由结果

-- 查看命中规则与后端连接分布
SELECT * FROM stats_mysql_query_rules LIMIT 5;
SELECT hostgroup, srv_host, status, ConnUsed, ConnFree
FROM stats_mysql_connection_pool;

架构组件与职责对照#

  • 前端接入层(Frontend):连接、认证、会话、协议解析
  • 路由与规则引擎(Query Rules):读写分离、重写、限流、路由
  • 后端连接池(Backend Pools):连接复用、权重、健康状态
  • 配置与统计存储(SQLite + Memory):三库结构main/runtime/disk
  • 监控与管理接口(Admin/Stats):配置、统计、运维查询

关键命令解释(对照)#

-- 将配置写入运行时内存,使其立即生效
LOAD MYSQL SERVERS TO RUNTIME;

-- 将配置持久化到磁盘SQLite
SAVE MYSQL SERVERS TO DISK;

-- 查看当前运行时连接池状态
SELECT * FROM stats_mysql_connection_pool;

-- 查看规则命中统计
SELECT * FROM stats_mysql_query_rules;

常见排错(针对数据流)#

问题1:SELECT仍走主库

-- 检查规则是否生效
SELECT rule_id, active, match_digest, destination_hostgroup
FROM runtime_mysql_query_rules;

-- 检查规则优先级
SELECT rule_id, match_digest, destination_hostgroup, apply
FROM runtime_mysql_query_rules
ORDER BY rule_id;

修复方法:确保规则active=1,并且rule_id小的优先生效。

问题2:连接池无连接/状态OFFLINE

SELECT hostgroup, srv_host, status, ConnUsed, ConnFree, ConnOK, ConnERR
FROM stats_mysql_connection_pool;

修复方法:检查后端地址/账号/网络是否正确,必要时重载:

LOAD MYSQL SERVERS TO RUNTIME;

问题3:规则未持久化,重启丢失

-- 确认已保存到磁盘
SAVE MYSQL QUERY RULES TO DISK;
SAVE MYSQL SERVERS TO DISK;

练习(动手验证数据流)#

  1. 配置两个主机组(10主、20从),设置读写分离规则。
  2. 执行SELECTINSERT,查看stats_mysql_connection_poolConnUsed变化。
  3. 将从库下线(手动停止MySQL),观察ProxySQL连接池状态变化并记录日志。
  4. 添加一条SQL重写规则,例如把SELECT * FROM t改写成SELECT id FROM t,验证结果。