MyCat分片规则之固定hash分片

一、简介

  • 实现方式:该算法类似于十进制的求模运算,但是为二进制的操作,例如,取 id 的二进制低 10 位 与 1111111111 进行 & 运算。
  •  
  • 优点:较灵活,可以均匀分配也可以非均匀分配,各节点的分配比例和容量大小由partitionCount 和 partitionLength两个参数决定
  • 缺点:不方便扩展;
  • 注意:partitionCount 和partitionLength的长度必须一致,并且2 * 256 + 1 * 512 = 1024

二、固定hash分片

实现步骤:

【a】创建数据库和表

create database fixedhash01;
create table user(id bigint not null primary key,name varchar(20));

create database fixedhash02;
create table user(id bigint not null primary key,name varchar(20));

【b】配置server.xml

<user name="root">
        <property name="password">0905</property>
        <property name="schemas">TESTFIXEDHASH</property>

        <!-- 表级 DML 权限设置 -->
        <!--            
        <privileges check="false">
                <schema name="TESTDB" dml="0110" >
                        <table name="tb01" dml="0000"></table>
                        <table name="tb02" dml="1111"></table>
                </schema>
        </privileges>           
         -->
</user>

<user name="user">
        <property name="password">user</property>
        <property name="schemas">TESTFIXEDHASH</property>
        <property name="readOnly">true</property>
</user>

【c】rule.xml配置分片规则

<tableRule name="partition-by-fixed-hash">
        <rule>
                <columns>id</columns>
                <algorithm>partition-by-fixed-hash</algorithm>
        </rule>
</tableRule>

<function name="partition-by-fixed-hash" class="io.mycat.route.function.PartitionByLong">
        <property name="partitionCount">2,1</property>
        <property name="partitionLength">256,512</property>
</function>

【d】schema.xml配置分片节点、分片表等

<schema name="TESTFIXEDHASH" checkSQLschema="true" sqlMaxLimit="1000">
        <table name="user" dataNode="dn$1-3" primaryKey="id" rule="partition-by-fixed-hash" />
</schema>

<dataNode name="dn1" dataHost="dataHost01" database="fixedhash01" />
<dataNode name="dn2" dataHost="dataHost01" database="fixedhash02" />
<dataNode name="dn3" dataHost="dataHost01" database="fixedhash01" />

<dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0"
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="192.168.179.131:3306" user="root" password="0905" />
</dataHost>

【e】测试插入数据

insert into user(id,name) values(1111111,database());
insert into user(id,name) values(2222222,database());
insert into user(id,name) values(3333333,database());
insert into user(id,name) values(4444444,database());
insert into user(id,name) values(8960000,database());

【f】分析

<property name="partitionCount">2,1</property>
<property name="partitionLength">256,512</property>

根据以上配置,分为三个分区: 0-255,256-511,512-1023

故id的低10位二进制 & 1111111111后根据以上范围落入指定的区域。如下分析:

  • 1111111 的二进制低10位为:0001000111,与1111111111相与之后是0001000111,然后再转换为十进制数为71,满足 0-255,在第一个分区,即dataNode1 (fixedhash01数据库);
  •  
  • 2222222 的二进制低10位为:0010001110,与1111111111相与之后是0010001110,然后再转换为十进制数为142,满足 0-255,在第一个分区,即dataNode1 (fixedhash01数据库);
  •  
  • 3333333 的二进制低10位 为:0001010001,与1111111111相与之后是0001010001,然后再转换为十进制数为81,满足 0-255,在第一个分区,即dataNode1 (fixedhash01数据库);
  •  
  • 4444444的二进制低10位为:0100011100,与1111111111相与之后是0100011100,然后再转换为十进制数为284,满足256-511,在第二个分区,即dataNode2(fixedhash02数据库);
  •  
  • 8960000 的二进制低10位为:0000000000,与1111111111相与之后是0000000000,然后再转换为十进制数为0,满足 0-255,在第一个分区,即dataNode1(fixedhash01数据库);
发布了220 篇原创文章 · 获赞 93 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/Weixiaohuai/article/details/100738193