首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >解锁高并发!一步步教你用 ProxySQL 实现 MySQL 读写分离

解锁高并发!一步步教你用 ProxySQL 实现 MySQL 读写分离

作者头像
IT咸鱼
发布于 2025-05-25 06:50:00
发布于 2025-05-25 06:50:00
35400
代码可运行
举报
运行总次数:0
代码可运行

「一、写在前面:为什么要用 ProxySQL?」

  • 「性能提升」:让写入压力集中在主库,把查询压力分担给从库
  • 「高可用」:从库挂了能自动剔除,不影响主库服务
  • 「灵活路由:可按业务、按用户、按表做差异化路由

ProxySQL 是一款高性能、高可定制化的 MySQL 代理,支持读写分离、故障转移和查询缓存等功能,广泛用于大规模生产环境中。


「二、环境准备:先装好这些“法宝”」

  1. 服务器清单(已配置免密登录)」
    • master(192.168.0.10)
    • node1(192.168.0.11)
    • node2(192.168.0.12)
  2. 「已安装组件」
    • Docker
    • MySQL 容器(mysql:8.0)
    • 「master 上已安装 ProxySQL」
  3. 「网络及端口」
    • MySQL 3306 (node1、node2)
    • ProxySQL 6033(读写)、6032(管理)
    • 三台机器能相互 ping 通

「三、整体架构示意」

主库(master)通过 ProxySQL 暴露给应用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
应用 → ProxySQL(6033) → master(写)  

                       └→ node1/node2(读)  

ProxySQL 会根据我们配置的查询规则,把写操作转发给 master,把读操作发给其中一个从库。


「四、Step by Step 实操篇」

下面所有命令,「都在 master 机器上执行」。我们假设 master IP 为 192.168.0.10


「1. 进入 ProxySQL 管理界面」

ProxySQL 默认管理端口是 「6032」,使用 admin 用户(默认密码 admin)登录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql -u admin -padmin -h 127.0.0.1 -P6032

「提示」:如果报 “Access denied”,请检查 /etc/proxysql.cnfadmin_credentials配置。


「2. 注册后端 MySQL 实例(主从库)」

在管理界面里执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 清空已有配置(仅首次配置时可做)

DELETEFROM mysql_servers;



-- 添加主库

INSERTINTO mysql_servers 

(hostgroup_id, hostname, port, weight) 

VALUES (10, '192.168.0.10', 3306, 100);



-- 添加从库1

INSERTINTO mysql_servers 

(hostgroup_id, hostname, port, weight) 

VALUES (20, '192.168.0.11', 3306, 100);



-- 添加从库2

INSERTINTO mysql_servers 

(hostgroup_id, hostname, port, weight) 

VALUES (20, '192.168.0.12', 3306, 100);



-- 提交到运行时内存

LOAD MYSQL SERVERS TO RUNTIME;

SAVE MYSQL SERVERS TO DISK;

  • 「hostgroup_id」:分组编号,10代表写组,20代表读组
  • 「weight」:权重,值越大,ProxySQL 选中该节点的概率越高

「3. 配置用户认证信息」

ProxySQL 需要知道如何连接后端,先在 ProxySQL 内配置一个 MySQL 用户(与前文 repl不同,这里给应用使用):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 删除旧用户

DELETEFROM mysql_users;



-- 添加应用用户(假设数据库中已有 testdb 和 t_user 表)

INSERTINTO mysql_users (username, password, default_hostgroup) 

VALUES ('appuser', 'appuserpass', 10);



-- 提交

LOAD MYSQL USERS TO RUNTIME;

SAVE MYSQL USERS TO DISK;

  • 「default_hostgroup」:默认路由到的组,写操作到 10

「4. 配置读写分离规则」

ProxySQL 的查询规则使用正则匹配 SQL,下面配置把 SELECT且不包含 FOR UPDATE的语句,都路由到读组(20):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 删除旧规则

DELETEFROM mysql_query_rules;



-- 规则1:写操作全部发到写组(10INSERTINTO mysql_query_rules 

(rule_id, active, match_pattern, destination_hostgroup, apply) 

VALUES

(1, 1, '^INSERT|^UPDATE|^DELETE|^REPLACE|^CREATE|^ALTER|^DROP', 10, 1);



-- 规则2:普通 SELECT 发到读组(20INSERTINTO mysql_query_rules 

(rule_id, active, match_pattern, destination_hostgroup, apply) 

VALUES

(2, 1, '^SELECT(?!.*FOR UPDATE)', 20, 1);



-- 规则3SELECTFOR UPDATELOCK IN SHARE MODE 发写组

INSERTINTO mysql_query_rules 

(rule_id, active, match_pattern, destination_hostgroup, apply) 

VALUES

(3, 1, 'FOR UPDATE|LOCK IN SHARE MODE', 10, 1);



-- 加载并保存

LOAD MYSQL QUERY RULES TO RUNTIME;

SAVE MYSQL QUERY RULES TO DISK;

「小技巧」apply=1表示匹配后不再往下匹配,顺序很重要,要先写写规则,再写读规则。


「5. 查看当前路由状态」

在管理端运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT hostgroup, srv_host, srv_port, status 

FROM stats_mysql_connection_pool;

如果看到从库的连接在 hostgroup = 20,主库在 10,并且 status 都是 ONLINE,说明注册成功。


「6. 应用侧连接与验证」

假设你的应用只需要连接到 master:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql -u appuser -pappuserpass -h 192.168.0.10 -P6033 testdb

「写验证」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERTINTO t_user (id, name) VALUES (2, 'ProxySQL');

然后登录 node1(或 node2)查看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql -uroot -p123456 -h192.168.0.11 testdb -e "SELECT * FROM t_user;"

能看到 (2, 'ProxySQL')就说明写操作正确路由到主库并同步到了从库。

「读验证」

在应用连接中执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT*FROM t_user;

正常会从从库返回数据。你可通过如下方式强制读主库,验证路由:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT/* PROXYSQL_HOSTGROUP=10 */*FROM t_user;

这样就能在读的时候也走写组,方便调试。


「五、常见问题排查」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
检查后端 MySQL 网络、防火墙;用 telnet IP 3306测试连通性

掌握了本篇内容,你就具备了生产环境中最常见的 「读写分离」能力。下一篇,我们将深入「ProxySQL 性能调优与监控」——让你的数据库集群跑得更稳、更快!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT咸鱼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 「一、写在前面:为什么要用 ProxySQL?」
  • 「二、环境准备:先装好这些“法宝”」
  • 「三、整体架构示意」
  • 「四、Step by Step 实操篇」
    • 「1. 进入 ProxySQL 管理界面」
    • 「2. 注册后端 MySQL 实例(主从库)」
    • 「3. 配置用户认证信息」
    • 「4. 配置读写分离规则」
    • 「5. 查看当前路由状态」
    • 「6. 应用侧连接与验证」
  • 「五、常见问题排查」
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档