美文网首页
mycat分片(固定分片hash算法)

mycat分片(固定分片hash算法)

作者: agang_19 | 来源:发表于2020-07-20 18:04 被阅读0次

    实现方式:

    该算法类似于十进制的求模运算,但是为二进制的操作,例如,取 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

    相关文章

      网友评论

          本文标题:mycat分片(固定分片hash算法)

          本文链接:https://www.haomeiwen.com/subject/amxdkktx.html