ProxySQL需先确认主从复制稳定,否则读请求会发至延迟高的从库导致脏数据;连接管理界面用mysql -u admin -padmin -h 127.0.0.1 -P6032;后端节点通过mysql_servers表注册,写组hostgroup_id=10、读组=20;SELECT路由不到从库常因规则未生效或匹配逻辑错误,须用match_digest并排除FOR UPDATE;延迟控制依赖监控模块与query rules联动,ProxySQL仅标记延迟高从库为OFFLINE_SOFT,不自动剔除。

能直接用,但必须先确认主从复制已稳定运行,否则 ProxySQL 会把读请求发到延迟巨大的从库上,查到脏数据。
怎么连进 ProxySQL 管理界面?
ProxySQL 默认监听 6032 端口,用内置 admin 用户登录:
mysql -u admin -padmin -h 127.0.0.1 -P6032
如果连不上,检查 /etc/proxysql.cnf 中的 admin_credentials 是否被改过;若在 Docker 里跑,注意宿主机是否映射了 6032 端口;远程连接要确认防火墙放行该端口。
如何添加主库和从库节点?
所有后端 MySQL 实例必须通过 mysql_servers 表注册,hostgroup_id 是关键分组标识:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 写组(主库)建议固定用
10,例如:INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (10, '192.168.1.10', 3306); - 读组(从库)建议固定用
20,多个从库都填20,例如:INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, '192.168.1.11', 3306); - 务必执行
LOAD MYSQL SERVERS TO RUNTIME;和SAVE MYSQL SERVERS TO DISK;,否则配置不生效 - 别漏掉
weight字段——它影响负载均衡权重,不设默认为1,设成100可让某从库承接更多读流量
为什么 SELECT 路由不到从库?
常见原因是规则没生效或匹配逻辑不对。ProxySQL 支持两种匹配方式:match_digest(解析后 SQL 摘要)和 match_pattern(正则原始语句),二者不能混用:
- 用
match_digest更可靠,比如:INSERT INTO mysql_query_rules(rule_id, active, match_digest, destination_hostgroup, apply) VALUES (1, 1, '^SELECT', 20, 1); - 带
FOR UPDATE的语句必须单独兜底,否则会被误判为读请求:INSERT INTO mysql_query_rules(rule_id, active, match_digest, destination_hostgroup, apply) VALUES (2, 1, '^SELECT.*FOR UPDATE$', 10, 1); - 写操作规则要覆盖全:
'^INSERT|^UPDATE|^DELETE|^REPLACE|^CREATE|^ALTER|^DROP',漏掉REPLACE或DROP就可能路由错 - 规则加载后必须执行
LOAD MYSQL QUERY RULES TO RUNTIME;,否则只是存盘未运行
从库延迟高时怎么避免读到旧数据?
ProxySQL 本身不自动感知复制延迟,得靠监控模块 + 主机组联动:
- 先创建监控用户(如
monitor),并赋予REPLICATION CLIENT权限 - 启用监控:
UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-monitor_enabled'; - 配置主从关系:
INSERT INTO mysql_replication_hostgroups(writer_hostgroup, reader_hostgroup) VALUES (10, 20); - 关键:ProxySQL 不会自动把延迟超阈值的从库踢出,它只标记状态为
OFFLINE_SOFT;真正生效依赖查询规则里加条件,或靠后续人工干预 - 生产环境建议搭配
mysql-monitor_replication_lag_max变量设阈值(如1000毫秒),再配合脚本定期检查mysql_server_read_only和mysql_server_replication_lag表
最易被忽略的一点:即使配置了复制主机组,ProxySQL 也不会自动把延迟高的从库从 20 组剔除——它只是记录 lag 值,路由行为仍由 query rules 决定。想实现“延迟高就切主库”,得自己写规则或用外部健康检查驱动动态更新规则表。

















