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.png

vim /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)

查询结果,完全符合预期

image.png
上一篇下一篇

猜你喜欢

热点阅读