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的数据也可以保存了。
说明8:如果使用范围分片的时候,如果默认的分片范围满足不了需求,我们只需要修改 "autopartition-long.txt" 这个文件即可。
说明9:在Mycat上进行查询的数据是所有数据节点的全集。范围分片是水平分库分表的一种方式。
侯哥语录:我曾经是一个职业教育者,现在是一个自由开发者。我希望我的分享可以和更多人一起进步。分享一段我喜欢的话给大家:"我所理解的自由不是想干什么就干什么,而是想不干什么就不干什么。当你还没有能力说不得时候,就努力让自己变得强大,拥有说不得权利。"