MyCat分库分表策略——范围取模

举报
Joey啊 发表于 2019/08/28 14:56:58 2019/08/28
【摘要】 范围取模分片的优点在于,既拥有范围分片的固定范围数据不做迁移的优点,也拥有了取模分片对于热点数据均匀分布的优点。首先我们还是以一个示例进行讲解:<!-- schema.xml --><table name="t_car" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="auto-sharding-rang-m...

范围取模分片的优点在于,既拥有范围分片的固定范围数据不做迁移的优点,也拥有了取模分片对于热点数据均匀分布的优点。首先我们还是以一个示例进行讲解:

<!-- schema.xml --><table name="t_car" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="auto-sharding-rang-mod"/>
<!-- rule.xml --><tableRule name="auto-sharding-rang-mod">
  <rule>
    <!-- 指定id字段为范围取模分片的字段 -->
    <columns>id</columns>
    <algorithm>rang-mod</algorithm>
  </rule></tableRule><!-- 这里defaultnode指的是,如果目标字段的值不在范围内,则将其放置到默认节点上;mapFile指定了
     范围与分片数的一个对应关系 --><function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
  <property name="defaultnode">0</property>
  <property name="mapFile">files/partition-range-mod.txt</property></function>
<!-- partition-range-mod.txt -->0-5=1
6-10=2
11-15=1

        关于范围取模分片,这里需要着重说明一下其概念:

  • 在最后的partition-range-mod.txt文件中,我们可以看到,其每一行在等号前指定了一个不想交的范围,这个范围表示的就是目标分区字段的值将会落在哪个范围内;

  • 等号后面有一个数字,需要注意的是,这个数字并不是指数据库节点id,而是当前范围将会占用的数据库节点数目,比如这里的范围0-5内的数据将会被分配到1个数据库节点上,而范围6-10内的数据将会被分配到2个数据库节点上;

  • 等号后面指定了当前范围所需要使用的分片数,而该范围的数据在这几个数据库节点的分布方式是通过取模的方式来实现的,也就是说,在大的方向上,整体数据被切分为多个范围,然后在每个范围内,数据根据取模的方式分配到不同的数据节点上。

        这也就是范围取模分片的概念的由来,这种分片方式的优点在于,在进行扩容和数据迁移的时候,不相关的范围内的数据是不需要移动的。比如假设我们0-5范围内的数据非常多,1个数据库实例无法承受,此时就可以增加一个数据库实例,然后将配置改为0-5=2,接着将之前该范围内的数据库的数据导出,然后由重新导入,以平均分配到这两个数据库节点上。可以看出,这种方式扩容,对于其余两个范围内的数据库实例是没有影响的。最后,需要着重强调的一点是,既然等号后面表示所需要的数据库实例数量,那么等号后面的数字加起来的和一定要小于我们所提供的真实数据库实例的数量。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。