【MySQL】MySQL 读写分离实战:MyCAT 配置全流程(附测试验证)

大家好,我是云扬~ 最近在优化数据库架构时,遇到了主库压力过大的问题。经过调研,最终选择用 MyCAT 实现 MySQL 读写分离,把读操作分流到从库,有效减轻了主库负担。今天就把完整的配置过程、操作细节和避坑经验分享给大家,适合需要优化数据库性能的开发 / 运维同学参考。

一、读写分离核心架构

先给大家梳理下核心逻辑:通过 MyCAT 作为中间件,搭建 “一主一从” 的 MySQL 架构。写操作(insert/update/delete)全部路由到主库,保证数据一致性;读操作(select)在主库和从库之间轮询,实现负载均衡。这样既能避免主库因读请求过多导致的性能瓶颈,又能通过从库提升查询响应速度,架构图如下(简化版):

二、前期准备说明

在开始配置前,先确认以下环境已就绪(避免踩坑!):

  1. 三台服务器:MyCAT 服务器(192.168.184.153)、MySQL 主库(192.168.184.151)、MySQL 从库(192.168.184.152)
  2. 主从库已完成数据同步(binlog 配置、主从复制搭建,这部分之前的文章有详细讲过,文末附链接)
  3. MyCAT 已安装完成(推荐 1.6 + 版本,稳定性更好)
  4. 主从库创建专用账号 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 集群:

  1. 先创建逻辑库:
create database maria_rw;  // 逻辑库名称,自定义
  1. 修改逻辑库配置文件,绑定集群:进入 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,说明读操作在主从库之间轮询,读写分离配置成功!

五、避坑总结(个人实战经验)

  1. 数据源 URL 必须添加useSSL=false,否则可能出现 SSL 连接失败问题;
  2. 主从库的 mycat_rw 账号必须授予足够权限(select,insert,update,delete,replication slave 等),否则会出现权限不足报错;
  3. 逻辑库配置文件的 targetName 必须与集群名称一致,否则无法路由到对应的主从库;
  4. 重启 MyCAT 后如果状态异常,可查看日志排查:tail -f /usr/local/mycat/logs/wrapper.log
  5. 若读操作未轮询,可能是 MyCAT 默认读策略为 “主库优先”,可在集群配置中添加"readBalanceType":"ROUND_ROBIN"指定轮询策略。

六、相关推荐

如果还没搭建 MyCAT 环境,可参考之前的文章:《【MySQL】MyCAT 实战指南:从安装到配置的完整攻略(附避坑技巧)

如果需要实现更复杂的分库分表,后续会分享 MyCAT 的分片配置,感兴趣的同学可以关注~

以上就是通过 MyCAT 实现 MySQL 读写分离的完整实战流程,亲测有效!如果在配置过程中遇到问题,欢迎在评论区留言交流~

Tags:

发表回复

Your email address will not be published. Required fields are marked *.

*
*