MySQL运维8-Mycat范围分表

一、范围分片

根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片。

说明1:范围分片会提前提供一个分片的范围默认是0-500万是一个分片,500万-1000万是一个分片,1000万-1500万是一个分片,超过1500万要重新设置。

说明2:这个范围我们可以根据自己的需要去自定义使用。

说明3:在配置schema.xml的时候,默认的分片规则 rule="auto-sharding-long" 就是范围分片规则

说明4:在rule.xml中有auto-sharding-long的定义,其分片的依据是 id 主键

说明5:在rule.xml中有auto-sharding-long的定义,其采用的算法是 rang-long 算法

说明6:在function rang-long中有一个property 属性,该属性引用了一个外部文件 "autopartition-long.txt" 文件,在这个文件中就是定义分片的范围,如果我们要实现自定义数据分片即修改该文件中的范围即可。

二、准备数据库

说明1:在三个数据数据节点上都先创建好需要使用的数据库range_db

三、配置schema.xml

说明1:新增schema标签,逻辑库的名称为range_db,逻辑表的名称为tb_range

说明2:分片规则为 rule="auto-sharding-long" 即范围分片

说明3:dn7,dn8,dn9对应的数据节点依然是dbhost1,dbhost2,dbhost3.

说明4:dbhost1数据节点为192,168.3.90

说明5:dbhost2数据节点为192.168.3.91

说明5:dbhost3数据节点为192.168.3.92

四、server.xml配置

说明1:给root用户添加range_db的操作权限

五、范围分片测试

首先重启Mycat

登录Mycat

查看逻辑库逻辑表

这里的tb_range只是逻辑库,而在MySQL中还并没有tb_range这个表,需要在Mycat中创建

复制代码
create table tb_range (id int auto_increment primary key, name varchar(20));

插入一条数据,然后查看数据节点中对应的数据变化

复制代码
insert into tb_range (id, name) values (1,'张三');

说明1:id=1的数据插入到了192.168.3.90的数据节点上了,我们采用的是默认的分片范围

说明2:继续添加一个id为5000000的数据看一下是否会继续插入到192.168.3.90这个数据节点上

复制代码
insert into tb_range (id, name) values (5000000,'李四');

说明3:没有问题,id=5000000的也插入到了第一个数据节点上,继续测试id=5000001的数据

复制代码
insert into tb_range (id, name) values (5000001,'王五');

说明4:id=5000001的数据,插入到了192.168.3.91第二个数据节点上了,说明5000000是第一个和第二个数据节点的分界线,我们在测试一下id=10000001

复制代码
insert into tb_range (id, name) values (10000001,'赵六');

说明5:id=10000001的数据插入到了192.168.3.92第三个数据节点上了。继续测试一下15000001这个id超过了分片范围,看看是否还能成功?

复制代码
insert into tb_range (id, name) values (15000001,'侯七');

说明6:这是就报错了,因为根据分片规则已经找不到15000001应该保存到那个分片了,如果要继续添加id的话,就需要在自定义去增加分片范围了,需要修改 "autopartition-long.txt"这个文件

修改了配置文件后,我们重新启动一下Mycat然后再次插入id=15000001数据试试

重新插入id=15000001的数据

复制代码
insert into tb_range (id, name) values (15000001,'侯七');

说明7:修改分片范围后,id=15000001的数据也可以保存了。

总结:如果使用范围分片的时候,如果默认的分片范围满足不了需求,我们只需要修改 "autopartition-long.txt" 这个文件即可。