环境搭建
运行下面注释语句,创建四个数据源,我这里128和129主机各创建一个读一个写的数据源
/*+ mycat:createDataSource{
"name":"dw0",
"url":"jdbc:mysql://192.168.50.128:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"root",
"password":"123456"
} */
/*+ mycat:createDataSource{
"name":"dr0",
"url":"jdbc:mysql://192.168.50.128:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"root",
"password":"123456"
} */
/*+ mycat:createDataSource{
"name":"dw1",
"url":"jdbc:mysql://192.168.50.129:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"root",
"password":"123456"
} */
/*+ mycat:createDataSource{
"name":"dr1",
"url":"jdbc:mysql://192.168.50.129:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"root",
"password":"123456"
} */
查看是否创建成功
/*+ mycat:showDataSources{} */
创建c0、c1两个集群,dw0、dr0作为一个集群,dw1、dr1作为一个集群
MyCat规定集群用c开头,数字为后缀,所以我们配置了c0、c1两个集群,后面创建分片表,会自动选择这两个数据源创建分片的库和表
/*! mycat:createCluster{"name":"c0","masters":["dw0"],"replicas":["dr0"]} */
/*! mycat:createCluster{"name":"c1","masters":["dw1"],"replicas":["dr1"]} */
查看集群是否创建成功
/*+ mycat:showClusters{} */
重启MyCat
./mycat restart
在MyCat中创建数据库,名称还是mydb1(因为前面MySQL配置了主从复制,只复制mydb1,所以这里还是叫mydb1,让129从机也能同步创建)
create database mydb1;
创建成功
广播表(全局表)
广播表是冗余在每个数据库中的公共表,具有全量的数据
创建一张字典表,在建表语句后加上BROADCAST,表示广播表
# mycat默认全局序列采用雪花算法
# 指定主键自增auto_increment时,主键默认填充雪花算法产生自增值
# 若想要使用mysql自身的递增,则不指定为自增字段auto_increment
create table mydb1.dict(
id bigint not null auto_increment primary key,
dict_code varchar(255) default null,
dict_name varchar(255) default null
) ENGINE=INNODB DEFAULT CHARSET=utf8 BROADCAST;
分片表
创建一张order订单分片表,执行下面语句
create table mydb1.t_order(
order_id bigint not null auto_increment,
order_no varchar(255),
user_id varchar(255),
amount decimal(10,2),
primary key(order_id)
) ENGINE=INNODB DEFAULT CHARSET=utf8
dbpartition BY mod_hash(user_id) tbpartition BY mod_hash(user_id) tbpartitions 1 dbpartitions 2;
其中dbpartition BY mod_hash(user_id) tbpartition BY mod_hash(user_id) tbpartitions 1 dbpartitions 2
dbpartition BY mod_hash(user_id)表示通过user_id字段取模来分库
tbpartition BY mod_hash(user_id)表示通过user_id字段取模来分表
tbpartitions 1 dbpartitions 2表示分到2个数据库中,每个数据库1张分片表
执行后刷新两个数据库
可以看到两台数据库按照后缀数字创建了两个物理库
下面插入几条数据查看一下情况
insert into t_order(order_id,order_no,user_id,amount) value(1,"123","100",200);
insert into t_order(order_id,order_no,user_id,amount) value(2,"123","100",300);
insert into t_order(order_id,order_no,user_id,amount) value(3,"123","101",600);
insert into t_order(order_id,order_no,user_id,amount) value(4,"123","101",800);
insert into t_order(order_id,order_no,user_id,amount) value(5,"123","100",500);
insert into t_order(order_id,order_no,user_id,amount) value(6,"123","101",300);
分别打开128、129两台数据库上的order表
128数据库上的t_order_0表
129数据库上的t_order_1表
可以发现,两个数据库的oder表中的数据,分别按照user_id取模后的结果来存放
再打开mycat的order表
其中的数据并不是按照我们插入的顺序显示的,而是t_ordr_0和t_order_1的拼接
接下来,创建一张t_order_detail表,存放订单的明细数据,与t_order表关联
create table mydb1.t_order_detail(
order_detail_id bigint not null auto_increment,
order_id bigint,
goods_name varchar(255),
primary key(order_detail_id)
) ENGINE=INNODB DEFAULT CHARSET=utf8
dbpartition BY mod_hash(order_id) tbpartition BY mod_hash(order_id) tbpartitions 1 dbpartitions 2;
插入一些关联的数据
insert into t_order_detail(order_id,goods_name) value(1,"苹果");
insert into t_order_detail(order_id,goods_name) value(1,"西瓜");
insert into t_order_detail(order_id,goods_name) value(2,"苹果");
insert into t_order_detail(order_id,goods_name) value(3,"橘子");
insert into t_order_detail(order_id,goods_name) value(4,"香蕉");
insert into t_order_detail(order_id,goods_name) value(5,"牛油果");
insert into t_order_detail(order_id,goods_name) value(5,"猕猴桃");
insert into t_order_detail(order_id,goods_name) value(6,"猕猴桃");
我们打开t_order_detail_0和t_order_detail_1两张表看一下数据
因为t_order_detail表是按照order_id取模分表的,所以保证了同一张订单的明细数据都在一张表中
执行下面连表查询语句,看看能否将数据关联查询出来
select * from t_order o left join t_order_detail od on o.order_id = od.order_id
显然是可以的,因为MyCat将order和order_detail作为一个具有关联关系的ER表
我们可以通过下面语句查看表的关系
/*+ mycat:showErGroup{} */
MyCat把具有关联关系的order和order_detail分为了同一组
分片规则
MOD_HASH:取模运算,支持数值、字符串类型
RIGHT_SHIFT:右移哈希,支持数值类型
YYYYMM:按年月,支持DATE、DATETIME
YYYYWEEK:按年周,支持DATE、DATETIME
YYYYDD:按年日,支持DATE、DATETIME
MMDD:按月日,支持DATE、DATETIME
STR_HASH:字符串哈希,支持字符串类型