分为垂直分表和垂直分库,我们这节课演示的是垂直分库 场景:在业务系统中,设计以下表结构,但是由于用户与订单每天都会产生大量的数据,单台服务器的数据存储及处理能力是有限的,可以对 数据库进行拆分,原有的数据库表如下:
tb_areas_city、tb_areas_provinces、tb_areas_region、tb_goods_base、tb_goods_brand、tb_goods_cat、tb_goods_desc、 tb_goods_item、tb_order_item、tb_order_master、tb_order_pay_log、tb_user、tb_user、tb_user_address
也就是将上面的那些表(都是存放到一个数据库的),由于一个数据库压力较大,需要将这些表拆分到多个数据库中,采用垂直分库 分析一下上面那些表可以怎么分类。例如前三个是代表'省市区'、往后五个是代表'商品'、往后三个是代表'订单'、最后两个是代表'用户' 我们现在把其中的'用户'和'省市区'放到同一个数据库服务器 ,把另外两个分别放到一个数据库服务器
共要准备三台数据库服务器。分别在三台数据库服务器中创建数据库shopping
1、第一台: 192.168.127.138
2、第二台: 192.168.127.149
3、第三台: 192.168.127.150
启动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
1、在第一台服务器的MyCat需要进行如下配置。详细见'模板'文件(我会写好发出来)
xxxxxxxxxx
cd /usr/local/mycat/conf && vim schema.xml
2、在第一台服务器的MyCat需要进行如下配置。详细见'模板'文件(我会写好发出来)
xxxxxxxxxx
cd /usr/local/mycat/conf && vim server.xml
3、在第一台服务器重新启动mycat
xxxxxxxxxx
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、在第一台服务器上登录mycat
mysql -h 192.168.127.138 -P 8066 -u root -p123456
5、查看mycat里面有哪些数据库
show databases;#只有一个SHOPPING数据库(就是上面第1步那里配置的schema.xml文件我们写的)
6、查看SHOPPING数据库有哪些表
use SHOPPING;
show tables;#有13个tb_...表(就是上面第1步那里配置的schema.xml文件我们写的),注意这些表是表结构,还没有插入数据
7、给上面的13个表插入数据。使用脚本(我会放到模板文件那里),拿到之后把脚本放到/root目录下面,在上面第6步之后接着执行如下
source /root/shopping-table.sql
source /root/shopping-insert.sql
8、此时在datagrip软件(或直接在终端&命令行)去第一、二、三台服务器看看shopping表,数据就出来了
9、演示到这步就算是结束垂直分库啦,下面的就是演示一些特殊的情况,也就是在多表查询的场景下,来查询我们上面导入的数据
10、如下
(1) 在第一台服务器(登录进mysql即可)、第二台服务器(登录进mysql即可)、第三台服务器(登录进mysql即可)里面查询用户的 收件人及收件人地址信息(包含省市区)
特点: 多表联查涉及的表都在同一台服务器 选中如下四行并执行,在三台服务器都执行一下,看能不能查,会不会报错。总结: 都能查,不报错
use shopping;
select ua.user_id,ua.contact,p.province,c.city,r.area,ua.address from
tb_user_address as ua, tb_areas_provinces as p, tb_areas_city as c, tb_areas_region as r where
ua.province_id = p.provinceid and ua.city_id = c.cityid and ua.town_id = r.areaid;
(2) 在第一台服务器(登录进mysql即可)、第二台服务器(登录进mysql即可)、第三台服务器(登录进mysql即可)里面查询每 一笔订单及订单的收件地址信息(包含省市区)
特点: 多表联查涉及的表都在多台服务器当中 选中如下四行并执行,在三台服务器都执行一下,看看有什么区别。总结: 都报错,不能执行成功
原因: mycat底层的路由(route),在为SQL语句进行路由的时候,发现SQL语句当中关联的表在不同的分片中(不同服务器),就会、 导致mycat不知道要路由到哪个分片
use shopping;
select order_id,payment,receiver,province,city,area from
tb_order_master as o, tb_areas_provinces as p, tb_areas_city as c, tb_areas_region as r where
o.receiver_province = p.provinceid and o.receiver_city = c.cityid and o.receiver_region = r.areaid;
解决: 需要涉及到'全局表'的配置。对于省、市、区/县表: tb_areas_provinces、tb_areas_city、tb_areas_region,是属于'数据字典表', 在多个业务模板中都可能会遇到,可以将其设置为'全局表',利于业务操作
什么是字典表: 其实就是比较常用的表,就统称为字典表,例如省、市、区/县表 什么是全局表: 在每一个分片(也就是每一台服务器)中,都有这个表
第一步: 在第一台服务器root@localhost ~,进行配置。在<table标签那里加一个属性type,并把值写为global,即type="global" 并在<table标签把dataNode修改为"dn1,dn2,dn3"代表这张表会同时在三台分片服务器都存在。该配置文件我也打包放在模板文件了
xxxxxxxxxx
cd /usr/local/mycat/conf && vim schema.xml
第二步: 在第一(登录进mysql,不是登录进mycat)、二、三台服务器分别都删除shopping数据库,并重新创建一个shopping数据库
drop database if exists shopping;
create database if not exists shopping;
第三步: 在第一台服务器[root@localhost ~]重启mycat
xxxxxxxxxx
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
第四步: 在第一台服务器上登录mycat,并重新导入数据
mysql -h 192.168.127.138 -P 8066 -u root -p123456
use SHOPPING;
source /root/shopping-table.sql
source /root/shopping-insert.sql
第五步: 此时在datagrip软件(或直接在终端&命令行)去第一、二、三台服务器看看shopping表,数据就出来了
第六步: 重新执行'在第一台服务器(登录进mysql即可)、第二台服务器(登录进mysql即可)、第三台服务器(登录进mysql即可)里面查询每 一笔订单及订单的收件地址信息(包含省市区)'
use shopping;
select order_id,payment,receiver,province,city,area from
tb_order_master as o, tb_areas_provinces as p, tb_areas_city as c, tb_areas_region as r where
o.receiver_province = p.provinceid and o.receiver_city = c.cityid and o.receiver_region = r.areaid;
在第一、二台服务器都能查了,不报错。第三台会报错是因为我们是按需把特定的表(省、市、区/县表)修改为了全局表, 第三台服务器如果要不报错的话,只需要把tb_order_master表也修改为全局表即可。我们在实际业务中,可以灵活的把我们 要多表联查,但是在当前服务器没有这个表的情况下,把我们需要的表设置为全局表,即可
最后,全局表还有一个特性,如下 在第一台服务器(登录进mysql即可),执行一个更新语句,会发现只有第一台服务器的数据发生了变化,第二、三台服务器的数据依旧没变
update tb_areas_provinces set province = '北京' where id = 1;
在第一台服务器(必须登录进mycat),执行一个更新语句,会发现第一、第二、三台服务器的数据都发生了变化
update tb_areas_provinces set province = 'ikun' where id = 2;
总结: 在mycat里面执行的操作会同步修改所以分片服务器里面所属的数据。另外不要单独在分片服务器进行数据更新,不然会导致数据的不一致 也就是当我们要修改数据时,要登录进mycat进行修改数据,不要登录进mysql进行修改数据