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 看到的内容 maindiskstatsmonitor(配置表) xzsmysqlinformation_schema(真实数据) xzsmysqlinformation_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 |
+-----+---------------+-------------------------------------+

关键讲解:这里看到的是 maindiskstatsmonitor不是真实的业务数据库。这是管理端。

6.2 连接 ProxySQL 业务端(6033)

mysql -u liulaoshi -p123456 -h 192.168.1.213 -P 6033
-- 查看业务端的数据库列表(显示真实数据库)
SHOW DATABASES;

预期输出:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| xzs                |   ← 考试系统真实业务库
+--------------------+

关键讲解:这里看到的是 xzsmysql 等真实数据库,说明已经进入了业务端。

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 登录,看到的是真实数据,绕过 ProxySQL
  • SHOW DATABASES 是快速区分管理端和业务端的方法
    • 看到 main/disk/stats/monitor → 管理端
    • 看到 xzs/mysql/information_schema → 业务端
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐