这节课我们以一个需求,来演示通过MyCat中间件如何来完成分片操作
需求: 由于tb_order表中的数据很大,磁盘IO及容量都到达了瓶颈,现在需要对tb_order表进行数据分片,分为三个数据节点, 每个节点主机位于不同的服务器上。简单理解就是tb_order表的数据被分成了三份,分别在三台数据库服务器,每份的 表结构是一样的,但是表结构里面存放的数据是不一样的,也就是要求我们对tb_order表进行水平分表
环境准备
1、第一台服务器(192.168.127.138): 安装MySQL、JDK、MyCat。作为MyCat中间件服务器,同时也作为分片服务器
2、第二台服务器(192.168.127.145): 安装MySQL。作为分片服务器
3、第三台服务器(192.168.127.149): 安装MySQL。作为分片服务器
4、第四台服务器(192.168.127.150): 安装MySQL。作为分片服务器
启动mycat服务(注意mycat启动之后,会占用端口号8066,我们只要访问8066端口对应的服务即可) 切换到mycat的安装目录,执行如下指令:
#启动
cd /usr/local/mycat && bin/mycat start
#停止
cd /usr/local/mycat && bin/mycat stop
#通过查看mycat日志文件来验证是否启动成功。日志末尾为successfully表示启动成功、Wrapper Stopped表示启动失败
cd /usr/local/mycat && tail -f logs/wrapper.log
登录mycat 服务mycat和服务mysql是一样的,可以把mycat就看做是mysql,登录进去后使用的命令也是跟mysql一样
xxxxxxxxxx
mysql -h 192.168.127.138 -P 8066 -uroot -p123456
登录进去会发现跟mysql好像差不多,注意区别: 看登录后的提示显示'Server version: 5.6.29-mycat-1.6.7.3-release-20210913163959 MyCat Server
1、在第二、三、四服务器的mysql服务上都创建db01数据库
2、在第一台服务器进行分片配置(cd /usr/local/mycat/conf && vim schema.xml): 详细见'模板'文件(我会写好发出来)
3、在第一台服务器进行分片配置的mycat用户及其用户的权限信息(cd /usr/local/mycat/conf && vim server.xml): 见'模板'文件(我会写好发出来)
4、在第一台服务器启动mycat
xxxxxxxxxx
cd /usr/local/mycat && bin/mycat start
cd /usr/local/mycat && tail -f logs/wrapper.log
5、登录mycat。访问需要的用户和密码,我们是在server.xml配置的,就是上面第3步那里配置过的
mysql -h 192.168.127.138 -P 8066 -uroot -p123456
6、查看mycat里面有哪些数据库
show databases;#只有一个DB01数据库(就是上面第2步那里配置的schema.xml文件我们写的)
7、查看DB01数据库有哪些表
use DB01;
show tables;#只有一个tb_order表(就是上面第2步那里配置的schema.xml文件我们写的)
8、简单来玩一下。1个create命令,6个insert命令。在mycat中来创建表,并往表结构中插入数据,查看数据在不同分片节点服务器MySQL中的分布情况
create table tb_order(
id bigint(20) not null,
title varchar(100) not null,
primary key (id)
)engine=innodb default charset=utf8;
insert into tb_order(id,title) values(1,'goods1');
insert into tb_order(id,title) values(2,'goods2');
insert into tb_order(id,title) values(3,'goods3');
insert into tb_order(id,title) values(1000000,'goods1000000');
insert into tb_order(id,title) values(10000000,'goods10000000');
insert into tb_order(id,title) values(12000000,'goods12000000');
我们是在'第一台服务器'的mycat里面执行上面的create命令, 会发现创建的表结构(也就是表的字段)会同时同步在第二、三、四台机器上, 原因是我们的是水平分表
我们是在'第一台服务器'的mycat里面执行上面的前3个insert命令, 会发现产生的数据都在'第二台机器'上,思考为什么不会平均分散到第二、三、四台及其上呢 原因:数据怎么分配取决于我们在上面第2步配置的schema.xml文件,里面有一个'rule',表示'分片规则' (1)rule: auto-sharding-long表示id值在0~500百万,那么会存放在第一个节点服务器(第二台机器)。id值在500百万~1000万,会存放到第二个节点,...
我们是在'第一台服务器'的mycat里面执行上面的后3个insert命令, 会发现产生的数据在第二、三、四台机器上分别有一条数据。原因同上
注意是不同步到'第一台服务器'的,感觉非常奇妙。因为我们配置第2步配置的schema.xml文件时,指定了分片节点服务器为第二、三、四台服务器
9、如何修改第8步的分片规则,就是我们想自己指定'哪个范围的数据'会分配给'哪个分片MySQL服务器'
xxxxxxxxxx
cd /usr/local/mycat/conf && vim autopartition-long.txt
为什么我们需要自己修改: 原因: (1)我们只在第2步的schema.xml文件配置了三台分片MySQL服务器,也就是id值的上限默认是1500万,当id值大于这个数就会报错, 当我们业务中需要插入id值是大于1500万的话,我们就修改这个默认值(500万为单位递增),修改为每700万单位递增,或者每1000万数据就存到下一个 分片服务器 (2)当我们业务中的数据远没有500万的时候,数据就会全部只存到'第二台服务器',那我们的第三、四台服务器就会被闲置,造成浪费资源。我们就可以 给默认值(500万)调低一些,比如我们业务实际只有20万数据,那么分库分表的话,这个默认只为7万即可。当数据的id值是0~7万就会存入'第二台服务器', 当数据的id值是7万~14万就会存入'第三台服务器',当数据的id值是14万~21万数据就会存入'第三台服务器'。后续数据的id值超过21万的话,就在schema.xml 文件里面再增加一台分片服务器即可,然后在autopartition-long.txt文件添加一条默认值记录
到这里就完成啦,下几节课开始我们会详细讲mycat配置、mycat分片、分片规则。这节课是笼统的讲一下全部知识点,好有个概况 ps: 知识点有点撑,我一下午就只完成了这节课的笔记,任重道远,如果不会的话,没关系,下一节课会详细讲其中的知识点