Mycat 是基于 Java 开发的开源分布式数据库中间件,核心通过 server.xml、schema.xml、rule.xml 三大配置文件实现分库分表、读写分离、数据路由等能力,对应用透明兼容 MySQL 协议。下面从核心配置文件、关键配置项、完整示例三方面详细介绍。
一、核心配置文件总览
Mycat 配置文件均位于
conf/ 目录,各司其职、相互关联:表格
| 配置文件 | 核心作用 | 关键配置项 |
|---|---|---|
| server.xml | 系统全局参数、用户权限、访问控制 | 端口、字符集、用户、IP 白名单、SQL 防火墙 |
| schema.xml | 逻辑库 / 表、分片节点、物理数据源、读写分离 | schema、table、dataNode、dataHost、writeHost/readHost |
| rule.xml | 分片规则定义(取模、范围、哈希等) | tableRule、function |
| log4j2.xml | 日志输出配置 | 日志级别、格式、输出位置 |
二、server.xml 详解(系统与用户)
1. 核心结构
包含
<system>(系统参数)、<user>(用户权限)两大模块。2. 关键配置项
(1)<system> 系统参数
xml
<system>
<!-- 服务端口(默认8066,应用连接) -->
<property name="serverPort">8066</property>
<!-- 管理端口(默认9066,用于监控/命令) -->
<property name="managerPort">9066</property>
<!-- 字符集 -->
<property name="charset">utf8mb4</property>
<!-- 线程池大小 -->
<property name="processorExecutor">16</property>
<!-- 连接超时(毫秒) -->
<property name="idleTimeout">1800000</property>
<!-- SQL 最大返回条数(未指定 limit 时) -->
<property name="sqlMaxLimit">1000</property>
<!-- 开启分布式事务(弱XA) -->
<property name="useDistributedTransaction">true</property>
</system>
(2)<user> 用户与权限
xml
<!-- 管理员用户(读写) -->
<user name="admin">
<property name="password">Admin@123</property>
<!-- 可访问的逻辑库 -->
<property name="schemas">TESTDB,USERDB</property>
<!-- 默认逻辑库 -->
<property name="defaultSchema">TESTDB</property>
<!-- 非只读 -->
<property name="readOnly">false</property>
<!-- IP 白名单 -->
<property name="whiteIPs">192.168.1.0/24,127.0.0.1</property>
</user>
<!-- 只读用户 -->
<user name="guest">
<property name="password">Guest@123</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
三、schema.xml 详解(逻辑与物理映射)
1. 核心结构
包含
<schema>(逻辑库)、<table>(逻辑表)、<dataNode>(分片节点)、<dataHost>(物理数据源)四大核心标签。2. 关键配置项
(1)<schema> 逻辑库
xml
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="1000">
<!-- 逻辑表定义 -->
<table name="user" primaryKey="id" dataNode="dn1,dn2" rule="mod-long" />
<table name="order" primaryKey="order_id" dataNode="dn1,dn2,dn3" rule="sharding-by-order" />
<!-- 全局表(所有分片都有全量数据,用于多表 join) -->
<table name="dict" type="global" dataNode="dn1,dn2,dn3" />
</schema>
- name:逻辑库名(应用连接时的库名)
- checkSQLschema:是否自动去除 SQL 中的库名(建议 false)
- sqlMaxLimit:未指定 limit 时的最大返回条数
(2)<table> 逻辑表
- name:表名
- primaryKey:主键(用于路由与全局序列)
- dataNode:所属分片节点(多个用逗号分隔)
- rule:分片规则(对应 rule.xml 中的 tableRule)
- type:
global表示全局表,normal为分片表
(3)<dataNode> 分片节点
xml
<dataNode name="dn1" dataHost="dh1" database="db1" />
<dataNode name="dn2" dataHost="dh1" database="db2" />
<dataNode name="dn3" dataHost="dh2" database="db3" />
- name:节点名(table 中引用)
- dataHost:物理数据源(对应 dataHost)
- database:物理库名
(4)<dataHost> 物理数据源(读写分离)
xml
<dataHost name="dh1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!-- 心跳检测 -->
<heartbeat>select user()</heartbeat>
<!-- 写节点(主库) -->
<writeHost host="master1" url="192.168.1.100:3306" user="root" password="Root@123">
<!-- 读节点(从库,可配置多个) -->
<readHost host="slave1" url="192.168.1.101:3306" user="root" password="Root@123" />
<readHost host="slave2" url="192.168.1.102:3306" user="root" password="Root@123" />
</writeHost>
</dataHost>
- balance:读负载均衡策略
- 0:不开启读写分离,所有读请求发 writeHost
- 1:全部 readHost 参与读负载
- 2:读写请求都随机分发到 writeHost/readHost
- switchType:主从切换策略(1 表示自动切换)
四、rule.xml 详解(分片规则)
1. 核心结构
包含
<tableRule>(表级规则)、<function>(分片算法)。2. 常用分片规则示例
(1)取模分片(mod-long,最常用)
xml
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- 分片节点总数 -->
<property name="count">2</property>
</function>
- 按
id % count路由到对应分片
(2)范围分片(sharding-by-date)
xml
<tableRule name="sharding-by-date">
<rule>
<columns>create_time</columns>
<algorithm>sharding-by-date</algorithm>
</rule>
</tableRule>
<function name="sharding-by-date" class="io.mycat.route.function.PartitionByDate">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2025-01-01</property>
<property name="sEndDate">2025-12-31</property>
<property name="sPartionDay">30</property>
</function>
- 按日期范围分片,每 30 天一个分片
(3)一致性哈希(sharding-by-murmur)
xml
<tableRule name="sharding-by-murmur">
<rule>
<columns>user_id</columns>
<algorithm>sharding-by-murmur</algorithm>
</rule>
</tableRule>
<function name="sharding-by-murmur" class="io.mycat.route.function.PartitionByMurmurHash">
<property name="count">3</property>
<property name="virtualBucketTimes">160</property>
</function>
- 减少扩容时的数据迁移
五、完整配置示例(分库分表 + 读写分离)
1. server.xml
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="serverPort">8066</property>
<property name="managerPort">9066</property>
<property name="charset">utf8mb4</property>
<property name="sqlMaxLimit">1000</property>
</system>
<user name="root">
<property name="password">Root@123</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">false</property>
</user>
</mycat:server>
2. schema.xml
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="1000">
<table name="user" primaryKey="id" dataNode="dn1,dn2" rule="mod-long" />
<table name="dict" type="global" dataNode="dn1,dn2" />
</schema>
<dataNode name="dn1" dataHost="dh1" database="db1" />
<dataNode name="dn2" dataHost="dh1" database="db2" />
<dataHost name="dh1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="master" url="192.168.1.100:3306" user="root" password="Root@123">
<readHost host="slave" url="192.168.1.101:3306" user="root" password="Root@123" />
</writeHost>
</dataHost>
</mycat:schema>
3. rule.xml
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">2</property>
</function>
</mycat:rule>
六、配置生效与验证
- 启动 Mycat:
./mycat start(Linux)或mycat.bat start(Windows) - 连接测试:
mysql -h 127.0.0.1 -P 8066 -u root -pRoot@123 - 验证逻辑库:
show databases;可看到TESTDB - 验证分片:插入数据后,查看物理库
db1、db2数据分布 - 验证读写分离:执行查询,查看从库日志是否有请求
七、常见配置问题
- 连接失败:检查端口、用户名密码、IP 白名单、防火墙
- 分片不生效:确认
table中rule与rule.xml一致,dataNode配置正确 - 读写分离不生效:检查
balance参数、从库状态、心跳检测 - 跨库 join 报错:全局表配置正确,非全局表避免跨库多表 join