mycat入门:分片策略详解

*/

复制代码

2.固定分片 hash 算法

本条规则类似于十进制的求模运算,区别在于是二进制的操作,是取 id 的二进制低 10 位,即 id 二进制 &1111111111。 此算法的优点在于如果按照 10 进制取模运算,在连续插入 1-10 时候 1-10 会被分到 1-10 个分片,增 大了插入的事务控制难度,而此算法根据二进制则可能会分到连续的分片,减少插入事务事务控制难度。

user_id

func1

2,1

256,512

复制代码

配置说明:

上面 columns 标识将要分片的表字段,algorithm 分片函数,

partitionCount 分片个数列表,partitionLength 分片范围列表

分区长度:默认为最大 2^n=1024 ,即最大支持 1024 分区

约 束 :

count,length 两个数组的长度必须是一致的。

1024 = sum((count[i]*length[i])). count 和 length 两个向量的点积恒等于 1024

用法例子:

本例的分区策略:希望将数据水平分成 3 份,前两份各占 25%,第三份占 50%。(故本例非均匀分区)

// |<———————1024———————————>|

// |<—-256—>|<—-256—>|<———-512————->|

// | partition0 | partition1 | partition2 |

// | 共 2 份,故 count[0]=2 | 共 1 份,故 count[1]=1 |

int[] count = new int[] { 2, 1 };

int[] length = new int[] { 256, 512 };

PartitionUtil pu = new PartitionUtil(count, length);

复制代码

// 下面代码演示分别以 offerId 字段或 memberId 字段根据上述分区策略拆分的分配结果

int DEFAULT_STR_HEAD_LEN = 8; // cobar 默认会配置为此值

long offerId = 12345;

String memberId = “qiushuo”;

// 若根据 offerId 分配,partNo1 将等于 0,即按照上述分区策略,offerId 为 12345 时将会被分配

到 partition0 中

int partNo1 = pu.partition(offerId);

// 若根据 memberId 分配,partNo2 将等于 2,即按照上述分区策略,memberId 为 qiushuo 时将会被

分到 partition2 中

int partNo2 = pu.partition(memberId, 0, DEFAULT_STR_HEAD_LEN);

复制代码

如果需要平均分配设置:平均分为 4 分片,partitionCount*partitionLength=1024

4

256

复制代码

3.范围约定

此分片适用于,提前规划好分片字段某个范围属于哪个分片, start <= range <= end. range start-end ,data node index K=1000,M=10000.

user_id

rang-long

autopartition-long.txt

0

复制代码

配置说明:

上面 columns 标识将要分片的表字段,algorithm 分片函数,

rang-long 函数中 mapFile 代表配置文件路径

defaultNode 超过范围后的默认节点。

所有的节点配置都是从 0 开始,及 0 代表节点 1,此配置非常简单,即预先制定可能的 id 范围到某个分片

0-500M=0

500M-1000M=1

1000M-1500M=2

0-10000000=0

10000001-20000000=1

复制代码

4.取模

此规则为对分片字段求摸运算

user_id

mod-long

3

复制代码

配置说明:

上面 columns 标识将要分片的表字段,algorithm 分片函数,

此种配置非常明确即根据 id 进行十进制求模预算,相比固定分片 hash,此种在批量插入时可能存在批量插入单

事务插入多数据分片,增大事务一致性难度。

复制代码

5.按日期(天)分片

此规则为按天分片。

create_time

sharding-by-date

yyyy-MM-dd

2014-01-01

2014-01-02

10

复制代码

配置说明:

columns :标识将要分片的表字段

algorithm :分片函数

dateFormat :日期格式

sBeginDate :开始日期

sEndDate:结束日期

sPartionDay :分区天数,即默认从开始日期算起,分隔 10 天一个分区

如果配置了 sEndDate 则代表数据达到了这个日期的分片后后循环从开始分片插入。

Assert.assertEquals(true, 0 == partition.calculate(“2014-01-01”));

Assert.assertEquals(true, 0 == partition.calculate(“2014-01-10”));

Assert.assertEquals(true, 1 == partition.calculate(“2014-01-11”));

Assert.assertEquals(true, 12 == partition.calculate(“2014-05-01”));

复制代码

6.取模范围约束

此种规则是取模运算与范围约束的结合,主要为了后续数据迁移做准备,即可以自主决定取模后数据的节点 分布。

user_id

sharding-by-pattern

<function name=“sharding-by-pattern” class=“io.mycat.route.function.PartitionByPattern”

256

2

partition-pattern.txt

复制代码

partition-pattern.txt

partition-pattern.txt

id partition range start-end ,data node index

first host configuration

1-32=0

33-64=1

65-96=2

97-128=3

######## second host configuration

129-160=4

161-192=5

193-224=6

225-256=7

0-0=7

复制代码

配置说明:

上面 columns 标识将要分片的表字段,algorithm 分片函数,patternValue 即求模基数,defaoultNode

默认节点,如果配置了默认,则不会按照求模运算

mapFile 配置文件路径

配置文件中,1-32 即代表 id%256 后分布的范围,如果在 1-32 则在分区 1,其他类推,如果 id 非数据,则

会分配在 defaoultNode 默认节点

String idVal = “0”;

Assert.assertEquals(true, 7 == autoPartition.calculate(idVal));

idVal = “45a”;

Assert.assertEquals(true, 2 == autoPartition.calculate(idVal));

复制代码

7.截取数字做 hash 求模范围约束

此种规则类似于取模范围约束,此规则支持数据符号字母取模。

user_id

sharding-by-prefixpattern

<function name=“sharding-by-pattern”

class=“io.mycat.route.function.PartitionByPrefixPattern”>

256

5

partition-pattern.txt

复制代码

partition-pattern.txt

partition-pattern.txt

range start-end ,data node index

ASCII

8-57=0-9 阿拉伯数字

64、65-90=@、A-Z

97-122=a-z

first host configuration

1-4=0

5-8=1

9-12=2

13-16=3

second host configuration

17-20=4

21-24=5

25-28=6

29-32=7

0-0=7

复制代码

配置说明:

上面 columns 标识将要分片的表字段,algorithm 分片函数,patternValue 即求模基数,prefixLength

ASCII 截取的位数

mapFile 配置文件路径

配置文件中,1-32 即代表 id%256 后分布的范围,如果在 1-32 则在分区 1,其他类推

此种方式类似方式 6 只不过采取的是将列种获取前 prefixLength 位列所有 ASCII 码的和进行求模

sum%patternValue ,获取的值,在范围内的分片数,

String idVal=“gf89f9a”;

Assert.assertEquals(true, 0==autoPartition.calculate(idVal));

idVal=“8df99a”;

Assert.assertEquals(true, 4==autoPartition.calculate(idVal));

idVal=“8dhdf99a”;

Assert.assertEquals(true, 3==autoPartition.calculate(idVal));

复制代码

8.应用指定

此规则是在运行阶段有应用自主决定路由到那个分片。

user_id

sharding-by-substring

<function name=“sharding-by-substring”

class=“io.mycat.route.function.PartitionDirectBySubString”>

0

2

8

0

复制代码

配置说明:

上面 columns 标识将要分片的表字段,algorithm 分片函数

此方法为直接根据字符子串(必须是数字)计算分区号(由应用传递参数,显式指定分区号)。

例如 id=05-100000002

在此配置中代表根据 id 中从 startIndex=0,开始,截取 siz=2 位数字即 05,05 就是获取的分区,如果没传

默认分配到 defaultPartition

复制代码

9.截取数字 hash 解析

此规则是截取字符串中的 int 数值 hash 分片。

user_id

sharding-by-stringhash

<function name=“sharding-by-stringhash”

class=“io.mycat.route.function.PartitionByString”>

512

2

0:2

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。

这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。

大家可以把Java基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:

希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
om: 33%;" />

总结

我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。

这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。

大家可以把Java基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:

[外链图片转存中…(img-DZYNZcw1-1711796110963)]

[外链图片转存中…(img-CtQhlIkr-1711796110964)]

[外链图片转存中…(img-Y6kZw4ny-1711796110964)]

希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值