MyCat核心配置详解与分库分表实战指南)
1. MyCat分库分表实战背景最近接手了一个用户量激增的电商项目数据库查询响应时间从最初的200ms飙升到3秒以上高峰期经常出现连接池耗尽的情况。经过分析发现单表数据量已经突破2000万行索引都快撑不住了。这时候就需要请出我们的分布式数据库中间件MyCat了。MyCat本质上是一个数据库代理它最大的价值在于让应用层无感知地实现分库分表。你可以把它想象成一个老练的餐厅领班当客人应用程序点菜时领班会根据菜品类型分片规则把订单分发给不同的厨师数据库节点最后再把做好的菜拼成完整的一桌。在实际项目中我遇到过最常见的三种分片需求用户表按user_id范围分片订单表按时间月份分片商品表按品类哈希分片下面我就用最典型的用户表场景带大家走通从环境搭建到分片配置的完整流程。这个方案在我们生产环境支撑了日均5000万的查询请求响应时间稳定在50ms以内。2. MyCat核心配置文件详解2.1 schema.xml - 数据路由的交通图这个文件定义了逻辑库表与实际物理库表的映射关系就像快递分拣中心的路由表。最近在配置一个社交平台项目时我这样设计用户表的分片schema namesocial_db checkSQLschematrue table nameuser dataNodedn1,dn2,dn3 rulemod-long / table nameuser_relation dataNodedn1,dn2,dn3 rulemod-long / /schema dataNode namedn1 dataHosthost1 databasesocial_01 / dataNode namedn2 dataHosthost2 databasesocial_02 / dataNode namedn3 dataHosthost3 databasesocial_03 / dataHost namehost1 maxCon500 dbTypemysql heartbeatselect 1/heartbeat writeHost url192.168.1.101:3306 userdbadmin password加密密码 / /dataHost几个容易踩坑的点dataNode的database名称必须在真实MySQL中存在writeHost的密码建议使用加密工具生成分片表必须明确指定primaryKey否则更新操作会全表扫描2.2 rule.xml - 数据分片的算法库这里定义了各种分片算法我常用的是这几种哈希取模mod-long适合均匀分布的场景时间范围sharding-by-date适合日志类数据枚举值sharding-by-intfile适合固定分类的数据最近一个物流项目中我是这样配置订单表的分片规则tableRule namesharding-by-month rule columnscreate_time/columns algorithmpartbyday/algorithm /rule /tableRule function namepartbyday classio.mycat.route.function.PartitionByDate property namedateFormatyyyy-MM-dd/property property namesBeginDate2023-01-01/property property namesPartionDay30/property /function特别注意算法中的partitionCount和partitionLength的乘积必须等于分片节点总数否则会出现数据路由错误。2.3 server.xml - 系统运行的控制台这个文件主要配置MyCat服务本身参数有几个关键配置项需要关注system property namedefaultSqlParserdruidparser/property property nameprocessorBufferPool2048mb/property property namesequnceHandlerType1/property /system user nameapp_user property namepassword加密密码/property property nameschemassocial_db/property property namereadOnlyfalse/property /user生产环境建议bufferPool大小设置为物理内存的1/4一定要配置防火墙规则只允许应用服务器访问8066端口不同应用使用不同的数据库账号方便权限控制3. 分库分表实战配置3.1 按用户ID哈希分片以用户表为例假设我们需要将5000万用户数据分散到3个库首先在rule.xml配置分片算法tableRule namemod-long-user rule columnsuser_id/columns algorithmmod-long/algorithm /rule /tableRule function namemod-long classio.mycat.route.function.PartitionByMod property namecount3/property /function然后在schema.xml配置数据节点table nameuser dataNodedn1,dn2,dn3 rulemod-long-user primaryKeyuser_id/验证分片效果-- 插入测试数据 INSERT INTO user(user_id, name) VALUES(10001, 张三); -- 查看执行计划 explain select * from user where user_id10001;3.2 跨分片查询优化分库分表后最头疼的就是跨分片查询我总结了几种解决方案使用ER表绑定关联关系table nameorder dataNodedn1,dn2 rulemod-long childTable nameorder_item joinKeyorder_id parentKeyorder_id/ /table全局表配置适合字典表table nameregion dataNodedn1,dn2,dn3 typeglobal/使用MyCat的shareJoin特性/*!mycat:catletio.mycat.catlets.ShareJoin */ select * from user u join order o on u.user_ido.user_id;4. 生产环境调优经验4.1 性能优化参数在server.xml中这些参数需要根据硬件配置调整property nameprocessors16/property !-- CPU核心数2倍 -- property nameprocessorExecutor32/property !-- processors的2倍 -- property namedefaultMaxLimit1000/property !-- 最大返回行数 --4.2 常见问题排查连接数不足# 查看连接数 show connection; # 调整连接池大小 property namemaxCon1000/property内存溢出# 修改启动参数 vim mycat/conf/wrapper.conf wrapper.java.additional.10-Xmx4G慢查询监控-- 开启慢查询日志 property namesqlSlowTime1000/property -- 查看慢查询 show slow;最近在金融项目中遇到一个典型问题批量插入性能差。最终通过调整batchInsertSize参数解决property namebatchInsertSize500/property4.3 高可用方案推荐的主从切换配置dataHost namehost1 balance1 switchType2 heartbeatshow slave status/heartbeat writeHost hostmaster url192.168.1.101:3306 userroot passwordxxx readHost hostslave url192.168.1.102:3306 userroot passwordxxx/ /writeHost /dataHost关键参数说明switchType1 基于心跳自动切换switchType2 基于MySQL主从状态切换balance1 读写分离模式在实际部署时建议配合Keepalived实现VIP漂移我们线上环境这样配置后半年内实现了零宕机时间。