保姆级教程:在CentOS 7上从零部署Mycat 1.6.7.4,搞定MySQL分库分表
2026/5/26 11:38:02 网站建设 项目流程

从零构建企业级MySQL分库分表方案:Mycat 1.6.7.4深度部署指南

当单库MySQL面临性能瓶颈时,分库分表几乎是必经之路。作为国内广泛使用的数据库中间件,Mycat以其对MySQL协议的完美兼容和灵活的分片策略,成为许多企业平滑过渡到分布式架构的首选。本文将手把手带你完成Mycat 1.6.7.4在CentOS 7上的完整部署,并深入解析每个配置环节的设计原理。

1. 环境准备与基础配置

在开始部署前,我们需要确保基础环境符合要求。Mycat基于Java开发,因此JDK是必须的。推荐使用OpenJDK 8或Oracle JDK 8,这是经过Mycat官方测试最稳定的版本。

验证Java环境

java -version

若未安装,可通过以下命令快速部署:

yum install -y java-1.8.0-openjdk-devel

Mycat不建议直接使用root用户运行,我们需要创建专用用户:

groupadd mycat useradd -g mycat mycat

目录权限最佳实践

  • /usr/local/mycat:主程序目录
  • /data/mycat:建议将日志、临时文件等可变数据单独存放
mkdir -p /data/mycat/{logs,temp} chown -R mycat:mycat /data/mycat

2. 精细化安装与系统集成

从官方镜像站点获取1.6.7.4版本(注意校验SHA256):

wget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz sha256sum Mycat-server-*.tar.gz

解压到目标位置并设置权限:

tar -zxvf Mycat-server-*.tar.gz -C /usr/local/ mv /usr/local/Mycat-server-* /usr/local/mycat chown -R mycat:mycat /usr/local/mycat

环境变量配置技巧: 在/etc/profile.d/mycat.sh中设置(避免污染全局profile):

export MYCAT_HOME=/usr/local/mycat export PATH=$PATH:$MYCAT_HOME/bin

执行source /etc/profile使配置生效。

3. 核心配置文件深度解析

Mycat的配置主要集中于conf目录下的三个关键文件,理解它们的协作关系至关重要。

3.1 schema.xml:数据拓扑定义

这个文件定义了逻辑库与物理库的映射关系。以下是一个生产级配置示例:

<mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="ORDER_DB" checkSQLschema="true"> <table name="orders" dataNode="dn01,dn02" rule="mod-long" /> <table name="order_items" dataNode="dn01,dn02" rule="mod-long" /> </schema> <dataNode name="dn01" dataHost="mysql-cluster" database="order_db_01" /> <dataNode name="dn02" dataHost="mysql-cluster" database="order_db_02" /> <dataHost name="mysql-cluster" maxCon="500" minCon="20" balance="1" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>SELECT 1</heartbeat> <writeHost host="master" url="192.168.1.101:3306" user="repl_user" password="SecurePass123!"> <readHost host="slave1" url="192.168.1.102:3306" /> </writeHost> </dataHost> </mycat:schema>

关键参数说明

参数推荐值作用
balance1读写分离策略(1表示读操作负载均衡)
writeType0写操作分发方式(0表示所有写发送到第一个writeHost)
switchType1主备切换策略(1表示自动切换)

3.2 rule.xml:分片算法配置

Mycat支持多种分片算法,以下是两种典型配置:

<tableRule name="mod-long"> <rule> <columns>user_id</columns> <algorithm>mod-long</algorithm> </rule> </tableRule> <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <property name="count">2</property> <!-- 分片数量 --> </function>

常见算法对比

算法类型适用场景特点
取模(mod-long)整数主键数据均匀分布,扩容困难
范围分片(auto-sharding-long)有时间特征的数据易于扩容,可能热点
哈希(crc32slot)字符串ID分布均匀,配置简单

3.3 server.xml:服务参数调优

这是Mycat服务本身的配置,重点关注以下部分:

<system> <property name="defaultSqlParser">druidparser</property> <property name="processorBufferPool">2048mb</property> <property name="processorBufferLocalPercent">100</property> </system> <user name="app_user"> <property name="password">App@Pass123</property> <property name="schemas">ORDER_DB</property> <property name="readOnly">false</property> </user>

性能关键参数

  • processorBufferPool:处理线程缓冲池大小,建议物理内存的1/4
  • defaultSqlParser:SQL解析器,druidparser对复杂SQL支持更好
  • charset:建议显式设置为utf8mb4以支持完整Unicode

4. 服务管理与企业级运维

4.1 启动与状态监控

使用专用用户启动服务:

su - mycat -c "mycat start"

关键监控命令

# 查看运行状态 mycat status # 实时监控日志 tail -f /usr/local/mycat/logs/wrapper.log # 连接数检查 netstat -anp | grep 8066 | wc -l

4.2 常见问题排查指南

问题1:启动时报JAVA_HOME not set

  • 检查java -version输出
  • 确认/etc/profile.d/mycat.sh中JAVA_HOME设置正确

问题2:连接数不足

  • 调整server.xml中的maxCon参数
  • 修改Linux系统最大文件描述符限制:
    ulimit -n 65535 echo "mycat soft nofile 65535" >> /etc/security/limits.conf

问题3:分片路由错误

  • 检查rule.xml中分片算法与节点数匹配
  • 验证实际数据分布:
    /*!mycat:sql=select * from orders where user_id=100*/ explain select * from orders where user_id=100;

4.3 生产环境优化建议

  1. 连接池配置

    <dataHost ...> <property name="poolSize">50</property> <property name="idleTimeout">300000</property> </dataHost>
  2. 定期维护任务

    • 每周检查/data/mycat/logs目录大小
    • 每月执行mycat rehash重建路由缓存
  3. 高可用方案

    • 使用Keepalived实现VIP漂移
    • 部署多个Mycat节点通过HAProxy负载均衡

5. 分库分表实战策略

当单表数据量超过500万行时,就该考虑分片了。以下是几种典型场景:

场景1:用户订单数据

  • user_id取模分片
  • 关联表(如订单明细)使用相同分片键

场景2:时间序列数据

  • 按月份范围分片
  • 冷热数据分离(最近3个月热库,历史数据冷库)

跨分片查询解决方案

-- 使用ER分片(父子表关联) <table name="orders" dataNode="dn1,dn2" rule="mod-long"> <childTable name="order_items" joinKey="order_id" parentKey="id"/> </table> -- 或者使用全局表 <table name="region_info" primaryKey="id" type="global" dataNode="dn1,dn2"/>

在部署过程中遇到ERROR 3009 (HY000)错误时,通常是因为分片算法配置与实际节点数不匹配。例如使用mod-long算法时,rule.xml中配置的count必须与schema.xml中定义的dataNode数量一致。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询