开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(二):MyCat - 分片 - 分片规则 - 字符串 hash 解析算法】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/756/detail/13273
MyCat - 分片 - 分片规则 - 字符串 hash 解析算法
内容介绍
一.配置
二.配置说明
三.演示 hash 字符串解析算法进行分片
四.原理
一.配置
截取字符串中的指定位置的子字符串(即只会截取一个字符串中的一段),进行 hash 算法,算出其 hash 值后,再通过一定的计算,算出分片,配置如下:
<tableRule name=”sharding-by-stringhash>
<rule>
<columns>
user_id
(//指定分片对象) </columns>
<algorithm>sharding-by-stringhash
(//指定分片算法)</algorithm>
</rule>
</tableRule>
//首先,有一个 tableRule 来制定它的分片规则
<function name=”sharding-by-stringhash”class=”i
o.mycat.route.function.PartitionByString
”
>
<property name=
”
partitionlength
”
>512</property><!-- zero-based-->
(//分片处理类)
<property name=”partitionCount”>2</property>
<property name=”hashSlice>0:2
(代表子字符串所截的范围)<property>
</function>
二.配置说明:
属性 |
描述 |
columns |
标识将要分片的表字段 |
algorithm |
指定分片函数与 function 的对应关系 |
class |
指定该分片算法对应的类 |
partitionLength |
hash 求模基数; length*count=1024(主要出于性能考虑 |
partitionCount |
分区数 |
hashSlice |
hash 运算位,根据子字符串的 hash 运算; 0 代表 str.length(), -1 代表 str.length()-1,大于 0 只代表数字自身;可以理解为 substring( start ,end) , start 为 0 则只表示 0 |
三.演示 hash 字符串解析算法进行分片
1. 首先,我们需要先配置一个逻辑表
将下面的代码复制
<table name=”tb_strhash”dataNode=”dn1,dn2,dn3”rule=”sharding-by-stringhash”/>
我们需要在此编码当中配置一个逻辑表,如下图所示。
由于此次演示只需要两个分片,因此将 ”dn1,dn2,dn3,” 改为 ”dn1,dn2”
更改是因为上方的代码 “<property name=”partitionCount”>2</property>”
中 Count 为2。只会使用两个分片
2.然后,我们需要在这里配置一下分片规则。
如图所示,由于配置规则在 Mycat 文件当中并没有事先声明,因此我们需要手动配置
然后需要在下方声明一个 <function>
此 <function> 即上方配置:
<function name=”sharding-by-stringhash”class=”i
o.mycat.route.function.PartitionByString
”
>
<property name=
”
partitionlength
”
>512</property><!-- zero-based-->
(//分片处理类)
<property name=”partitionCount”>2</property>
<property name=”hashSlice>0:2
(代表子字符串所截的范围)<property>
</function>
其中的 512,2 代表此次的分片数量,0:2 代表此次子字符串所截的范围
接下来需要将上图所示的 user_id 改为 name (此次我们需要根据 name 字段进行分片)
配置好之后,我们就可以重启 Mycat ,执行 Mycat 的重启动。 Mycat 重启完成之后,我们将它关闭,然后再次连接 1,2,3,4,5,6。
接着,在 mysq1> 后输入 use PARTITION_DB; 按回车键后输入 show tables; 回车后得到 hash 表(如图所示)
3.接下来,需要创建一个表结构
创建表
Create table tb_strhash(
name varchar(20) primary key,
Content varchar(100)
)engine=InnoDB DEFAULT CHARSET=utf8mb4;
4.需要在表中插入数据
插入数据
INSERT INTO tb_strhash (name,content) VALUES (‘T1001’,UUID());
INSERT INTO tb_strhash (name,content) VALUES (‘ROSE’,UUID());
INSERT INTO tb_strhash (name,content) VALUES (‘JERRY’,UUID());
INSERT INTO tb_strhash (name,content) VALUES (‘CRISTINA’,UUID());
INSERT INTO tb_strhash (name,content) VALUES (‘TOMCAT’,UUID());
UUID 为 Count 的值;T1001,ROSE,JERRY,CRISTINA,TOMCAT 即为 name
插入的数据不可能在第三个截点,因为我们所配置的截点的数量为2,且所配置的为 dn1,dn2。
数据的计算方法:
截取 name 中的字符串来进行 hash 运算,然后进行位于运算
四.原理
当我们使用分片字符串- hash 解析算法进行分片,它在进行初始化的时候,会初始化出一个数组(如下图所示)。这个数组的长度是从 0 到 1023,一共 1024 个数,那么,前面 512 个数均为 0,后面 512 个数均为 1。
<property name=”partitionlength”>512</property><!-- zero-based--> <property name=”partitionCount”>2</property>
上方的这段代码决定了数字中的 512 和 2
计算数据的位置原理:
当出现一个字符串时,它会此先进行截取,截取从 0 到 2 这个位 置,然后进行一个 hash 运算。假如 hash 运算的结果为 1728192 6 (1024-1)(如上图所示)。
接下来,它将进行一个位于运算,位于的即为(1024-1),计算的结果将位于 0 到1023 之间。
计算出的结果就会拿到这个索引(1024-1),再到这个数组当中取出对应的值。假如计算结果为 510,拿到的就是 0,那么就会在第一个分片上;假如计算结果为980,拿到的就是 1,那么就会出现在第二个分片上。