拓冰建站拓冰建站
首页 / 资讯中心 / 正文

MyCAT分片算法实战手册:Mod、Long、Range、Hash等10余种切分规则如何选

MyCAT分片算法实战手册Mod、Long、Range、Hash等10余种切分规则如何选【免费下载链接】Mycat-Server项目地址: https://gitcode.com/gh_mirrors/my/Mycat-ServerMyCAT分片算法是数据库中间件 MyCAT 分库分表的核心能力。MyCAT 内置了 18 种分片算法Mod 取模、Long 范围、日期切分、一致性哈希等本文带你一次搞懂每种切分规则的原理与适用场景让你快速选对属于自己的那一种。一、MyCAT分片算法在哪里配置分片规则由两部分组成tableRule指定哪张表、用哪个分片列algorithmfunction指定分片算法及参数。所有算法实现类集中在 src/main/java/io/mycat/route/function/ 目录下每个PartitionByXxx类对应一种切分规则统一实现 RuleAlgorithm 接口核心方法只有一个calculate(分片列值) → 分片下标。仓库中的测试配置 rule.xml 展示了各算法的典型参数写法可作为速查参考。二、10余种分片规则全览与选型1️⃣ 取模类数据均匀分布首选算法类配置名原理适用场景PartitionByModpartitionByMod分片列取绝对值后对count取模自增 ID、订单号等数字主键要求数据绝对均匀PartitionByHashModpartitionByHashModWang/Jenkins 哈希后再取模分片列数字但连续区间想打散到各分片 PartitionByMod.java 中有一个实用细节当分片列不是纯数字时会退化为hashCode取模兜底而不是直接报错。局限扩容时分片数变化会导致大量数据迁移适合分片数规划好不再变的场景。2️⃣ 范围类ID 区间自然递增算法类配置名原理适用场景PartitionByLong区间分片按partitionCount/partitionLength两数组计算每段长度每片容量可自定义如 3 片分别放 100、200、100 万行AutoPartitionByLongrang-long读取mapFile中的起止值→节点映射自增主键按区间切扩容时只需改映射文件还支持defaultNode兜底PartitionByRangeModrang-mod先按mapFile区间定位再对区间长度取模区间 均匀分布的折中方案范围类的最大优势是天然支持水平扩容新节点接上新区间即可老数据不动。这也是 AutoPartitionByLong.java 被官方文档推荐用于自增主键的原因。3️⃣ 字符串与枚举类非数字分片键算法类配置名原理适用场景PartitionByString字符串区间哈希取字符串hashSlice片段哈希后定位区间用户名、手机号等长字符串PartitionDirectBySubString子串直接映射直接截取子串作为分片值订单号中已编码了分片信息PartitionByFileMapsharding-by-intfile枚举值→分片映射文件未知值走defaultNode租户 ID、区域编码等有限枚举PartitionByPattern / PartitionByPrefixPattern模式匹配按正则模式提取关键字段再路由手机号取后几位、按前缀路由等PartitionByFileMap.java 的defaultNode是个防坑利器映射表外的值不会报错而是落到默认节点生产环境强烈建议配置。4️⃣ 日期类按时间冷热分层算法类配置名原理适用场景PartitionByDateby-date相对sBeginDate每sPartionDay天一片支持自然日模式日志、流水表按天/周切分PartitionByMonth按月切分相对起始日期按月计算下标账单、月度报表数据PartitionByMonthAndHistory循环月分区超出月份范围时取模轮回复用分片固定 N 片循环存最近 N 个月LatestMonthPartion最新月分区数据始终落最新月分片只查近期、历史数据归档PartitionByRangeDateHashrange-date-hash日期区间 组内groupPartionSize再切分按天分区但想控制物理分片数量日期类的典型价值是冷热分离热数据近 3 个月在少数分片上冷数据散落在外归档/删除效率极高。5️⃣ 一致性哈希类动态扩容迁移量最小算法类配置名原理适用场景PartitionByMurmurHashMurmur 一致性哈希Guava Murmur3 虚拟节点默认 160 倍支持节点权重节点动态增删、异构节点容量不同PartitionByCRC32PreSlotcrc32slot预生成 102400 个 Slot 的映射表CRC32 定位 Slot大规模分片要求扩容时数据迁移最小PartitionByJumpConsistentHashJump 一致性哈希Google 论文算法无哈希环、O(1) 内存追求更省资源、更快的扩容一致性 三者区别一句话MurmurHash 用虚拟节点模拟均匀CRC32PreSlot 用预生成 Slot 表见 PartitionByCRC32PreSlot.java 中DEFAULT_SLOTS_NUM 102400Jump 哈希则是零虚拟节点的极简实现。三、分片规则怎么选一张决策表按以下顺序自问自答基本可以命中目标算法分片列是数字吗要绝对均匀 →partitionByModID 自增、未来要扩容 →AutoPartitionByLong区间映射分片列是日期吗→ 按天选PartitionByDate按月选PartitionByMonth(AndHistory)要冷热分离就加循环分区。分片列是字符串/枚举吗值域有限且固定 →PartitionByFileMapdefaultNode值域无限 →PartitionByString或PartitionByPattern节点经常扩缩容吗→ 一致性哈希三兄弟MurmurHash / CRC32PreSlot / Jump。✅通用最佳实践分片键选高频查询 低基数变化的列如用户 ID避免WHERE条件不带分片键导致全路由优先选择扩容代价小的算法区间类、一致性哈希避免上线一年就遇到改分片数要迁全部数据的噩梦映射文件mapFile中的节点下标必须与 schema 中 dataNode 顺序一致否则路由错位。四、上手练习跑一遍路由单测不用起 MySQL也能验证算法行为。src/test/java/io/mycat/route/function/ 下提供了各算法的单元测试例如 PartitionByHashModTest.java 演示了哈希取模的均匀性验证方法更完整的路由测试入口见 src/test/java/io/mycat/route/ 中的DQLRouteTest等类。总结MyCAT 的 18 种分片算法可归纳为五大家族取模均匀、范围扩容友好、字符串/枚举非数字键、日期冷热分层、一致性哈希动态扩容。选型的核心不是哪个最强而是让分片键特性、查询模式、扩容计划三者匹配——先想清楚数据生命周期再回上面对号入座即可快速锁定最合适的切分规则。【免费下载链接】Mycat-Server项目地址: https://gitcode.com/gh_mirrors/my/Mycat-Server创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门