一、概述
数据分片,主要是优化大表,将数据按特定规则分散到不同库的同一张表内。除此之外,类似多租户的场景,也可以使用数据分片,将同一个租户的数据放在同一个数据库中,这样可以做到物理数据隔离。
二、配置
在Mycat2中,配置逻辑架构大致如下:
注意:在mycat2中,集群和逻辑库没有强配置关系,但集群名称要有规律,这样逻辑库使用时才能按规则使用集群。
步骤:
1、准备两个集群,每个集群配置为读写分离(参照《Mycat2 读写分离配置》),集群名称分别为c0和c1
2、Navicat连接mycat2,执行
-- 建库
CREATE DATABASE db1
-- 切换db1
USE `db1`;
-- 创建分片表
CREATE TABLE db1.`travelrecord` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` varchar(100) DEFAULT NULL,
`traveldate` date DEFAULT NULL,
`fee` decimal(10,0) DEFAULT NULL,
`days` int DEFAULT NULL,
`blob` longblob,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by mod_hash(id) tbpartition by mod_hash(id) tbpartitions 2 dbpartitions 2;
dbpartition by mod_hash(id) tbpartition by mod_hash(id) tbpartitions 2 dbpartitions 2
以上意思是数据库分片规则是 mod_hash(id),表分片规则是 mod_hash(id),总共分表2个(同一个库2个表,通过后缀区分),分库2个。
3、增加测试数据
INSERT INTO `db1`.`info` ( `user_id`, `traveldate`, `fee`, `days`, `blob`) VALUES ( '1', '2022-08-11', 1, 1, NULL);
INSERT INTO `db1`.`info` ( `user_id`, `traveldate`, `fee`, `days`, `blob`) VALUES ( '1', '2022-08-11', 1, 1, NULL);
INSERT INTO `db1`.`info` ( `user_id`, `traveldate`, `fee`, `days`, `blob`) VALUES ( '1', '2022-08-11', 1, 1, NULL);
INSERT INTO `db1`.`info` ( `user_id`, `traveldate`, `fee`, `days`, `blob`) VALUES ( '1', '2022-08-11', 1, 1, NULL);
INSERT INTO `db1`.`info` ( `user_id`, `traveldate`, `fee`, `days`, `blob`) VALUES ( '1', '2022-08-11', 1, 1, NULL);
INSERT INTO `db1`.`info` ( `user_id`, `traveldate`, `fee`, `days`, `blob`) VALUES ( '1', '2022-08-11', 1, 1, NULL);
INSERT INTO `db1`.`info` ( `user_id`, `traveldate`, `fee`, `days`, `blob`) VALUES ( '1', '2022-08-11', 1, 1, NULL);
INSERT INTO `db1`.`info` ( `user_id`, `traveldate`, `fee`, `days`, `blob`) VALUES ( '1', '2022-08-11', 1, 1, NULL);
INSERT INTO `db1`.`info` ( `user_id`, `traveldate`, `fee`, `days`, `blob`) VALUES ( '1', '2022-08-11', 1, 1, NULL);
INSERT INTO `db1`.`info` ( `user_id`, `traveldate`, `fee`, `days`, `blob`) VALUES ( '1', '2022-08-11', 1, 1, NULL);
INSERT INTO `db1`.`info` ( `user_id`, `traveldate`, `fee`, `days`, `blob`) VALUES ( '1', '2022-08-11', 1, 1, NULL);
INSERT INTO `db1`.`info` ( `user_id`, `traveldate`, `fee`, `days`, `blob`) VALUES ( '1', '2022-08-11', 1, 1, NULL);
三、验证
查询mycat2中表travelrecord的数据
查看分库情况:
查看分表情况
注意以上表id列,mycat2使用雪花算法生成全局唯一自增的序列号,并非使用mysql自带的从0自增的序列号。
有兴趣的大佬大神可以关注下小弟的微信公共号,一起学习交流,扫描以下二维码关注即可。