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;
练习(动手验证数据流)#
- 配置两个主机组(10主、20从),设置读写分离规则。
- 执行
SELECT与INSERT,查看stats_mysql_connection_pool中ConnUsed变化。 - 将从库下线(手动停止MySQL),观察ProxySQL连接池状态变化并记录日志。
- 添加一条SQL重写规则,例如把
SELECT * FROM t改写成SELECT id FROM t,验证结果。