14.4.3 前端与后端用户映射

前端与后端用户映射#

前端与后端用户映射用于将客户端账号与真实 MySQL 账号绑定,控制默认主机组、权限与会话行为,避免直接暴露后端账号。

原理草图(前端→ProxySQL→后端)

文章图片

连接与准备(示例环境)

# 连接 ProxySQL 管理端(默认 6032)
mysql -u admin -padmin -h 127.0.0.1 -P 6032

# 连接 ProxySQL 前端端口(默认 6033)
mysql -u app_user -ppwd123 -h 127.0.0.1 -P 6033

映射配置示例(前端到后端用户)

-- 1) 准备后端主机组
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight)
VALUES
(10,'10.0.0.11',3306,100),
(10,'10.0.0.12',3306,100);

-- 2) 前端用户映射(同名映射)
INSERT INTO mysql_users(username,password,default_hostgroup,transaction_persistent,active)
VALUES('app_user','pwd123',10,1,1);

-- 3) 前端用户映射(统一代理用户场景)
INSERT INTO mysql_users(username,password,default_hostgroup,backend_user,backend_password,active)
VALUES('report_user','rpt123',10,'proxy_ro','ro_pwd',1);

-- 4) 生效与持久化
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;

命令解释
- default_hostgroup:前端用户默认路由到的后端组。
- transaction_persistent=1:事务期间绑定同一后端连接,避免跨节点读写不一致。
- backend_user/backend_password:将前端用户映射为指定后端账号。

验证与效果

-- 在管理端检查映射生效
SELECT username,default_hostgroup,backend_user,transaction_persistent
FROM runtime_mysql_users;

-- 在前端连接进行验证(客户端执行)
SELECT @@hostname, USER();

预期效果:USER() 为前端用户,@@hostname 指向主机组内某个 MySQL 节点。

常见排错

-- 认证失败:检查 runtime 中是否存在用户
SELECT * FROM runtime_mysql_users WHERE username='app_user';

-- 路由异常:检查 hostgroup 是否存在与可用
SELECT hostgroup_id,hostname,status FROM runtime_mysql_servers;

-- 会话不一致:检查是否启用事务持久化
SELECT username,transaction_persistent
FROM runtime_mysql_users WHERE username='app_user';
  • Access denied:确认前端密码是否与 mysql_users 中一致,后端账号权限是否存在。
  • 若路由到错误节点:核对 default_hostgroupmysql_servershostgroup_id 是否一致。
  • 若事务跨节点:设置 transaction_persistent=1 并重新加载配置。

练习
1. 新建前端用户 bi_user,映射到后端账号 bi_ro,默认主机组 20。
2. 将 bi_usertransaction_persistent 关闭后进行事务读写测试,观察是否出现跨节点执行。
3. 删除 bi_user 后,重新加载并验证无法登录。