开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(一):MyCat-入门-核心概念-相关概念】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/755/detail/13244
MyCat-入门-核心概念-相关概念
内容介绍:
一、逻辑库(schema)
二、逻辑表(table)
三、分片节点(dataNode)
四、节点主机(dataHost)
五、分片规则(rule)
一、逻辑库(schema)
1、MyCat 核心概念中的其他概念。逻辑库如图:
在这一幅图当中,大家会发现 MySQL 数据库是最后一层,是物理结构当中的这部分。原来的应用程序在操作时候直接连接 MySQL ,去操作 my circle 当中的数据。现在大家会发现,我们两张表的数据会分散存储在四台 MySQL 上,现在我们在操作的时候,我们应该去操作哪一台 MySQL 呢?大家会发现我们操作哪一台MySQL 都不是,难道我们要操作四台 MySQL,然后把数据进行汇总分析吗?其实不用,因为这些操作 myCat 已经帮我们做了。我们的应用程序现在在连接我们的数据库时,不需要直接连接底层的 MySQL,而只需要去连接 MyCat,连接 MyCat 当中的 schema 逻辑库。逻辑库中又汇总了 table A 和 table B 中的数据,所以我们的应用程序只需要连接 schema,schema 就是逻辑库。
2、MyCat 是一个数据库中间件,通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看作是一个或多个数据库集群构成的逻辑库。
二、逻辑表(table)
1、逻辑库的概念大家理解之后逻辑表就很好理解了。在逻辑库当中,他要存放的这些表,实际上就是逻辑表。逻辑表不会存储具体的数据,他只是逻辑上的概念,逻辑表并不会存储具体的数据,具体的数据还是存放在底层的 MySQL 数据库上。
2、既然有逻辑库,那么就会有逻辑表,分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。
3、逻辑表又分为四类
(1)分片表
①是指那些原有的很大数据的表,需要切分到多个数据库的表,这样,每个分片都有一部分数据,所有分片构成了完整的数据。总而言之就是需要进行分片的表。如:tb-order 表是一个分片表,数据按照规则被切分到 dn1、dn2 两个节点。
②分片表指的是参与分片的表,指的是原有的数据量很大的表,比如我们刚才提到的订单表,我们可以将订单表这结构进行切分,切分到多个数据节点中,每一个数据库中都会有 tb_order 这张表,但是他里面的数据不同,所以每一个分片只是存放了这个表当中的一部分数据,而他所有分片的这些数据汇总起来构成了一个完整的数据库。分片表就是需要进行分片的表,举的一个例子就是订单表,因为订单表会分散到多个节点中进行存储。
(2) 非分片表
①一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片是相对分片表来说的,就是那些不需要进行数据切分的表。如:tb-city 是非分片表,数据只存于其中的一个节点 dn1 上。
②非分片表指的是,有一些表结构数据量并不是特别大,比如城市、国家这样的表,以及汇率这样的表,语言这样的表,这些表数据量不大,我们没有必要进行切分,没有必要进行拆分,就是属于非分片表。我们只需要将这张表结构存储在一个节点上就可以了,不需要分散存储到多个节点中,对数据进行切分。
(3)ER 表
①ER 表代表的是 Entity Relationship Model,关系型数据库是基于实体关系模型(Entity Relationship Model)的, My Cat 中的 ER 表便来源于此。My Cat 提出了基于 ER 关系的数据 分片策略,字表的记录与其所关联的父表的记录存放在同一个数据分片中,通过表分组(Table Group) 保证数据关联查询不会跨库操作。
②字段表的之间是有关联的,字表的记录与关联的父表的记录存放在同一个数据分片中,这就叫 ER 表。我们现在有一张 tb_order 这张表,而在 tb_order 这张表中他关联的有一个数据,这个数据就是 user 这张表。
在 order 这张表中,他关联的有一个 User ID ,关联的是 user 表的主件。这个时候我们进行分片的时候,会把这两张表关联的数据存放在一个界面当中,从而避免跨库操作。
(4)全局表
①在一个大型的项目中,会存在一部分字典表(码表) ,在其中存储的是项目中的一些基础的数据,而这些基础的数据,数据量都不大,在各个业务表中可能都存在关联。当业务表由于数据量大而分片后,业务表与附属的数据字典表之间的关联查词就变成了比较棘手的问题,在 My Cat 中可以通过数据冗余来解决这类表的关联查询,即所有分片都复制这一份数据(数据字典表),因此可以把这些冗余数据的表定义为全局表。
②数据库表在进行分片可能会分为很多片,有一些数据是通用的数据。比如我们下订单的时候,刚才提到 tb_order 有一个字段叫 user ID,假如在这个里面还有一个字段,就是当前这个订单所归属的产品的类型是什么。产品的类型可以理解为 itemType,产品的类型关联实际上是产品类型表的一个主件。产品类型并不多,没必要进行分片。
另外一个分片,它里面的数据也要关联 itemType,当我们在进行关联查询的时候,我们查询这个订单的信息,还需要查询订单所关联的产品的类型信息的时候,这个时候再进行操作的时候,产品类型表在哪存?如果我们要进行关联查询,我们可以考虑把产品类型表设置为一张全局表。
③全局表的概念是,在第一个节点中有,在第二个节点当中也有。这样的话查询第一个节点订单中的信息时要关联查询我们的产品类型表,这个时候有数据,关联查也不会涉及到跨库。查询第二部分订单的时候,关联查询它的产品类型,在这个数据库查询的时候发现,也有产品类型的表,也不会涉及到跨库操作。全局表就是将我们关联的基础的数据,在各个节点当中,都存储一份,从而避免跨库操作。
三、分片节点(dataNode)
1、数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点(dataNode)。
2、分片节点就是大家看到的 dateNode,一张大表它分散的存储到各个分片数据库上面,每一个表分片所在的数据库就是分片节点。如下图:
每一张表的数据是分散存储到各个节点上,这个节点就叫数据节点。
四、节点主机(dataHost)
1、数据切分后,每个分片节点 ( dataNode ) 不一定都会独占一台机器,同一台机器上面可以有多个分片数据库,这样一个或多个分片节点( dataNode ) 所在的机器就是节点主机 ( dataRost ),为了规避单节点主机并发数限制,尽量将读写压力高的分片节点 ( dataNode ) 均衡的放在不同的节点主机 ( dataHost ) 。
2、dataHost 指的是具体的每一台主机,
table A 要分别存放在 datanote1 和 dataNote 2 这两个分片节点中,这两个分片节点最终要存储在 MySQL 当中,现在他会去关联一个 MySQL 的数据库。可以关联同一个服务器数据库实例,也就是说 datanote1 可以关联 128,dataNote 2 也可以关联 128,他们关联的是不同的数据库。下面 MySQL 的数据库实例实际上就是节点主机。
五、分片规则(rule)
1、前面讲了数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大地避免后续数据处理的难度。
2、table A 中的数据要分散存储在 datanote1 和 dataNote 2 上面,我们插入一条数据,插入到 myCat 当中,那么myCat 到底会把这条数据插入 datanote1 对应的数据库表结构,还是 dataNote 2 对应的数据库表结构,这就是由分片规则来决定的。分片规则指的是我们在插入数据时,这个数据到底存放在哪一个分片节点上,就是由分片规则来决定的。MyCat 当中的一些核心概念,这些核心概念不需要记忆,主要需要理解下图,需要根据这幅图,来理解 MyCat 当中的核心概念。