ProxySQL + MySQL MGR 完整演示文档
·
ProxySQL + MySQL MGR 完整演示文档
演示目标:在 213 节点(
192.168.1.213)创建liulaoshi用户,测试 ProxySQL 读写分离,并清晰区分管理端/业务端/MySQL 直连三种连接方式。
一、环境信息
| 项目 | 信息 |
|---|---|
| MySQL MGR 主节点 | 192.168.1.213:3306 |
| ProxySQL 节点 | 192.168.1.213:6032(管理端)、6033(业务端) |
| 演示用户 | liulaoshi |
| 密码 | 123456 |
二、核心概念:三个“端”的区别(必讲)
给学员演示前,先讲清楚这张表:
| 项目 | ProxySQL 管理端 | ProxySQL 业务端 | MySQL 直连 |
|---|---|---|---|
| 端口 | 6032 |
6033 |
3306 |
| 登录用户 | admin |
liulaoshi(业务用户) |
liulaoshi(业务用户) |
| 用途 | 配置 ProxySQL 规则 | 通过 ProxySQL 操作数据 | 绕过 ProxySQL 直连数据库 |
SHOW DATABASES 看到的内容 |
main、disk、stats、monitor(配置表) |
xzs、mysql、information_schema(真实数据) |
xzs、mysql、information_schema(真实数据) |
| 能否看到业务数据 | ❌ 不能 | ✅ 能 | ✅ 能 |
| 能否改 ProxySQL 配置 | ✅ 能 | ❌ 不能 | ❌ 不能 |
一句话总结:
- 管理端(6032) = 配置 ProxySQL 的地方,看到的是配置表
- 业务端(6033) = 使用数据库的地方,看到的是真实数据(经 ProxySQL 路由)
- 直连(3306) = 绕过 ProxySQL,直接操作 MySQL
三、在 MySQL 主库(213)创建 liulaoshi 用户
3.1 登录 MySQL 主库
mysql -u root -p -h 192.168.1.213 -P 3306
3.2 创建用户并授权
-- 创建用户(使用 mysql_native_password,确保与 ProxySQL 兼容)
CREATE USER 'liulaoshi'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-- 授予所有权限
GRANT ALL PRIVILEGES ON *.* TO 'liulaoshi'@'%' WITH GRANT OPTION;
-- 刷新权限
FLUSH PRIVILEGES;
3.3 验证用户创建成功
SELECT user, host, plugin FROM mysql.user WHERE user='liulaoshi';
预期输出:
+-----------+------+-----------------------+
| user | host | plugin |
+-----------+------+-----------------------+
| liulaoshi | % | mysql_native_password |
+-----------+------+-----------------------+
四、在 ProxySQL 中添加 liulaoshi 用户
4.1 登录 ProxySQL 管理端
注意:管理端只能本地登录(127.0.0.1)。
mysql -u admin -padmin -h 127.0.0.1 -P 6032
4.2 插入用户配置
-- 先删除可能存在的旧记录(保证干净)
DELETE FROM mysql_users WHERE username = 'liulaoshi';
-- 插入用户(frontend=1 和 frontend=0 两条都要)
-- 前端认证(客户端 → ProxySQL)
INSERT INTO mysql_users(username, password, default_hostgroup, active, frontend, backend)
VALUES ('liulaoshi', '123456', 10, 1, 1, 0);
-- 后端认证(ProxySQL → MySQL)
INSERT INTO mysql_users(username, password, default_hostgroup, active, frontend, backend)
VALUES ('liulaoshi', '123456', 10, 1, 0, 1);
-- 加载到运行环境
LOAD MYSQL USERS TO RUNTIME;
-- 保存到磁盘
SAVE MYSQL USERS TO DISK;
4.3 验证用户配置成功
SELECT username, default_hostgroup, active, frontend, backend
FROM runtime_mysql_users WHERE username = 'liulaoshi';
预期输出(两条记录,一条 frontend=1,一条 frontend=0):
+-----------+-------------------+--------+----------+---------+
| username | default_hostgroup | active | frontend | backend |
+-----------+-------------------+--------+----------+---------+
| liulaoshi | 10 | 1 | 1 | 0 |
| liulaoshi | 10 | 1 | 0 | 1 |
+-----------+-------------------+--------+----------+---------+
为什么有两条记录?
frontend=1, backend=0:客户端连接 ProxySQL 时认证用frontend=0, backend=1:ProxySQL 连接后端 MySQL 时认证用- 两条缺一不可,少一条都会导致连接失败
五、测试与验证命令
5.1 测试 ProxySQL 业务端(6033)
# 通过 ProxySQL 业务端口连接
mysql -u liulaoshi -p123456 -h 192.168.1.213 -P 6033 -e "SELECT 1;"
预期输出:
+---+
| 1 |
+---+
| 1 |
+---+
5.2 测试 MySQL 直连(3306)
# 绕过 ProxySQL,直连 MySQL
mysql -u liulaoshi -p123456 -h 192.168.1.213 -P 3306 -e "SELECT 1;"
预期输出: 同上,都能正常返回 1。
六、学员演示:三种连接方式的对比
6.1 连接 ProxySQL 管理端(6032)
mysql -u admin -padmin -h 127.0.0.1 -P 6032
-- 查看管理端的数据库列表(显示配置库,不是业务数据)
SHOW DATABASES;
预期输出:
+-----+---------------+-------------------------------------+
| seq | name | file |
+-----+---------------+-------------------------------------+
| 0 | main | |
| 2 | disk | /var/lib/proxysql/proxysql.db |
| 3 | stats | |
| 4 | monitor | |
| 5 | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
关键讲解:这里看到的是 main、disk、stats、monitor,不是真实的业务数据库。这是管理端。
6.2 连接 ProxySQL 业务端(6033)
mysql -u liulaoshi -p123456 -h 192.168.1.213 -P 6033
-- 查看业务端的数据库列表(显示真实数据库)
SHOW DATABASES;
预期输出:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| xzs | ← 考试系统真实业务库
+--------------------+
关键讲解:这里看到的是 xzs、mysql 等真实数据库,说明已经进入了业务端。
6.3 连接 MySQL 直连(3306)
mysql -u liulaoshi -p123456 -h 192.168.1.213 -P 3306
-- 查看直连的数据库列表
SHOW DATABASES;
预期输出: 与业务端看到的类似(真实的数据库列表)。
关键讲解:直连和业务端看到的都是真实数据,但业务端的数据经过了 ProxySQL 的读写分离规则,直连则不经过任何代理。
七、验证 ProxySQL 读写分离(演示用)
7.1 查看当前连接到了哪个 MySQL 节点
在 业务端(6033) 执行:
SELECT @@hostname, @@port;
- 如果是普通
SELECT,会被路由到读组(可能是 213/214/215 中的任一从节点) - 如果执行
SELECT @@hostname FOR UPDATE,会被路由到写组(主节点 213)
7.2 对比演示
-- 普通 SELECT(走读组,可能连接到从节点)
SELECT @@hostname, @@port;
-- 带 FOR UPDATE 的 SELECT(走写组,一定连接到主节点)
SELECT @@hostname, @@port FOR UPDATE;
-- INSERT 操作(走写组,一定连接到主节点)
CREATE DATABASE IF NOT EXISTS test;
通过 @@hostname 的返回值变化,可以直观展示读写分离的效果。
八、常用排错命令汇总
8.1 管理端常用排错
-- 查看所有后端服务器状态
SELECT hostgroup_id, hostname, port, status
FROM runtime_mysql_servers;
-- 查看当前 MGR 拓扑
SELECT * FROM runtime_mysql_group_replication_hostgroups;
-- 查看用户配置(是否有 frontend/backend)
SELECT username, default_hostgroup, active, frontend, backend
FROM runtime_mysql_users;
-- 查看监控连接日志(排查认证失败)
SELECT * FROM monitor.mysql_server_connect_log
ORDER BY time_start_us DESC LIMIT 10;
-- 查看监控 ping 日志(排查网络问题)
SELECT * FROM monitor.mysql_server_ping_log
ORDER BY time_start_us DESC LIMIT 10;
8.2 业务端常用排错
-- 查看当前连接到了哪个 MySQL 节点
SELECT @@hostname, @@port;
-- 查看当前数据库
SELECT DATABASE();
-- 查看业务表是否存在
SHOW TABLES FROM xzs;
8.3 MySQL 直连常用排错
-- 查看 MGR 集群状态
SELECT member_host, member_state, member_role
FROM performance_schema.replication_group_members;
-- 查看 GTID 执行情况
SELECT @@GLOBAL.gtid_executed;
-- 查看节点是否只读
SHOW VARIABLES LIKE 'super_read_only';
九、完整命令速查卡
| 目的 | 命令 |
|---|---|
| 连接管理端 | mysql -u admin -padmin -h127.0.0.1 -P6032 |
| 连接业务端 | mysql -u liulaoshi -p123456 -h192.168.1.213 -P6033 |
| 直连 MySQL | mysql -u liulaoshi -p123456 -h192.168.1.213 -P3306 |
| 查看管理端数据库 | SHOW DATABASES; → 显示 main/disk/stats/monitor |
| 查看业务端数据库 | SHOW DATABASES; → 显示 xzs/mysql/information_schema |
| 查看当前节点 | SELECT @@hostname; |
| 验证读写分离 | SELECT @@hostname FOR UPDATE; |
十、总结
- 管理端(6032):用
admin登录,看到的是配置表,用来配规则- 业务端(6033):用
liulaoshi登录,看到的是真实数据,经过 ProxySQL 路由- 直连(3306):用
liulaoshi登录,看到的是真实数据,绕过 ProxySQLSHOW DATABASES是快速区分管理端和业务端的方法:
- 看到
main/disk/stats/monitor→ 管理端- 看到
xzs/mysql/information_schema→ 业务端
更多推荐



所有评论(0)