垂直拆分

 

分为垂直分表和垂直分库,我们这节课演示的是垂直分库 场景:在业务系统中,设计以下表结构,但是由于用户与订单每天都会产生大量的数据,单台服务器的数据存储及处理能力是有限的,可以对 数据库进行拆分,原有的数据库表如下:

 

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的安装目录,执行如下指令:

 

 

具体过程

 

1、在第一台服务器的MyCat需要进行如下配置。详细见'模板'文件(我会写好发出来)

 

2、在第一台服务器的MyCat需要进行如下配置。详细见'模板'文件(我会写好发出来)

 

3、在第一台服务器重新启动mycat

 

4、在第一台服务器上登录mycat

 

5、查看mycat里面有哪些数据库

 

6、查看SHOPPING数据库有哪些表

 

7、给上面的13个表插入数据。使用脚本(我会放到模板文件那里),拿到之后把脚本放到/root目录下面,在上面第6步之后接着执行如下

 

8、此时在datagrip软件(或直接在终端&命令行)去第一、二、三台服务器看看shopping表,数据就出来了

 

9、演示到这步就算是结束垂直分库啦,下面的就是演示一些特殊的情况,也就是在多表查询的场景下,来查询我们上面导入的数据

 

10、如下

(1) 在第一台服务器(登录进mysql即可)、第二台服务器(登录进mysql即可)、第三台服务器(登录进mysql即可)里面查询用户的 收件人及收件人地址信息(包含省市区)

特点: 多表联查涉及的表都在同一台服务器 选中如下四行并执行,在三台服务器都执行一下,看能不能查,会不会报错。总结: 都能查,不报错

 

(2) 在第一台服务器(登录进mysql即可)、第二台服务器(登录进mysql即可)、第三台服务器(登录进mysql即可)里面查询每 一笔订单及订单的收件地址信息(包含省市区)

特点: 多表联查涉及的表都在多台服务器当中 选中如下四行并执行,在三台服务器都执行一下,看看有什么区别。总结: 都报错,不能执行成功

原因: mycat底层的路由(route),在为SQL语句进行路由的时候,发现SQL语句当中关联的表在不同的分片中(不同服务器),就会、 导致mycat不知道要路由到哪个分片

 

解决: 需要涉及到'全局表'的配置。对于省、市、区/县表: tb_areas_provinces、tb_areas_city、tb_areas_region,是属于'数据字典表', 在多个业务模板中都可能会遇到,可以将其设置为'全局表',利于业务操作

 

什么是字典表: 其实就是比较常用的表,就统称为字典表,例如省、市、区/县表 什么是全局表: 在每一个分片(也就是每一台服务器)中,都有这个表

 

 

如何将表配置为全局表,具体做法如下

 

第一步: 在第一台服务器root@localhost ~,进行配置。在<table标签那里加一个属性type,并把值写为global,即type="global" 并在<table标签把dataNode修改为"dn1,dn2,dn3"代表这张表会同时在三台分片服务器都存在。该配置文件我也打包放在模板文件了

 

第二步: 在第一(登录进mysql,不是登录进mycat)、二、三台服务器分别都删除shopping数据库,并重新创建一个shopping数据库

 

第三步: 在第一台服务器[root@localhost ~]重启mycat

 

第四步: 在第一台服务器上登录mycat,并重新导入数据

 

第五步: 此时在datagrip软件(或直接在终端&命令行)去第一、二、三台服务器看看shopping表,数据就出来了

 

第六步: 重新执行'在第一台服务器(登录进mysql即可)、第二台服务器(登录进mysql即可)、第三台服务器(登录进mysql即可)里面查询每 一笔订单及订单的收件地址信息(包含省市区)'

 

在第一、二台服务器都能查了,不报错。第三台会报错是因为我们是按需把特定的表(省、市、区/县表)修改为了全局表, 第三台服务器如果要不报错的话,只需要把tb_order_master表也修改为全局表即可。我们在实际业务中,可以灵活的把我们 要多表联查,但是在当前服务器没有这个表的情况下,把我们需要的表设置为全局表,即可

最后,全局表还有一个特性,如下 在第一台服务器(登录进mysql即可),执行一个更新语句,会发现只有第一台服务器的数据发生了变化,第二、三台服务器的数据依旧没变

在第一台服务器(必须登录进mycat),执行一个更新语句,会发现第一、第二、三台服务器的数据都发生了变化

总结: 在mycat里面执行的操作会同步修改所以分片服务器里面所属的数据。另外不要单独在分片服务器进行数据更新,不然会导致数据的不一致 也就是当我们要修改数据时,要登录进mycat进行修改数据,不要登录进mysql进行修改数据