Mycat 主从节点关联配置实战(核心步骤)

Mycat 主从节点关联的核心目标是:告诉 Mycat 「哪个是主库(写节点)、哪个是从库(读节点)」,并配置请求路由规则(写请求走主库、读请求走从库)。
配置的核心文件是 schema.xml(Mycat 最关键的配置文件),需基于已搭建好的 MySQL 主从复制环境(数据同步依赖 MySQL 自身,Mycat 仅负责路由)。以下是详细的分步配置(基于 CentOS + Mycat 1.6.x + MySQL 8.0):

一、前置条件(必须满足)

  1. 已完成 MySQL 主从复制搭建(主从数据一致,show slave status\G 中 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes)。
  2. 主库、从库已创建 Mycat 连接用户(如 mycat/123456),并授予全权限(允许 Mycat 连接和操作数据库):
    sql
    -- 主库、从库均执行
    GRANT ALL ON *.* TO 'mycat'@'%' IDENTIFIED BY '123456';
    FLUSH PRIVILEGES;
    
  3. 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 能正常执行

核心总结

  1. Mycat 主从节点关联的核心是 schema.xml 中的 writeHost(主库)和 readHost(从库)配置,且 readHost 必须嵌套在 writeHost 下(标识主从关联关系)。
  2. 关键参数 balance="1" 是开启读写分离的核心,决定读请求是否转发到从库。
  3. 配置前必须确保 MySQL 主从复制正常(数据同步是前提),Mycat 仅负责请求路由,不负责数据同步。
  4. 验证时优先通过「数据库日志」确认请求分发,再通过 Mycat 管理端口查看节点状态,排查问题更高效。
按照以上配置,即可完成 Mycat 主从节点关联,实现读写分离,提升系统并发能力~
阅读剩余
THE END