开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(一):MyCat-入门-核心概念-分片】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/755/detail/13243
MyCat-入门-核心概念-分片
内容介绍:
一、课程总述
二、垂直(纵向)切分
三、水平(横向)切分
四、MyCat 分片策略
一、课程总述:
核心概念,第一个分片,第二个逻辑库,第三个逻辑表,第四个分片节点、第五个节点主机和最后一个分片规则。
分片在前面也提到过,我们业务系统的数据是要存放在数据库中的,而数据库的数据又是存放在磁盘中的。随着业务系统运行,数据库表结构中的数据量越来越大,像比较繁忙的业务系统,每天都会插入大量的数据,数据库上的数据都是存放在磁盘上的,磁盘满了,我们可以加磁盘,但是总有加满的一天,这时我们需要考虑到分片。
这是我们原有的数据库,这个数据库磁盘满了之后,我们可以考虑分片,将原有的数据库当中的数据可以分散到多个数据库。
下面三个数据库存储的内容不一样,从而达到扩容的作用。原来在一个服务器中存储,现在在三个服务器中存储。假如随着业务系统的运行,数据量越来越大,这时在增加一排服务器,在把数据量往第四排服务器中存储,下面四排服务器当中的数据组合起来,才形成了一个完整的数据库当中的数据,那么下面四个数据库实际上就是分片。
分片简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。
数据的切分按照切分的规则,可以分为两种切分类型。第一种叫垂直切分,第二种叫水平切分。
二、垂直(纵向)切分
一种是按照不同的表(或者)来切分到不同的数据库(主机)之上,这种切分可以称之为数据的垂直(纵向)切分。
应用系统,原来是访问单个数据库,现在变了,因为单个数据库的容量有限,我们需要将数据均匀分散到多个数据库当中。垂直切分会将原有的数据库当中的数据均匀或者说按照我们的业务分散到不同的数据库的主机上。比如我们原有的数据库上包含了用户的、订单的、支付的,包含了这三个模块的结构。按照垂直切分的方式,会将这三个模块的表结构进行切分,第一个数据库只存放用户系统的数据库,第二个只存放订单系统的数据表,第三个支付系统只存放支付系统相关的表,也就是说每一个数据库只管一块的业务,这样就相当于把原有的一个大的数据库切分成了三个小的数据库,而这三个分片数据库当中的数据是不一样的,而且表结构也不一样,这就是第一种切分方式,叫垂直切分。
垂直切分最大的特点就是各个分片当中它的数据库表结构是不一样的。
三、水平(横向)切分
第二种叫水平切分,既然有了垂直切分,为什么还要使用水平切分呢?这时我们来看一个现象,以如上图为例:刚才提到了,当数据量比较大的时候,我们需要考虑分片,这个时候订单系统,我们的订单库每一天可能要会插入上百万或几百万个系统,陈年累积这个数据库的磁盘也会占满,订单系统总有占满的一天。此时,如果订单系统的数据量比较大,这个时候,他的磁盘容量就会占满,此时我们又要考虑切分,但是我们就不能考虑垂直切分了,因为垂直切分每一个结构它的表节点是不一样的,订单就一张表,只切分到了一个数据库当中。
基于这种现象,我们要用到第二种切分方式,叫做水平切分,水平切分指的是将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面。
我们原有的订单表数据量比较大,这个时候,我们针对订单表来进行切分,切分成若干个数据库。订单原来是一个数据库,现在切分成三个数据库。如果用户的数据量比较大,用户原来是一个数据库,现在也切分成了三个数据库。
如果是水平切分,第一个订单系统,第二个订单系统,第三个订单系统,他们里面存储的表结构相同,这三个结构中表结构一样,都是订单表,那他们存放的数据有一样吗?他们里面存放的数据是不同的,从而来完成扩容。
垂直切分各个节点,各个数据库主机当中,他们的表结构是不同的,而水平切分,各个节点当中他们的表结构是相同的。
四、MyCat 分片策略
MyCat 分片策略如图:
最上面是一个 schema,这个 schema 在 MyCat 当中叫逻辑库,是一个逻辑上的数据库,数据库当中存储的是数据表。他下面有两张表,一个是 table A,一个是 table B。table A 我们叫逻辑表,table B 也叫逻辑表,也就是说,一个数据库当中包含了一个逻辑表 A 也包含了一个逻辑表 B。对于一张表来说,他的数据量可能会比较大,我们需要考虑到切分,这个时候,table A 又进行了一个切分,分成了Datanode1和Datanode 2。 table A 当中的数据会存放在两个数据节点中,DataNode 叫数据节点。两个数据节点,一个是Datanode 1,一个是 Datanode 2。这两个数据节点中,它存放的表或它想关联的表都是 table A,而 table B 它所关联的两个数据节点,一个是 Datanode 3,一个是Datanode 4,他们关联的都是 table B 这张表。
table A 中的数据将会分散存储在 Datanode1第一个数据节点和Datanode 2 第二个数据节点。table B 中的数据将会分散存储在 Datanode 3 和 Datanode 4 这两个数据节点。数据节点只是一个逻辑上的概念,最终表结构中的数据是要存放在数据库当中的,这时 table A 中的数据分散存储在 Datanode1 和 Datanode 2,最终存放在 192.128 和 192.129 这两个数据库,也就是说一张表的数据分散存储在两个数据库当中,从而完成扩容。table B 中的数据关联的是 Datanode 3和Datanode 4 这两个数据节点,最终存放在 192.130 和 192.131 这两台数据库上。
整体上看这个结构,最终会有一个完整的逻辑库,逻辑库中包含了两张逻辑表table A 和 table B 最终 table A 和 table B 中的数据要存放在底层的数据库,这个底层的数据库可以理解为 MySQL 。
如上图虚线以上的是逻辑结构图,虚线以下的是物理结构图。
逻辑结构图指的就是逻辑库、逻辑表、数据节点,物理结构图就是具体真正存储数据的 MySQL。