分为水平分表和水平分库,我们这节课演示的是水平分表 场景: 在业务系统中,有一张表(日志表),业务系统每天都会产生大量的日志数据,单台服务器的数据存储及存储能力是有限的, 现需要对数据库表进行拆分(水平分表)
共要准备三台数据库服务器。分别在三台数据库服务器中创建数据库shuiping_fenbiao
1、第一台: 192.168.127.138
2、第二台: 192.168.127.149
3、第三台: 192.168.127.150
这节课我们配置第一台服务器的schema.xml文件时,不删除上节课SHOPPING数据库的任何数据,只是在上节课的基础上进行添加, 看一下等下在第一台服务器登录mycat的时候,能不能有权访问SHOPPING、SHUIPING_FENBIAO
注意SHOPPING ≠ shopping。原因:shopping是我们自定义的数据库名,并不是关键字,所以是严格区分大小写的 注意SHUIPING_FENBIAO ≠ shuiping_fenbiao。原因:shuiping_fenbiao是我们自定义的数据库名,并不是关键字,所以是严格区分大小写的
由于是水平分表,所以我们要在第一台服务器的schema.xml文件的<schema标签里面的table标签指定rule分片规则,我们在a_128_0 课的时候,指定的rule为"auto-sharding-long",代表的意思是根据主键范围进行分片,例如主键值(id值)在0~500万的时候,数据就会 在第一台服务器存储,在500~1000万的时候,数据就会在第二台服务器存储,...。如果我们需要数据均匀分散的存储在三台服务器上, 怎么办呢,只需要把rule分片规则设置为"mod-long"即可
启动mycat服务(注意mycat启动之后,会占用端口号8066,我们只要访问8066端口对应的服务即可) 切换到mycat的安装目录,执行如下指令:
#停止
cd /usr/local/mycat && bin/mycat stop
#启动
cd /usr/local/mycat && bin/mycat start
#通过查看mycat日志文件来验证是否启动成功。日志末尾为successfully表示启动成功、Wrapper Stopped表示启动失败
cd /usr/local/mycat && tail -f logs/wrapper.log
1、在第一台服务器的MyCat需要进行如下配置。详细见'模板'文件(我会写好发出来)
cd /usr/local/mycat/conf && vim schema.xml
2、在第一台服务器的MyCat需要进行如下配置。详细见'模板'文件(我会写好发出来)
cd /usr/local/mycat/conf && vim server.xml
3、在第一台服务器重新启动mycat
cd /usr/local/mycat && bin/mycat stop
cd /usr/local/mycat && bin/mycat start
#通过查看mycat日志文件来验证是否启动成功。日志末尾为successfully表示启动成功、Wrapper Stopped表示启动失败
cd /usr/local/mycat && tail -f logs/wrapper.log
4、在第一、二、三台服务器创建shuiping_fenbiao数据库
5、在第一台服务器上登录mycat
mysql -h 192.168.127.138 -P 8066 -u root -p123456
6、查看mycat里面有哪些数据库
show databases;#有SHOPPING、SHUIPING_FENBIAO数据库(就是上面第1步那里配置的schema.xml文件我们写的)
7、查看SHUIPING_FENBIAO数据库有哪些表
use SHUIPING_FENBIAO;#SHUIPING_FENBIAO数据库才是我们这节课的重点,我们要在SHUIPING_FENBIAO数据库实现水平分表
show tables;#里面有tb_log逻辑表表。目前tb_log表是空表,我们还没有导入表结构、表数据进去
8、手动把tb_log的表结构、表数据命令粘贴到终端。命令如下
CREATE TABLE tb_log (
id bigint(20) NOT NULL COMMENT 'ID',
model_name varchar(200) DEFAULT NULL COMMENT '模块名',
model_value varchar(200) DEFAULT NULL COMMENT '模块值',
return_value varchar(200) DEFAULT NULL COMMENT '返回值',
return_class varchar(200) DEFAULT NULL COMMENT '返回值类型',
operate_user varchar(20) DEFAULT NULL COMMENT '操作用户',
operate_time varchar(20) DEFAULT NULL COMMENT '操作时间',
param_and_value varchar(500) DEFAULT NULL COMMENT '请求参数名及参数值',
operate_class varchar(200) DEFAULT NULL COMMENT '操作类',
operate_method varchar(200) DEFAULT NULL COMMENT '操作方法',
cost_time bigint(20) DEFAULT NULL COMMENT '执行方法耗时, 单位 ms',
source int(1) DEFAULT NULL COMMENT '来源 : 1 PC , 2 Android , 3 IOS',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('1','user','insert','success','java.lang.String','10001','2022-01-06 18:12:28','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','insert','10',1);
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('2','user','insert','success','java.lang.String','10001','2022-01-06 18:12:27','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','insert','23',1);
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('3','user','update','success','java.lang.String','10001','2022-01-06 18:16:45','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','update','34',1);
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('4','user','update','success','java.lang.String','10001','2022-01-06 18:16:45','{\"age\":\"20\",\"name\":\"Tom\",\"gender\":\"1\"}','cn.itcast.controller.UserController','update','13',2);
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('5','user','insert','success','java.lang.String','10001','2022-01-06 18:30:31','{\"age\":\"200\",\"name\":\"TomCat\",\"gender\":\"0\"}','cn.itcast.controller.UserController','insert','29',3);
INSERT INTO tb_log (id, model_name, model_value, return_value, return_class, operate_user, operate_time, param_and_value, operate_class, operate_method, cost_time,source) VALUES('6','user','find','success','java.lang.String','10001','2022-01-06 18:30:31','{\"age\":\"200\",\"name\":\"TomCat\",\"gender\":\"0\"}','cn.itcast.controller.UserController','find','29',2);
9、此时去datagrip软件,看我们的第一、二、三台服务器的shuiping_fenbiao数据库 会发现第一台服务器的shuiping_fenbiao表有2条数据 会发现第二台服务器的shuiping_fenbiao表有2条数据 会发现第三台服务器的shuiping_fenbiao表有2条数据 原因: 我们在第1步配置schema.xml文件时的rule分片规则设置为了"mod-long",表示的就是: 数据均匀分散的存储在三台服务器上