ProxySQL 是什么
ProxySQL 是高性能 MySQL 协议代理,工作在应用与数据库之间。它的模型是「后端主机组 + 查询规则」:把主库与从库分别放进主机组,再用规则决定什么语句去读组、什么语句去写组,从而实现不改应用代码的读写分离,同时提供连接复用、节点健康检查与故障摘除。配置存在它自带的 SQLite 库中,通过管理端口用 SQL 语句修改,改完要显式加载到运行时并保存到磁盘。
基本信息
| 核心模型 | hostgroup(写组 / 读组)+ mysql_query_rules 查询规则 |
|---|---|
| 管理端口 | 默认 6032,用 mysql 客户端即可登录管理 |
| 主要能力 | 读写分离、连接池复用、查询规则路由、后端健康检查、查询缓存(视版本与配置) |
| 配置生效 | LOAD ... TO RUNTIME 立即生效 + SAVE ... TO DISK 持久化 |
| 典型位置 | 应用与后端实例之间,常与主从复制配合 |
典型使用场景
- 读写分离:读语句自动路由到只读组,写语句固定发往写组
- 连接数收敛:前端几百个应用连接被复用到后端少量连接,降低数据库连接压力
- 故障摘除:后端实例不健康时自动从主机组中移出,避免持续打向坏节点
- 灰度分流:按库或按用户把部分流量导向新实例做验证
- SQL 级治理:对特定规则命中后的语句设置超时或路由到专用组
管理接口速览
管理接口速览
-- 用 mysql 客户端连管理端口 6032(不是业务端口)
SELECT * FROM mysql_servers; -- 后端实例清单
SELECT * FROM mysql_replication_hostgroups; -- 写组与读组映射
SELECT * FROM mysql_query_rules WHERE active=1; -- 生效中的路由规则
SELECT hostgroup, srv_host, status FROM runtime_mysql_servers; -- 运行时状态
-- 规则改完后必须显式生效与持久化
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;常用表读法
| 表 | 含义 | 注意 |
|---|---|---|
| mysql_servers | 磁盘上的后端实例配置 | 改这里只是改配置,不生效 |
| runtime_mysql_servers | 运行时实际使用的实例 | status 为 ONLINE 才接流量 |
| mysql_query_rules | 路由规则定义 | rule_id 越大越优先,顺序写错会误路由 |
| mysql_users | 代转发用的数据库账号 | 代理侧账号权限按需最小化 |
| stats_mysql_query_digest | 按语句模板聚合的统计 | 定位热点语句与路由效果 |
只改 mysql_* 表不会立即影响线上流量,必须 LOAD 到 runtime 才生效;反过来只 LOAD 不 SAVE,重启后配置回滚,行为突然变化。
代理不解析业务语义,规则匹配靠语句模板与正则。上规则前在测试环境用同一批语句验证命中情况,比在生产上试错安全得多。