从零构建企业级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-develMycat不建议直接使用root用户运行,我们需要创建专用用户:
groupadd mycat useradd -g mycat mycat目录权限最佳实践:
/usr/local/mycat:主程序目录/data/mycat:建议将日志、临时文件等可变数据单独存放
mkdir -p /data/mycat/{logs,temp} chown -R mycat:mycat /data/mycat2. 精细化安装与系统集成
从官方镜像站点获取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>关键参数说明:
| 参数 | 推荐值 | 作用 |
|---|---|---|
| balance | 1 | 读写分离策略(1表示读操作负载均衡) |
| writeType | 0 | 写操作分发方式(0表示所有写发送到第一个writeHost) |
| switchType | 1 | 主备切换策略(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 -l4.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 生产环境优化建议
连接池配置:
<dataHost ...> <property name="poolSize">50</property> <property name="idleTimeout">300000</property> </dataHost>定期维护任务:
- 每周检查
/data/mycat/logs目录大小 - 每月执行
mycat rehash重建路由缓存
- 每周检查
高可用方案:
- 使用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数量一致。