Mycat是什么?
· 一个彻底开源的,面向企业应用开发的大数据库集群
· 支持事务、ACID、可以替代MySQL的加强版数据库
· 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
· 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
· 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
· 一个新颖的数据库中间件产品
上诉种种都是官网对其定义,是否还是有些模糊,下面我们通过一个分库分表的案例来讲解Mycat是什么和Mycat中核心的概念和名词解释,案例如下图:
数据库中间件
Mycat是一个介于数据库与应用之间,进行数据处理与交互的中间服务。如下图:
通俗点讲,应用层可以将它看作是一个数据库的代理(或者直接看成加强版数据库)。但是由于真正的数据库需要存储引擎,而 Mycat 并没有存储引擎,Mycat服务不保存真正的数据,所以并不是完全意义的分布式数据库系统。所以称Mycat这样类型的数据库中间代理服务的产品为数据库中间件。
逻辑库
对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。
如图一中,在MYCAT服务区中的db_user库,只是逻辑上存在的数据库,真正的数据来源还是来源MYSQL服务区中的两台实际的Mysql db实例。
在Mycat中逻辑库在{MYCAT_HOME}/conf/schema.xml 用<schema> 标签定义。如图三:
逻辑表
既然有逻辑库,肯定将会存在逻辑表,分布式数据库中,对应用来说,读写数据的表就是逻辑表。
逻辑表的数据来源,可以是数据进行切分后,分布在一个或多个分片库中,针对不同的数据分布和管理特点,我们将逻辑表又分为分片表、全局表、全局表、ER表、非分片表五种逻辑表类型。在schema.xml使用<table>标签对逻辑表进行定义。
分片表:是指那些原有的很大数据的表,需要切分到多个表,这样,每个分片都有表的一部分数据,所有分片数据的合集构成了完整的表数据,如图一种中MYCAT服务区的users表即是分片表,通过userID字段取模的方式进行数据的水平切分。如图四中用户(users)表:
分片规则:将大数据的表,切分到多个数据分片的策略。如图三中rule="mod-userID-long",名字为mod-userID-long引用的详细规则,将在MYCAT的rule.xml中({MYCAT_HOME}/conf/rule.xml)中进行定义,具体定义规则如图五:
分片规则Mycat中内置了很多种,比如按时间、按自定义数字范围、十进制取模、程序指定,字符串Hash,一致性Hash等等,总体可将这些分片规则分为离散型和连续型两种分片规则。
离散型分片规则数据分布均衡,对数据的处理并发能力强,但是对于分片的扩缩容存在较大的挑战。连续性分片数据分布较集中,更符合业务特性,但是对数据的处理并发能力受限数据的分布,分片的扩缩容有更好的支持。
全局表:一个真实的业务系统中,往往存在大量的类似数据字典表的表,数据字典表具有以下几个特性:
• 数据变动不频繁;
• 数据规模不大,数据量在十万以内;
• 存在跟其他表(特别是分片表)有一点的关联查询要求。
未了解决表与表的join查询,Mycat提倡大家将具有上诉特点的表通过数据冗余的方式(全局表的定义)进行解决,即所有的分片都有一份数据的拷贝。通过MYCAT对这样的表进行数据的操作时,数据的修改,新增,删除时,所有的分片数据都将受到影响。
ER表:关系型数据库是基于实体关系模型(Entity-Relationship Model)之上,通过其描述了真实世界中事物与关系,Mycat 中的 ER 表即是来源于此。
根据这一思路,提出了基于 E-R 关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上,即子表依赖于父表,通过表分组(Table Group)保证数据 Join 不会跨库操作。
如文中的案例,用户表是分片表,用户地址表与用户表之间存在一对多的关系,若通过分片规则,将用户表中的张三分在了分片1,则最好的数据存储方式是将张三的用户地址信息跟随张三一起分配在分片1中。
这样一种表分组的设计方式是解决跨分片数据 join 的一种很好的思路,也是数据切分规划的重要一条规则。ER表中在schema.xml中使用<childTable>标签进行描述和定义,如图六:
非分片表:一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片是相对分片表来说的,就是那些不需要进行数据切分的表。在schema.xml中具体的定义,可参见图七:
分片节点
大数据表进行数据切分后,每个表分片所在的数据库就是分片节点,狭义的理解可以认为一个DB实例就是一个节点,在schema.xml中使用<dataNode>进行分片节点的定义如图八:
节点主机
数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机,为了规避单节点主机并发数限制。
尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机,在schema.xml中使用<dataHost>进行分片节点的定义如图九:
获取以上Java高级架构最新视频,欢迎
加入Java进阶架构交流群:142019080。直接点击链接加群。
https://jq.qq.com/?_wv=1027&k=5lXBNZ7
网友评论