Mycat配置介绍

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)
  • typeglobal 表示全局表,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>

六、配置生效与验证

  1. 启动 Mycat./mycat start(Linux)或 mycat.bat start(Windows)
  2. 连接测试mysql -h 127.0.0.1 -P 8066 -u root -pRoot@123
  3. 验证逻辑库show databases; 可看到 TESTDB
  4. 验证分片:插入数据后,查看物理库 db1db2 数据分布
  5. 验证读写分离:执行查询,查看从库日志是否有请求

七、常见配置问题

  1. 连接失败:检查端口、用户名密码、IP 白名单、防火墙
  2. 分片不生效:确认 tablerulerule.xml 一致,dataNode 配置正确
  3. 读写分离不生效:检查 balance 参数、从库状态、心跳检测
  4. 跨库 join 报错:全局表配置正确,非全局表避免跨库多表 join
上一篇 802.11ax技术白皮书
下一篇 S9706交换机(V200R001C00SPC300)来回路径不一致,导致单通