Mycat分库分表之取模分片
一、取模分片
在业务系统中,有一张日志表,业务系统每天都会产生大量的日志数据,单台服务器的数据存储即处理能力是有限的,可以对数据库表进行拆分,这时候就可以使用取模分片的策略
说明1:每个表的结构一致
说明2:每个表的数据不同
说明3:所有表的合集才是完整的数据
二、准备工作
在192.168.3.90,192.168.3.91,192.168.92 三台MySQL服务器上创建hl_logs数据库
三、配置schema.xml
说明1:之前的schema.xml已经配置过其他的schema,dataNode等标签都不用动,直接新增我们本次案例需要的就行了,多个标签只要不冲突是可以并存的
说明2:逻辑库为hl_logs
说明3:逻辑表为tb_logs
说明4:数据节点为dn4,dn5,dn6
说明5:数据节点dn4,dn5,dn6需要的数据库配置也是dbhost1,dbhost2,dbhost3,是可以共用的。
说明6:取模分片规则使用的是 rule="mod-long" 规则,该规则在rule.xml有定义如下
说明7:继续看 function 中 mod-long 的定义
说明8:这里的count 3的意思是 id主键 按照和3进行取模运算,然后根据取模后的结果,将数据写入到不同的数据节点
说明9:我这里整好配置了三个数据节点,而这里的默认值也是3,所以不用改了,如果我们想要将数据按照取模运算写到4个数据节点上,则这里的count需要改为4
四、配置server.xml
说明1:root 这个用户可以访问 shopping 和 hl_logs 两个数据库
说明2:而 user 这个用户只能访问 shopping 这个数据库
说明3:我现在测试的都是使用 root 这个账户,所以 user 这个可以不用配置
五、取模分片测试
首先重启Mycat
登录Mycat
查看逻辑库和逻辑表
这里的tb_logs只是逻辑库,而在MySQL中还并没有tb_logs这个表,需要在Mycat中创建
create table tb_logs (id int auto_increment primary key, model_name varchar(200), operate_user varchar(20), operate_time varchar(19));
插入一条数据,然后查看数据节点中对应的数据变化
insert into tb_logs (id, model_name, operate_user, operate_time) values (1, '访问首页','张三', '2023-12-17 21:52:54');
说明1:id=1的数据,按照mod-long的算法,会用 1%3=1, 因为 和3取模 的结果只有 0,1,2, 所以结果为0时, 数据将写在第一个数据节点,结果为1时,结果会保存在第二个数据节点,结果为2时,保存在第三个数据节点上,而 1%3=1 ,所以id=1的数据写在了192.168.3.91第二个数据节点上。
说明2:第二个数据节点即192.168.3.91这个节点,所以id=1的数据只写入到这个数据节点上,其他节点上还没有数据。
继续验证
insert into tb_logs (id, model_name, operate_user, operate_time) values (2, '访问详情页','李四', '2023-12-17 22:55:24');
说明3:按照mod-long算法,id=2的数据被写入到192.168.3.92,第三个数据节点上,成功,继续验证。
insert into tb_logs (id, model_name, operate_user, operate_time) values (3, '访问评论页','王五', '2023-12-17 22:03:34');
说明4:按照mod-long算法,id=3的数据被写入到192.168.3.90,第1个数据节点上,成功,继续验证。
insert into tb_logs (id, model_name, operate_user, operate_time) values (4, '访问首页','赵六', '2023-12-17 22:09:34');
说明5:按照mod-long算法,id=4的数据被写入到192.168.3.91,第二个数据节点上,成功。
说明6:在Mycat上进行查询的数据是,所有数据节点的全集。取模分片是水平分库分表的一种方式。