开发者学堂课程【全面讲解开源数据库中间件 MyCat 使用及原理(四):MyCat - 分片 - 思路分析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/758/detail/13327
MyCat - 分片 - 思路分析
思路分析
对于现在所做的案例是一个电商的案例,包含商品模块、订单模块以及日志模块。对于商品的订单以及日志,数据量相对来说非常大,特别是订单和数据,大的电商网站每天都会产生大量的订单。这时,单台服务器存储这些数据库表时可能会存在存储不足的问题。
1.当前数据库的存放情况:
Application (应用程序)直接访问单个数据库,随着业务量越来越大,数据库表结构中的数据量也越来越大。这时,数据库中存储的数据急剧膨胀,当单台服务器已经存储不下数据时,我们需要考虑到数据库的扩容。需要用到 MyCat 的分片,我们可以把原来的单个数据库进行分片,分割成多个数据库。通过 MyCat 的分片来实现数据的扩容。
2.垂直拆分
数据量过大,需要考虑扩容,可以通过 MyCat 来实现数据库表的垂直拆分,将同一块业务的数据库表拆分到同一个数据库服务中。拆分方式如下∶
对于当前案例,需先考虑垂直拆分。
首先,有一个逻辑库叫 v_shop,我们将在单个数据库中存储的表进行拆分,拆分到多个数据库中。比如,商品模块表存储到一个数据库,日志表存储到有一个数据库,订单模块表存储到一个实例中,以及基础信息表再存储到另外一个实例中。
相当于原来在单个数据库存储的内容现在分割到个数据库中存储,这样的话就可以完成扩容操作。
垂直拆分 ,各个 MySQL 存储的表结构是不一样的,根据业务模块将对于的数据存储到一个数据库中,用四台服务器部署分别存储。
在当前的订单查询当中,查询订单列表信息时,还查询了省份的信息:
回想做该块功能的流程:
OrderController 中调用的 findPage 方法,方法中调用了 search 层,search 层中调用了 TbOrder 的 search 方法。在映射配置文件中的 select 语句声明。
发现该 select 语句中,涉及到多表查询操作( order 表和 provinces 表),意味着在当前的拆分方式中,涉及跨库的 join 操作:
对应的解决方案在之前讲解过,回顾:
跨库的 Join 操作可以使用全局表、ER 表以及使用 catlet 自己实现。
最方便的方式是使用全局表。
3.全局表
含义:在系统中有一些基础信息,基础信息的数据量并不大,但是这些基础信息在其他的业务模块可能都会有所关联,这时就可以将基础信息的表设置为全局表,从而避免出现跨库的 Join 操作。
按照上述的方式进行表结构的拆分,可以解决扩容的问题,但是存在另一个问题:由于省、市、区县、数据字典表,在订单及商品等模块中都需要用到,还会涉及到多表连接查询,那么这个时候涉及到跨库的 join 操作,可以使用全局表来解决。结构图如下︰
(全局表指在 MySQL 的各个节点中都会存在)
设置全局表后,查询订单信息同时要查询订单对应的省份信息,省份信息在当前数据库中存在,所以不涉及跨库操作。
在当前的拆分方式中,可能会出现日志表,日志表记录的是当前各个为服务当中所产生的日志,这些日志每天都会有大量的数据产生,那么长年累月这张表的数据量将会变得非常大,大到数据库的磁盘存储不了一张表,那么就会用到水平拆分。
4. 水平拆分
垂直拆分和水平拆分的区别:垂直拆分是各个数据库节点中表结构不一样,按照业务模块进行拆分各个数据库节点中存储的表结构不一样,对于水平拆分,各个数据库中存储的表结构一样,但是数据不一样。
原来是三个数据库,现在增加了一个数据库,然后在原有基础上对 operatelog 进行水平拆分,也就是第三排数据库和第四排数据库中都有 operatelog 这张表,但是这两个表结构中存储的数据是不一样的。最终当前的案例在进行上线时,所以 MyCat 进行分库分片操作。