一、简介
- 实现方式:该算法类似于十进制的求模运算,但是为二进制的操作,例如,取 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数据库);