mycat分片(固定分片hash算法)
2020-07-20 本文已影响0人
agang_19
实现方式:
该算法类似于十进制的求模运算,但是为二进制的操作,例如,取 id 的二进制低 10 位 与 1111111111 进行 & 运算。
优点
此算法的优点在于如果按照10进制取模运算,在连续插入1-10时候1-10会被分到1-10个分片,增大了插入的事务控制难度,而此算法根据二进制则可能会分到连续的分片,减少插入事务控制难度。
注意事项
分区长度:默认为最大2^n=1024 ,即最大支持1024分区
count,length两个数组的长度必须是一致的。
1024 = sum((count[i]*length[i])). count和length两个向量的点积恒等于1024
vim /usr/local/mycat/conf/schema.xml (配置分片)
image.pngvim /usr/local/mycat/conf/rule.xml(配置分片规则)
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<function name="func1" class="io.mycat.route.function.PartitionByLong">
<property name="partitionCount">1,1,1</property>
<property name="partitionLength">100,412,512</property>
</function>
算法:1 * 100+1 * 412+1 * 512=1024;
上面columns 标识将要分片的表字段,algorithm 分片函数,partitionCount 分片个数列表,partitionLength 分片范围列表
准备数据
mysql> CREATE TABLE mycat.`PartitionByLong` (
-> `id` int NOT NULL AUTO_INCREMENT,
-> `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
-> `database` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci comment '固定哈希算法';
mysql> insert into mycat.PartitionByLong (id, content, `database`) values (3, 'content', database());
Query OK, 1 row affected (0.01 sec)
insert into mycat.PartitionByLong (id, content, `database`) values (512, 'content', database());
Query OK, 1 row affected (0.01 sec)
insert into mycat.PartitionByLong (id, content, `database`) values (1280, 'content', database());
Query OK, 1 row affected (0.00 sec)
mysql> insert into mycat.PartitionByLong (id, content, `database`) values (3, 'content', database());
Query OK, 1 row affected (0.01 sec)
mysql> insert into mycat.PartitionByLong (id, content, `database`) values (512, 'content', database());
Query OK, 1 row affected (0.01 sec)
分析结果
上面插入的数据低10位和 1111111111 求*运算,算出最终的指
十进制 | 二进制 | 1111111111求& | 最终十进制 | 节点范围 |
---|---|---|---|---|
1280 | 1 01000 00000 | 1000 00000 | 256 | 101-512(节点2) |
1833 | 1 11001 01001 | 11001 01001 | 809 | 513-1024(节点3) |
3 | 11 | 1111111111求& | 3 | 1-100(节点1) |