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 连接和操作数据库):sql-- 主库、从库均执行 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)
二、核心配置:修改 schema.xml
Mycat 主从节点关联的所有配置都在
schema.xml 中,核心是通过 writeHost(主库)和 readHost(从库)标签关联主从节点,再通过 balance 参数开启读写分离。步骤 1:编辑 schema.xml 文件
bash
运行
# 进入 Mycat 配置目录,编辑 schema.xml
vim /usr/local/mycat/conf/schema.xml
步骤 2:完整配置模板(一主一从架构)
替换
schema.xml 内容为以下配置(关键节点已标注说明):xml
<?xml version="1.0" encoding="UTF-8"?>
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 1. 逻辑库配置:应用连接的虚拟库 -->
<schema name="mycat_db" <!-- 逻辑库名(需与 server.xml 中 schema 一致) -->
checkSQLschema="false" <!-- 执行 SQL 时是否去掉逻辑库名(建议 false) -->
sqlMaxLimit="100"> <!-- 默认查询分页条数(避免全表扫描) -->
<!-- 2. 逻辑表配置:关联到主从库的真实表 -->
<table name="user" <!-- 逻辑表名(与主从库真实表名一致) -->
dataNode="dn1" <!-- 关联的分片(主从库所在的分片) -->
primaryKey="id" <!-- 主键(Mycat 路由需要) -->
autoIncrement="true" <!-- 开启自增主键(可选,避免主键冲突) -->
/>
</schema>
<!-- 3. 分片配置:对应真实的数据库(主从库共用一个分片 dn1) -->
<dataNode name="dn1" <!-- 分片名(自定义) -->
dataHost="host1" <!-- 关联的数据库主机组(主从节点所在组) -->
database="db1" <!-- 真实数据库名(主从库均为 db1) -->
/>
<!-- 4. 主从节点核心配置(dataHost 是数据库主机组,包含主库和从库) -->
<dataHost name="host1" <!-- 主机组名(自定义) -->
maxCon="1000" <!-- 最大连接数 -->
minCon="10" <!-- 最小连接数 -->
balance="1" <!-- 读写分离策略(核心参数,1=开启读分离) -->
writeType="0" <!-- 写请求转发策略(0=转发到第一个 writeHost) -->
dbType="mysql" <!-- 数据库类型 -->
dbDriver="native" <!-- 驱动类型(native=MySQL 原生驱动) -->
switchType="1" <!-- 主库故障自动切换(1=基于心跳自动切换,可选) -->
slaveThreshold="100"> <!-- 从库延迟阈值(可选) -->
<!-- 心跳检测:Mycat 定期检测主从库是否存活(必填) -->
<heartbeat>select 1</heartbeat> <!-- 简单心跳语句(推荐) -->
<!-- 5. 主库配置(writeHost:负责写请求,如 INSERT/UPDATE/DELETE) -->
<writeHost host="master-101" <!-- 主库节点名(自定义) -->
url="192.168.1.101:3306" <!-- 主库 IP:端口 -->
user="mycat" <!-- Mycat 连接主库的用户名 -->
password="123456"> <!-- Mycat 连接主库的密码 -->
<!-- 6. 从库配置(readHost:负责读请求,如 SELECT,嵌套在 writeHost 下) -->
<readHost host="slave-103" <!-- 从库节点名(自定义) -->
url="192.168.1.103:3306" <!-- 从库 IP:端口 -->
user="mycat" <!-- Mycat 连接从库的用户名 -->
password="123456" <!-- Mycat 连接从库的密码 -->
weight="1" <!-- 读请求权重(多从库时配置,默认 1) -->
/>
</writeHost>
<!-- 可选:备用主库(双主架构,主库故障时自动切换,按需配置) -->
<!-- <writeHost host="master-102" url="192.168.1.102:3306" user="mycat" password="123456">
<readHost host="slave-104" url="192.168.1.104:3306" user="mycat" password="123456" />
</writeHost> -->
</dataHost>
</mycat:schema>
三、关键参数详解(必须理解)
1. 读写分离核心参数(balance)
决定读请求的转发规则,是主从关联的核心:
| balance 值 | 含义 |
|---|---|
| 0 | 不开启读写分离(所有请求,包括读,都走主库) |
| 1 | 开启读分离:读请求转发到所有 readHost(从库) |
| 2 | 开启读分离:读请求转发到所有 writeHost(主库)和 readHost(从库) |
| 3 | 开启读分离:读请求仅转发到 readHost,忽略 writeHost 的读权限 |
- 新手推荐:
balance="1"(最常用,纯读请求走从库,分担主库压力)。
2. 写请求转发参数(writeType)
| writeType 值 | 含义 |
|---|---|
| 0 | 写请求转发到第一个可用的 writeHost(主库),适合「一主多从」架构 |
| 1 | 写请求随机转发到多个 writeHost,适合「双主」架构(需保证主主同步) |
3. 主库故障切换参数(switchType)
| switchType 值 | 含义 |
|---|---|
| -1 | 关闭自动切换(主库故障后,Mycat 不再转发写请求) |
| 1 | 基于心跳自动切换(检测到主库心跳失败,自动切换到备用 writeHost) |
| 2 | 基于主从同步状态切换(需配合 show slave status 心跳语句) |
| 3 | 基于 MySQL 主从同步延迟切换(需配置延迟阈值) |
- 推荐:
switchType="1"(简单高效,适合大多数场景)。
四、配置验证与重启 Mycat
步骤 1:检查配置文件语法
Mycat 对 XML 配置文件的语法要求严格,需确保:
- 所有标签闭合(如
<schema>对应</schema>)。 - 无多余空格、特殊字符。
- IP、端口、用户名、密码正确(与主从库一致)。
步骤 2:重启 Mycat 使配置生效
bash
运行
# 停止 Mycat(若已启动)
/usr/local/mycat/bin/mycat stop
# 前台启动 Mycat(查看日志,确认无报错)
/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 主从复制同步。
步骤 1:连接 Mycat 执行读写操作
bash
运行
# 用 MySQL 客户端连接 Mycat(8066 端口,应用连接端口)
mysql -h127.0.0.1 -umycat_app -p123456 -P8066
# 切换到逻辑库
use mycat_db;
# 1. 写操作(INSERT:Mycat 应转发到主库)
INSERT INTO user (id, name, age) VALUES (3, '王五', 25);
# 2. 读操作(SELECT:Mycat 应转发到从库)
SELECT * FROM user;
步骤 2:确认写请求走主库
登录主库(192.168.1.101),查看数据和日志:
sql
-- 主库执行:查询数据(应存在 id=3 的记录)
use db1;
select * from user;
-- 查看主库 MySQL 日志(确认有 INSERT 操作)
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)。
步骤 3:确认读请求走从库
登录从库(192.168.1.103),查看数据和日志:
sql
-- 从库执行:查询数据(应同步到 id=3 的记录,MySQL 主从复制生效)
use db1;
select * from user;
-- 查看从库 MySQL 日志(确认有 SELECT 操作)
set global general_log = on;
set global log_output = 'table';
select * from mysql.general_log where argument like '%SELECT * FROM user%';
- 结果:从库日志中能看到 Mycat 转发的 SELECT 请求,主库日志中无该 SELECT 记录(说明读请求已转发到从库)。
步骤 4:验证 Mycat 主从节点状态(可选)
通过 Mycat 管理端口(9066)查看节点状态:
bash
运行
# 连接 Mycat 管理端口
mysql -h127.0.0.1 -umycat_app -p123456 -P9066
# 查看数据节点状态(确认 dn1 对应的主从库均为 UP)
show @@datanode;
# 查看读写分离状态(确认 readHost 已识别)
show @@readhost;
六、常见问题与解决方案
| 常见问题 | 原因 | 解决方案 |
|---|---|---|
| Mycat 启动失败,日志提示「连接数据库失败」 | 1. 主从库 IP / 端口错误;2. Mycat 用户名 / 密码错误;3. 主从库防火墙未开放 3306 端口 | 1. 验证主从库地址:mysql -h192.168.1.101 -umycat -p123456;2. 主从库开放 3306 端口:firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload |
| 读请求仍走主库,从库无日志 | 1. balance 参数配置错误(如为 0);2. readHost 标签配置错误(未嵌套在 writeHost 下) |
1. 确认 balance="1";2. 检查 readHost 是否在 writeHost 内部(必须嵌套);3. 重启 Mycat |
| 从库查询不到主库写入的数据 | MySQL 主从复制失败,而非 Mycat 配置问题 | 1. 主库执行 show master status,从库执行 show slave status\G;2. 确保 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes;3. 排查主从复制故障(如复制用户权限、日志文件 / 位置错误) |
| 主库故障后未自动切换 | 1. switchType 未设置为 1;2. 未配置备用 writeHost;3. 心跳检测失败 |
1. 配置 switchType="1";2. 添加备用 writeHost(双主架构);3. 确认心跳语句 select 1 能正常执行 |
核心总结
- Mycat 主从节点关联的核心是
schema.xml中的writeHost(主库)和readHost(从库)配置,且readHost必须嵌套在writeHost下(标识主从关联关系)。 - 关键参数
balance="1"是开启读写分离的核心,决定读请求是否转发到从库。 - 配置前必须确保 MySQL 主从复制正常(数据同步是前提),Mycat 仅负责请求路由,不负责数据同步。
- 验证时优先通过「数据库日志」确认请求分发,再通过 Mycat 管理端口查看节点状态,排查问题更高效。
按照以上配置,即可完成 Mycat 主从节点关联,实现读写分离,提升系统并发能力~