MyCat分库分表策略——范围取模
范围取模分片的优点在于,既拥有范围分片的固定范围数据不做迁移的优点,也拥有了取模分片对于热点数据均匀分布的优点。首先我们还是以一个示例进行讲解:
<!-- 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
,接着将之前该范围内的数据库的数据导出,然后由重新导入,以平均分配到这两个数据库节点上。可以看出,这种方式扩容,对于其余两个范围内的数据库实例是没有影响的。最后,需要着重强调的一点是,既然等号后面表示所需要的数据库实例数量,那么等号后面的数字加起来的和一定要小于我们所提供的真实数据库实例的数量。
- 点赞
- 收藏
- 关注作者
评论(0)