【MySQL】MySQL 读写分离实战:MyCAT 配置全流程(附测试验证)
大家好,我是云扬~ 最近在优化数据库架构时,遇到了主库压力过大的问题。经过调研,最终选择用 MyCAT 实现 MySQL 读写分离,把读操作分流到从库,有效减轻了主库负担。今天就把完整的配置过程、操作细节和避坑经验分享给大家,适合需要优化数据库性能的开发 / 运维同学参考。
一、读写分离核心架构
先给大家梳理下核心逻辑:通过 MyCAT 作为中间件,搭建 “一主一从” 的 MySQL 架构。写操作(insert/update/delete)全部路由到主库,保证数据一致性;读操作(select)在主库和从库之间轮询,实现负载均衡。这样既能避免主库因读请求过多导致的性能瓶颈,又能通过从库提升查询响应速度,架构图如下(简化版):

二、前期准备说明
在开始配置前,先确认以下环境已就绪(避免踩坑!):
- 三台服务器:MyCAT 服务器(192.168.184.153)、MySQL 主库(192.168.184.151)、MySQL 从库(192.168.184.152)
- 主从库已完成数据同步(binlog 配置、主从复制搭建,这部分之前的文章有详细讲过,文末附链接)
- MyCAT 已安装完成(推荐 1.6 + 版本,稳定性更好)
- 主从库创建专用账号 mycat_rw,授予读写权限(避免用 root 账号,提升安全性)
三、分步配置指南(含实操命令)
1. 配置后端数据源(主从库注册)
首先要让 MyCAT 识别主库(写库)和从库(读库),通过 SQL 命令直接创建数据源配置,比手动改文件更高效。
(1)创建写库(主库)配置
登录 MyCAT 服务器(192.168.184.153)的 MyCAT 控制台,执行以下 SQL:
/*+ mycat:createDataSource{
"name":"write", // 数据源名称,自定义(建议见名知意)
"url":"jdbc:mysql://192.168.184.151:3306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"mycat_rw", // 主库专用账号
"password":"Ud9_a8Gca1" // 对应密码
} */;

(2)创建读库(从库)配置
同样在 MyCAT 控制台执行:
/*+ mycat:createDataSource{
"name":"read", // 读库数据源名称
"url":"jdbc:mysql://192.168.184.152:3306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"mycat_rw", // 从库同账号(主从同步权限)
"password":"Ud9_a8Gca1"
} */;

(3)验证数据源配置成功
- 方式 1:通过 SQL 查询数据源状态
/*+ mycat:showDataSources{} */;
执行后如果能看到 write 和 read 两个数据源,且状态为 OK,说明配置成功。

- 方式 2:查看配置文件(兜底验证)MyCAT 会自动生成数据源配置文件,进入目录查看:
cd /usr/local/mycat/conf/datasources
ls # 能看到write.json和read.json文件即生效

2. 配置集群和逻辑库
数据源注册后,需要创建集群规则(指定主从关系),再创建逻辑库(应用程序连接的库)。
(1)创建读写分离集群
在 MyCAT 控制台执行 SQL,绑定主从数据源:
/*! mycat:createCluster{"name":"RW", // 集群名称,自定义
"masters":["write"], // 主库数据源(对应上面的name)
"replicas":["read"]} */; // 从库数据源
// 验证集群配置
/*+ mycat:showClusters{} */;
执行后会显示集群名称、主从节点信息,确认无误即可。

(2)创建逻辑库并绑定集群
逻辑库是应用程序实际连接的库,需要关联到上面创建的 RW 集群:
- 先创建逻辑库:
create database maria_rw; // 逻辑库名称,自定义
- 修改逻辑库配置文件,绑定集群:进入 schema 配置目录,编辑生成的 maria_rw.schema.json 文件:
cd /usr/local/mycat/conf/schemas
vim maria_rw.schema.json
将文件内容修改为以下格式(核心是指定 targetName 为集群名称 RW):
{
"customTables":{},
"globalTables":{},
"normalProcedures":{},
"normalTables":{},
"schemaName":"maria_rw", // 逻辑库名称,与创建的一致
"shardingTables":{},
"targetName":"RW", // 绑定的集群名称
"views":{}
}

(3)重启 MyCAT 使配置生效
修改配置文件后必须重启 MyCAT,否则不生效:
/usr/local/mycat/bin/mycat restart # 重启
/usr/local/mycat/bin/mycat status # 查看状态,显示Running即正常

四、读写分离测试验证(关键步骤)
配置完成后,一定要测试是否真的实现了读写分离,避免配置失效却未发现。
1. 写入数据(验证写操作路由到主库)
连接 MyCAT 的逻辑库 maria_rw,创建测试表并插入数据:
use maria_rw;
-- 创建测试表
create table t1(
id int not null auto_increment primary key,
name varchar(20)
);
-- 插入测试数据(写操作)
insert into t1(name) values ('a');
此时可以去主库(192.168.184.151)查询,能看到 t1 表和数据;从库(192.168.184.152)会通过主从复制同步数据,说明写操作确实路由到了主库。
2. 读取数据(验证读操作轮询)
通过查询@@server_id可以区分当前连接的是主库还是从库(主从库的 server_id 不同,可提前记录):
select *,@@server_id from t1;
多次执行该查询,如果@@server_id交替显示主库和从库的 ID,说明读操作在主从库之间轮询,读写分离配置成功!

五、避坑总结(个人实战经验)
- 数据源 URL 必须添加
useSSL=false,否则可能出现 SSL 连接失败问题; - 主从库的 mycat_rw 账号必须授予足够权限(select,insert,update,delete,replication slave 等),否则会出现权限不足报错;
- 逻辑库配置文件的 targetName 必须与集群名称一致,否则无法路由到对应的主从库;
- 重启 MyCAT 后如果状态异常,可查看日志排查:
tail -f /usr/local/mycat/logs/wrapper.log; - 若读操作未轮询,可能是 MyCAT 默认读策略为 “主库优先”,可在集群配置中添加
"readBalanceType":"ROUND_ROBIN"指定轮询策略。
六、相关推荐
如果还没搭建 MyCAT 环境,可参考之前的文章:《【MySQL】MyCAT 实战指南:从安装到配置的完整攻略(附避坑技巧)》
如果需要实现更复杂的分库分表,后续会分享 MyCAT 的分片配置,感兴趣的同学可以关注~
以上就是通过 MyCAT 实现 MySQL 读写分离的完整实战流程,亲测有效!如果在配置过程中遇到问题,欢迎在评论区留言交流~



