分片规则学习

前面部署的时候,就有想到分片规则的问题。规则是什么样子?怎么来定义?

规则列表:
分片枚举
固定分片hash算法
范围约定
取模
按日期(天)分片
取模范围约束
截取数字做hash求模范围约束
应用指定
截取数字hash解析
一致性hash
按单月小时拆分
范围求模分片
日期范围hash分片
冷热数据分片
自然月分片

感觉这个是mycat的精髓部分了,有困难。慢慢攻克。

看看我们现在使用了哪个规则?

<table name="t1" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />

用的是auto-sharding-long

这是最简单的范围约定规则

看看它的定义

</tableRule>
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>

解释下 name是规则名字,columns段是分片的表字段,algorithm段是使用的函数

看看函数,在rule.xml下面有这个定义

<function name="rang-long"
class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>

解释下,name是函数名字,mapfile是要读取的配置文件

看看配置文件

[root@mysql1 conf]# cat autopartition-long.txt

range start-end ,data node index

# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2

这是默认的配置,也可以直接修改,我们修改下
[root@mysql1 conf]# cat autopartition-long.txt

range start-end ,data node index

# K=1000,M=10000.
0-1K=0
1K-10K=1
10K-100K=2

现在的意思是:
id 0-1K 分配到datanode dn1
id 1K-10K 分配到datanode dn2
id 10K-100K 分配到datanode dn3

是不是这样呢?测试下:

mysql> explain insert into t1(id) values(1);
+-----------+------------------------------+
| DATA_NODE | SQL |
+-----------+------------------------------+
| dn1 | insert into t1(id) values(1) |
+-----------+------------------------------+
1 row in set (0.01 sec)

mysql> insert into t1(id) values(1001);
Query OK, 1 row affected (0.02 sec)

mysql> explain insert into t1(id) values(1001);
+-----------+---------------------------------+
| DATA_NODE | SQL |
+-----------+---------------------------------+
| dn2 | insert into t1(id) values(1001) |
+-----------+---------------------------------+
1 row in set (0.01 sec)

mysql> insert into t1(id) values(10001);
Query OK, 1 row affected (0.02 sec)

mysql> explain insert into t1(id) values(10001);
+-----------+----------------------------------+
| DATA_NODE | SQL |
+-----------+----------------------------------+
| dn3 | insert into t1(id) values(10001) |
+-----------+----------------------------------+
1 row in set (0.00 sec)

mysql>

实现了按范围分片的需求。