Mycat配置实战:手把手教你用schema.xml和rule.xml定义自己的分片规则(含CRC32Slot算法详解)

Mycat配置实战:手把手教你用schema.xml和rule.xml定义自己的分片规则(含CRC32Slot算法详解) Mycat配置实战手把手教你用schema.xml和rule.xml定义自己的分片规则含CRC32Slot算法详解当电商平台的订单量突破百万级时单机MySQL的查询性能开始出现明显瓶颈。这时我们需要将数据分散到多个数据库节点而Mycat正是实现这一目标的中间件利器。不同于简单的安装教程本文将带您深入Mycat最核心的配置逻辑掌握如何根据业务特性定制分片规则。1. 理解Mycat的配置体系结构Mycat的配置主要围绕三个核心文件展开schema.xml定义逻辑库表与物理节点的映射关系rule.xml配置分片算法规则server.xml设置系统参数和用户权限对于已经完成基础安装的用户我们直接进入/usr/local/mycat/conf目录。这里特别提醒修改配置前请先备份原始文件避免配置错误导致服务不可用。配置修改后需要重启Mycat才能生效建议在业务低峰期操作2. schema.xml的深度配置解析2.1 逻辑库表定义电商系统通常需要处理用户和订单两类核心数据我们来看一个典型配置schema nameecommerce checkSQLschematrue sqlMaxLimit1000 !-- 用户表按ID哈希分片 -- table nameuser dataNodedn1,dn2,dn3 ruleuser_hash/ !-- 订单表按时间范围分片 -- table nameorder dataNodedn1,dn2,dn3 ruletime_range/ /schema关键参数说明参数说明示例值name逻辑表名userdataNode数据节点列表dn1,dn2,dn3rule分片规则名称user_hashprimaryKey主键字段可选id2.2 数据节点与数据源配置dataNode namedn1 dataHostcluster1 databasedb_user/ dataNode namedn2 dataHostcluster1 databasedb_user/ dataNode namedn3 dataHostcluster2 databasedb_order/ dataHost namecluster1 maxCon1000 minCon10 balance1 heartbeatselect 1/heartbeat writeHost hostmaster1 url192.168.1.101:3306 usermycat passwordMycat123/ /dataHost数据源配置中几个关键属性balance负载均衡模式0不开启读写分离1随机分配读请求2所有读操作都走从库writeType写操作分发方式0所有写操作发送到第一个writeHost1随机分配写操作3. rule.xml的分片规则定制3.1 CRC32Slot算法详解CRC32Slot是Mycat中最常用的哈希分片算法之一特别适合用户表的分片场景。其工作原理对分片字段值计算CRC32哈希将哈希值对分片数取模根据模值确定数据应该落在哪个分片配置示例tableRule nameuser_hash rule columnsuser_id/columns algorithmcrc32slot/algorithm /rule /tableRule function namecrc32slot classio.mycat.route.function.PartitionByCRC32PreSlot property namecount3/property !-- 分片数量 -- /function3.2 时间范围分片配置对于订单表我们通常需要按时间范围分片tableRule nametime_range rule columnscreate_time/columns algorithmrang-time/algorithm /rule /tableRule function namerang-time classio.mycat.route.function.AutoPartitionByTime property nametimeFormatyyyy-MM-dd/property property namesBegin2023-01-01/property property namesPartionDay30/property property namedefaultNode0/property /function这种配置会将每30天的订单数据存储到一个分片非常适合时间序列数据。4. 分片策略选型与优化4.1 常见分片策略对比策略类型适用场景优点缺点哈希分片用户数据分布均匀难以范围查询范围分片订单/日志利于范围查询可能数据倾斜枚举分片地区数据配置简单扩展性差日期分片时间序列便于归档需要定期维护4.2 分片键选择原则高区分度如用户ID比性别更适合避免热点不要用经常更新的字段查询友好常用查询条件中的字段业务相关符合业务访问模式5. 实战电商系统分片方案设计假设我们的电商平台有以下特点用户数5000万日均订单10万查询模式用户信息常通过ID查询订单常按用户ID和时间范围查询对应的配置方案!-- schema.xml -- schema nameecommerce table nameuser dataNodedn1,dn2,dn3 ruleuser_hash/ table nameorder dataNodedn1,dn2,dn3 ruleorder_sharding/ /schema !-- rule.xml -- tableRule nameorder_sharding rule columnsuser_id,create_time/columns algorithmcomposite/algorithm /rule /tableRule function namecomposite classio.mycat.route.function.PartitionByCRC32PreSlot property namecount3/property property namehashSlice0:8/property /function这种组合分片策略可以确保同一用户的订单数据相对集中同时避免单个分片数据过多。6. 常见问题排查与性能调优6.1 分片不均问题处理当发现某些分片数据量明显偏多时可以检查分片字段的基数是否足够大考虑使用复合分片键调整分片算法参数6.2 跨分片查询优化对于必须的跨分片操作合理设置fetchSize减少内存消耗避免在大表上执行全量COUNT考虑使用全局表global table减少JOIN操作table nameregion dataNodedn1,dn2,dn3 typeglobal/7. 高级配置技巧7.1 分片数动态扩展当需要增加分片时修改rule.xml中的count参数配置数据迁移工具逐步切换流量7.2 读写分离配置dataHost namecluster1 balance1 writeHost hostmaster url... readHost hostslave1 url.../ readHost hostslave2 url.../ /writeHost /dataHost这种配置下写操作会发往master读操作会随机分配到slave节点。