MyCat的分片规则(一)
概述
什么是 MyCat 的分片规则呢? 使用了 MyCat 之后,我们所有的数据库操作都是针对 MyCat ,增删改查都是针对 MyCat 进行操作,MyCat 会将我们的 SQL 进行分析,分析之后,会根据提前配置好的规则将 SQL 转发到对应的 MySQL 上面去执行。这个提前定义好的规则就就叫做 分片规则。
在数据切分处理中,特别是水平切分中,中间件最终要的两个处理过程就是数据的切分、数据的聚合。选择合适的切分规则,至关重要,因为它决定了后续数据聚合的难易程度,甚至可以避免跨库的数据聚合处理。前面讲了数据切分中重要的几条原则,其中有几条是数据冗余,表分组(Table Group),这都是业务上规避跨库 join 的很好的方式,但不是所有的业务场景都适合这样的规则,因此本章将讲述如何选择合适的切分规则。
global
有一些表,数据量不大,也不怎么修改,主要是查询操作,这一类表我们可以使用 global
这种分片规则。global的特点是,该表会在所有的库中都创建,而且每一个库中都保存了该表的完整数据。具体配置方式,就是在 schema.xml 的 table 节点中添加一个 type 属性,其值为 global 。
配置完成后保存并退出,然后重启 MyCat ,在mycat目录下:
./bin/mycat restart
重启完成后,要删除之前已经创建好的book表,然后重新创建表,创建完成后,向表中插入数据,可以看到 db1、db2、db3 库中都有数据了。
注意:
这里,虽然查询出来的数据记录只有一条,实际上 db1、db2、db3 库中都有该条记录。
总结:
global 适合于数据量不大、以查询为主、增删改较少的表。
枚举分片(sharding-by-intfile)
sharding-by-intfile 这个是枚举分片,就是在数据表中专门设计一个字段,以后根据这个字段的值来决定数据插入到哪个 dataNode 上。
注意:
在配置 sharding-by-intfile 规则是,一定要删除 type=“global”,否则配置不会生效,具体配置如下:
配置完成后,还需要指定枚举的数据。枚举的数据可以在 rule.xml 中查看。
在 rule.xml 文件中,首先找到 tableRule 的名字为 sharding-by-intfile 的节点,这个节点中定义了两个属性,一个是 columns 表示一会在数据表中定义的枚举列的名字(数据表中一会需要创建一个名为 sharding_id的列,这个列的值决定了该条数据保存在哪个数据库实例中),这个名字可以自定义; 另外一个属性叫做 algorithm ,这是指 sharding-by-intfile 所对应的算法名称。根据这个名称,可以在 rule.xml 文件中找到具体的算法:
我们找到了 hash-int,class 表示这个算法对应的Java 类的路径。第一个属性 mapFile 表示相关的配置文件,从这个文件名可以看出,这个文件就在conf 目录下。
打开 conf 目录下的partition-hash-int.txt 文件,内容如下:
其中前面的数字表示枚举的值,后面的数字表示 dataNode 的下标,所以前面的数字可以自定义,后面的数字不能随意定义。
配置完成后,重启 MyCat ,然后进行测试:
我们看到的结果,其中 sharding_id 对应的值分别为 0、1、2 的记录分别插入到 db1、db2、db3 中。
auto-sharding-long
auto-sharding-long 表示按照既定的范围去存储数据。就是提前规划好某个字段的值在某个范围时,相应的记录存到某个 dataNode 中。
配置方式,首先修改路由规则:
然后去 rule.xml 中查看对应的算法了规则相关的配置:
可以看到,默认是按照 id 的范围来划分数据的存储位置的,对应的算法就是 rang-long 。
继续查看,我们可以找到算法对应的类,以及相关的配置文件名,这个配置文件也在 conf 目录下,打开并编辑该文件:
配置如上,其配置表示:
- 当 id 的取值在 0-5 之间时,将数据存储到 db1 中;
- 当 id 的取值在 5-10 之间时,将数据存储到 db2 中;
- 当 id 的取值在 10-1500M 之间时,将数据存储到 db3 中。
配置完成后,重启MyCat,测试:
根据上面的截图可以明确的看出来,该 auto-sharding-long 分片规则数据存储,其算法的配置文件,是左闭右开规则。