ProxySQL 3.0.11/3.1.11/4.0.11:字面量用户变量不再钉死 hostgroup,caching_sha2_password 补齐 RSA 认证
项目地址:
三个发布通道(Stable / Innovative / AI)于 2026-08-27 一同发布,官方博客日期为 9 月 5 日。大部分维护性修复升级后是透明的;3.0 新增的两条路由特性——字面量用户变量跟踪和从 OK 包学习 GTID——需要显式打开。要升到 3.1.11 或 4.0.11 的环境,还需要在灰度前检查凭据作用域拆分、已有的 require_x509 属性以及 MCP 的认证配置。
字面量用户变量保持可复用(3.0.11)
应用常用 SET @request_id = 1234 这类简单赋值往会话里塞请求元数据。ProxySQL 以前对用户变量活动一律保守处理:把会话绑定到某个 hostgroup。这样正确性有保障,但值只是字面量、ProxySQL 完全能安全复现时,连接复用也被一并牺牲掉了。
新增的 mysql-user_variable_tracking 是 opt-in 的。后端接受完整 SET 语句之后,ProxySQL 记录受支持的字面量赋值;后续查询被发到另一条池化后端连接时,只重放缺失或已变更的值,再转发应用查询。已有对应状态的后端会被优先选中,避免不必要的重放。
能力边界是刻意收窄的:支持字符串、数字、十六进制与 bit 字面量以及 NULL;表达式、函数、变量引用、预处理语句,以及系统变量/用户变量混合的赋值,仍走原来的安全回退。跟踪默认关闭,mode 1 需要 mysql-set_parser_algorithm=3 或 mysql-query_processor_parser=1。
-- SET 语句解析走 ParserSQL
SET mysql-set_parser_algorithm = 3;
-- mode 1 也可改用 mysql-query_processor_parser = 1
SET mysql-user_variable_tracking = 1;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
caching_sha2_password 的 RSA 完整认证(3.1.11)
非 TLS 的 MySQL 客户端现在可以通过标准 RSA 交换完成 caching_sha2_password 的完整认证。既支持用 --get-server-public-key 向 ProxySQL 索取公钥的客户端,也支持用 --server-public-key-path 固定公钥的客户端。运维侧可以用自动生成的 RSA-2048 密钥,也可以提供经过校验的密钥文件。
密钥加载是原子的:每次认证交换都持有一份不可变的密钥快照,因此轮换期间正在进行的登录不会出现「拿到的是旧公钥、解密用的是新私钥」的情况。RSA 保护的是密码交换这一段,不覆盖会话其余部分,TLS 仍是推荐做法。
同一版本还带来:前端接受 MariaDB client_ed25519 凭据、按用户配置的证书策略(可要求指定用户必须出示已验证的客户端证书)、以及独立的 Admin 凭据。
认证与凭据加固(3.0.11)
- 原生密码与
caching_sha2_password的比对在定长读取前先校验响应长度,畸形报文不再造成越界访问。 - MySQL 与 PostgreSQL 握手改用 OpenSSL
RAND_bytes取随机数,随机源失败时干净中止。 - 当
mysql-default_authentication_plugin=caching_sha2_password时,监控账号的凭据可以正常工作。 - 后端连接支持 MariaDB
client_ed25519,前提是 ProxySQL 持有向上游认证所需的明文密码。
兼容性、诊断与可移植性(3.0.11)
- Admin 接口接受会话级的
autocommit、NET_READ_TIMEOUT、NET_WRITE_TIMEOUT赋值,当前 MySQL 连接器和mysqldump依赖这些。 - MySQL 客户端连接属性被保留下来,通过
stats_mysql_processlist.extended_info中的client.connect_attrs暴露。 - 后端走 Unix socket 时,Fast Forward 连接保持压缩开启。
- PostgreSQL 的 kill 操作在
pg_terminate_backend()完成后关闭临时后端连接。 - 通用 Linux tarball 现在自带所需的 OpenSSL 运行时,并统一用
bin/proxysql启动。包在多个发行版以及 amd64、arm64 上做过冒烟测试。 - FreeBSD 的文件描述符记账改用平台原生接口。
3.1.11 与 4.0.11
3.1.11(Innovative)包含 3.0.11 的全部改进,外加前面提到的现代前端认证、更精确的 Fast Forward Traffic Observer(FFTO)统计,以及更可靠的时序指标存储。
4.0.11(Plugin Chassis / AI 层)包含 Stable 与 Innovative 的全部改动,并更新 GenAI 插件的可靠性、MCP 端点、RAG 与向量工具、运行时配置重载、共享 TSDB 指标存储。
升级前检查
mysql-user_variable_tracking与mysql-update_gtid_from_ok默认都关闭,分别开启、分别验证,不要一起打开。- 通用 Linux tarball 一律用包内的
bin/proxysql启动,保证捆绑的 OpenSSL 库路径生效。 - 3.1.11 / 4.0.11 上,
LOAD MYSQL USERS TO RUNTIME之前先核对mysql_users.attributes里的require_x509,避免把已上线用户意外挡在证书校验之外。 - 如果提供显式密钥文件,校验密钥归属、权限和轮换流程。
- 4.0.11 上逐个确认 MCP 端点的 bearer token 配置,并确认就绪探针客户端会带上对应凭据。
-- 升级前核对按用户的证书策略
SELECT username, attributes FROM mysql_users;
附:3.0.9 的相关背景
- 新增后端池会话调度器,用于连接池饱和场景。
- 引入 ParserSQL AST 解析器:
mysql-set_parser_algorithm=3把SET语句解析交给 ParserSQL;mysql-query_processor_parser=1把查询摘要生成、命令类型判定和SET解析一并交给它。 - 修正 MySQL 9.x 字符集变更后的 MariaDB 版本探测:把
SET NAMES utf8mb4 COLLATE utf8mb4_0900_ai_ci转发给 MariaDB 会得到ERROR 1273: Unknown collation。 - 修正未播种随机数生成器造成的后端负载分布不均。
- 设置
CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA能力位,使 Boost.MySQL 之类的客户端可以正常建立连接。