Mycat 主从节点关联的核心目标是:告诉 Mycat 「哪个是主库(写节点)、哪个是从库(读节点)」,并配置请求路由规则(写请求走主库、读请求走从库)。
配置的核心文件是 schema.xml(Mycat 最关键的配置文件),需基于已搭建好的 MySQL 主从复制环境(数据同步依赖 MySQL 自身,Mycat 仅负责路由)。以下是详细的分步配置(基于 CentOS + Mycat 1.6.x + MySQL 8.0):
- 已完成 MySQL 主从复制搭建(主从数据一致,
show slave status\G 中 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes)。
- 主库、从库已创建 Mycat 连接用户(如
mycat/123456),并授予全权限(允许 Mycat 连接和操作数据库):
GRANT ALL ON *.* TO 'mycat'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
- Mycat 已安装(1.6.x 稳定版),且
server.xml 已配置应用连接用户(如 mycat_app/123456,无需修改,沿用之前配置)。
- 主库(Master):IP
192.168.1.101:3306,数据库 db1
- 从库(Slave):IP
192.168.1.103:3306,数据库 db1(与主库同名,数据同步)
- 逻辑库(Mycat 对外暴露):
mycat_db
- 逻辑表(示例):
user(对应主从库的 db1.user)
Mycat 主从节点关联的所有配置都在 schema.xml 中,核心是通过 writeHost(主库)和 readHost(从库)标签关联主从节点,再通过 balance 参数开启读写分离。
vim /usr/local/mycat/conf/schema.xml
替换 schema.xml 内容为以下配置(关键节点已标注说明):
<?xml version="1.0" encoding="UTF-8"?>
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mycat_db" <!-- 逻辑库名(需与 server.xml 中 schema 一致) -->
checkSQLschema="false"
sqlMaxLimit="100">
<table name="user" <!-- 逻辑表名(与主从库真实表名一致) -->
dataNode="dn1"
primaryKey="id"
autoIncrement="true"
/>
</schema>
<dataNode name="dn1" <!-- 分片名(自定义) -->
dataHost="host1"
database="db1"
/>
<dataHost name="host1" <!-- 主机组名(自定义) -->
maxCon="1000"
minCon="10"
balance="1"
writeType="0"
dbType="mysql"
dbDriver="native"
switchType="1"
slaveThreshold="100">
<heartbeat>select 1</heartbeat>
<writeHost host="master-101" <!-- 主库节点名(自定义) -->
url="192.168.1.101:3306"
user="mycat"
password="123456">
<readHost host="slave-103" <!-- 从库节点名(自定义) -->
url="192.168.1.103:3306"
user="mycat"
password="123456"
weight="1"
/>
</writeHost>
</dataHost>
</mycat:schema>
决定读请求的转发规则,是主从关联的核心:
- 新手推荐:
balance="1"(最常用,纯读请求走从库,分担主库压力)。
- 推荐:
switchType="1"(简单高效,适合大多数场景)。
Mycat 对 XML 配置文件的语法要求严格,需确保:
- 所有标签闭合(如
<schema> 对应 </schema>)。
- 无多余空格、特殊字符。
- IP、端口、用户名、密码正确(与主从库一致)。
/usr/local/mycat/bin/mycat stop
/usr/local/mycat/bin/mycat console
- 启动成功标志:日志中出现
Mycat Server startup successfully. see logs in logs/mycat.log。
- 启动失败排查:查看日志
tail -f /usr/local/mycat/logs/mycat.log,重点看 ERROR 信息(如配置文件语法错误、数据库连接失败)。
目标:确认「写请求走主库、读请求走从库」,且数据通过 MySQL 主从复制同步。
mysql -h127.0.0.1 -umycat_app -p123456 -P8066
use mycat_db;
INSERT INTO user (id, name, age) VALUES (3, '王五', 25);
SELECT * FROM user;
登录主库(192.168.1.101),查看数据和日志:
use db1;
select * from user;
set global general_log = on;
set global log_output = 'table';
select * from mysql.general_log where argument like '%INSERT INTO user%';
- 结果:主库日志中能看到 Mycat 转发的 INSERT 请求(用户为
mycat_app)。
登录从库(192.168.1.103),查看数据和日志:
use db1;
select * from user;
set global general_log = on;
set global log_output = 'table';
select * from mysql.general_log where argument like '%SELECT * FROM user%';
- 结果:从库日志中能看到 Mycat 转发的 SELECT 请求,主库日志中无该 SELECT 记录(说明读请求已转发到从库)。
通过 Mycat 管理端口(9066)查看节点状态:
mysql -h127.0.0.1 -umycat_app -p123456 -P9066
show @@datanode;
show @@readhost;
- Mycat 主从节点关联的核心是
schema.xml 中的 writeHost(主库)和 readHost(从库)配置,且 readHost 必须嵌套在 writeHost 下(标识主从关联关系)。
- 关键参数
balance="1" 是开启读写分离的核心,决定读请求是否转发到从库。
- 配置前必须确保 MySQL 主从复制正常(数据同步是前提),Mycat 仅负责请求路由,不负责数据同步。
- 验证时优先通过「数据库日志」确认请求分发,再通过 Mycat 管理端口查看节点状态,排查问题更高效。
按照以上配置,即可完成 Mycat 主从节点关联,实现读写分离,提升系统并发能力~