MySQL分布式架构:MyCat详解

MyCat 是一款基于 Java 开发的分布式数据库中间件,专注于解决 MySQL 分库分表、读写分离、高可用等问题,被誉为"开源的分布式数据库系统"。它兼容 MySQL 协议,应用程序可以像连接普通 MySQL 一样连接 MyCat,无需修改代码。

一、MyCat 核心功能与架构

1. 核心功能
  • 分库分表:支持水平分片(按行)和垂直分片(按表)
  • 读写分离:自动将读操作分发到从库,写操作到主库
  • 高可用:支持主从切换、故障自动检测
  • 分布式事务:支持 XA 分布式事务和柔性事务
  • SQL 拦截与改写:对 SQL 进行解析、优化和路由
2. 架构组成
复制代码
应用程序 → MyCat 集群 → 后端 MySQL 集群
  • MyCat 层:负责 SQL 解析、路由、结果聚合
  • MySQL 层:实际存储数据的数据库集群(主从、多节点)

二、安装与配置(Linux 环境)

1. 环境准备
  • JDK 1.8+(MyCat 基于 Java 开发)
  • MySQL 5.7+(后端数据库)
bash 复制代码
# 安装 JDK
yum install -y java-1.8.0-openjdk-devel

# 验证 Java 环境
java -version
2. 安装 MyCat
bash 复制代码
# 下载 MyCat(以 1.6.7.6 版本为例)
wget http://dl.mycat.org.cn/1.6.7.6/20220524173849/Mycat-server-1.6.7.6-release-20220524173849-linux.tar.gz

# 解压到 /usr/local
tar -zxvf Mycat-server-1.6.7.6-release-20220524173849-linux.tar.gz -C /usr/local

# 配置环境变量
echo 'export MYCAT_HOME=/usr/local/mycat' >> /etc/profile
echo 'export PATH=$PATH:$MYCAT_HOME/bin' >> /etc/profile
source /etc/profile
3. 核心配置文件

MyCat 的配置文件位于 $MYCAT_HOME/conf 目录,关键文件包括:

  • server.xml:定义用户、权限、端口等
  • schema.xml:定义逻辑库、表、分片规则、后端数据源
  • rule.xml:定义分片规则(如按范围、哈希分片)

三、核心配置详解

1. server.xml(用户与权限配置)
xml 复制代码
<mycat:server xmlns:mycat="http://io.mycat/">
    <!-- 定义连接 MyCat 的用户 -->
    <user name="test">
        <property name="password">test123</property>
        <!-- 关联的逻辑库 -->
        <property name="schemas">TESTDB</property>
        <!-- 只读权限设置 -->
        <property name="readOnly">false</property>
    </user>
    
    <!-- 管理用户 -->
    <user name="mycat">
        <property name="password">123456</property>
        <property name="schemas">TESTDB</property>
        <property name="manager">true</property>
    </user>
    
    <!-- 系统参数 -->
    <system>
        <property name="defaultSqlParser">druidparser</property>
        <property name="serverPort">8066</property>  <!-- 数据端口 -->
        <property name="managerPort">9066</property> <!-- 管理端口 -->
    </system>
</mycat:server>
2. schema.xml(逻辑库与数据源配置)
xml 复制代码
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- 逻辑库 TESTDB -->
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <!-- 逻辑表 t_order,按 id 分片 -->
        <table name="t_order" dataNode="dn1,dn2" rule="mod-long" />
    </schema>
    
    <!-- 数据节点(dn1 对应主机 host1 的 db1 库) -->
    <dataNode name="dn1" dataHost="host1" database="db1" />
    <dataNode name="dn2" dataHost="host2" database="db2" />
    
    <!-- 数据源配置(主从架构) -->
    <dataHost name="host1" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- 主库 -->
        <writeHost host="hostM1" url="jdbc:mysql://192.168.1.100:3306" user="root" password="123456">
            <!-- 从库 -->
            <readHost host="hostS1" url="jdbc:mysql://192.168.1.101:3306" user="root" password="123456" />
        </writeHost>
    </dataHost>
    
    <dataHost name="host2" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM2" url="jdbc:mysql://192.168.1.102:3306" user="root" password="123456">
            <readHost host="hostS2" url="jdbc:mysql://192.168.1.103:3306" user="root" password="123456" />
        </writeHost>
    </dataHost>
</mycat:schema>

关键参数说明:

  • balance="1":读操作负载均衡(从库参与读取)
  • writeType="0":写操作只发往第一个 writeHost
  • switchType="1":主库故障自动切换到从库
3. rule.xml(分片规则配置)

以"取模分片"为例:

xml 复制代码
<mycat:rule xmlns:mycat="http://io.mycat/">
    <!-- 按 id 取模分片 -->
    <tableRule name="mod-long">
        <rule>
            <columns>id</columns>  <!-- 分片字段 -->
            <algorithm>mod-long</algorithm>  <!-- 算法名称 -->
        </rule>
    </tableRule>
    
    <!-- 取模算法配置(2 个分片) -->
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <property name="count">2</property>  <!-- 分片数量 -->
    </function>
</mycat:rule>

其他常用分片规则:

  • PartitionByRange:按范围分片(如 id 1-1000 到 dn1)
  • PartitionByHash:按哈希值分片
  • PartitionByDate:按日期分片(如按月份)

四、启动与管理

1. 启动 MyCat
bash 复制代码
# 启动
mycat start

# 停止
mycat stop

# 重启
mycat restart

# 查看状态
mycat status
2. 连接 MyCat
bash 复制代码
# 连接数据端口(8066)
mysql -h127.0.0.1 -P8066 -utest -ptest123

# 连接管理端口(9066,用于管理操作)
mysql -h127.0.0.1 -P9066 -umycat -p123456
3. 管理命令(通过 9066 端口)
sql 复制代码
-- 查看数据节点状态
show dataNode;

-- 查看数据源状态
show dataHost;

-- 手动切换主从
switch @@dataHost=host1/writeHost=hostM1;

-- 重新加载配置
reload @@config;

五、分库分表示例

假设对 t_order 表按 id 取模分表到 2 个数据节点(dn1、dn2):

  1. 创建逻辑表:通过 MyCat 连接执行

    sql 复制代码
    CREATE TABLE t_order (
        id INT NOT NULL,
        user_id INT NOT NULL,
        create_time DATETIME,
        PRIMARY KEY (id)
    );

    MyCat 会自动在 dn1(db1.t_order)和 dn2(db2.t_order)创建物理表。

  2. 插入数据

    sql 复制代码
    -- id=1 会路由到 dn1(1%2=1 → 索引从0开始时可能到 dn1)
    INSERT INTO t_order(id, user_id, create_time) VALUES(1, 100, NOW());
    
    -- id=2 会路由到 dn2(2%2=0 → 索引从0开始时可能到 dn2)
    INSERT INTO t_order(id, user_id, create_time) VALUES(2, 101, NOW());
  3. 查询数据

    sql 复制代码
    -- MyCat 会自动聚合 dn1 和 dn2 的结果
    SELECT * FROM t_order;

六、读写分离配置

schema.xml 中通过 balance 参数控制读写分离策略:

  • balance="0":不开启读写分离,所有操作走主库
  • balance="1":读操作分发到从库,写操作走主库
  • balance="2":读操作随机分发到主库和从库

强制走主库查询:

sql 复制代码
-- 通过注解强制读主库
SELECT /*+ MYCAT:db_type=master */ * FROM t_order;

七、高可用与监控

  1. 主库故障自动切换

    • 配置 switchType="1" 开启自动切换
    • MyCat 通过心跳检测(heartbeat 配置)判断主库状态
  2. 监控

    • 集成 MyCat-Web 监控平台(需单独部署)
    • 查看日志:$MYCAT_HOME/logs/mycat.log

八、注意事项

  1. 避免跨分片事务(复杂且性能低)
  2. 分片字段尽量在 WHERE 条件中,否则会全表扫描
  3. 大表分片时提前规划分片规则,避免后期数据迁移
  4. 定期备份后端 MySQL 数据,MyCat 不存储实际数据

MyCat 适合中小规模分布式场景,通过简单配置即可实现 MySQL 的水平扩展,是构建高可用、高性能数据库架构的重要工具。

相关推荐
早日退休!!!16 分钟前
《数据结构选型指南》笔记
数据结构·数据库·oracle
xcLeigh23 分钟前
KES数据库性能优化实战
数据库·sql·性能优化·sql优化·数据性能
阿正呀25 分钟前
Redis怎样实现本地缓存的高效失效通知
jvm·数据库·python
yoyo_zzm31 分钟前
Laravel9.x新特性全解析
数据库·mysql·nginx
2501_9012005340 分钟前
mysql如何设置InnoDB引擎参数_优化innodb_buffer_pool
jvm·数据库·python
m0_495496412 小时前
mysql处理复杂SQL性能_InnoDB优化器与MyISAM差异
jvm·数据库·python
forEverPlume2 小时前
PHP怎么使用Eloquent Attribute Composition属性组合_Laravel通过组合构建复杂属性【方法】
jvm·数据库·python
2301_809204703 小时前
mysql在docker容器中如何部署_利用docker-compose快速启动
jvm·数据库·python
虹科网络安全3 小时前
艾体宝产品|深度解读 Redis 8.4 新增功能:原子化 Slot 迁移(上)
数据库·redis·bootstrap
阿坤带你走近大数据3 小时前
怎么查看当前oracle库下的表空间temp大小或者默认大小
数据库·oracle