近今年里随着经济的飞速发展,企业的业务也在不断膨胀,做为业务支撑的信息系统特别是数据库系统也面临史无前例的压力,行业应用所产生的数据呈爆炸式地增加。数据从原来的GB级别迅速增常到TB甚至是PB的规模,已经远远超过传统计算技术的要求,原来集中式的存储方式已经没法知足数据存储的要求,此时分布式数据存储因为良好的透明性、数据冗余性、扩展性、自治性逐渐进入人们的视野。为了更好的使用和管理分布式数据库,业内推出了很多优秀的分布式数据库中间件,Mycat就是其中之一,今天就来看看Mycat的架构和实现原理。本篇文章会学到如下内容:前端
分布式数据存储与Mycat
众所周知,在分布式数据库的使用场景下,数据的存储不像集中式数据库那样都存放在一台服务器的一个数据库中,而是会分布在不一样的服务器的不一样数据库中。而应用程序的会根据不一样的数据库进行访问,如图1 所示,应用程序须要根据访问的数据库不一样:数据库一、数据库二、数据库3使用不一样的数据库链接,若是说某张数据表在三个数据库中都存在,也须要使用特定的方式对其进行访问,能够说在应用程序这端访问起来是比较麻烦的。node
图1 分布式的数据库队增长了应用程序访问的复杂度mysql
正由于应用程序在访问分布式数据库的时候会遇到相似的问题,因此引入了数据库中间件来简化应用程序须要面对的问题。如图2所示,在应用程序和数据库中间引入Mycat数据库中间件之后,让应用程序的编程更加方便,它不用在面对分布式的数据库,而只用针对Mycat中间件进行数据库编程就能完成对应的数据操做,而且适用于如下几种场景:算法
换句话说,当应用程序发起一条SQL语句的时候,不用关心数据库存放在哪一个服务器,以及数据库表是否作了分表分库,只用将要查的数据告诉Mycat就能够了,Mycat在考虑上述场景以后将结果返回给应用程序,让开发者更加方便快捷地操做数据。sql
图2 引入Mycat协助应用程序实现读写分离、分表分库操做数据库
上面描述的这些数据操做若是在没有Mycat中间件的状况须要在应用程序端维护大量的代码,而有了Mycat以后应用程序只须要针对Mycat进行配置,而且对其变成就能完成这些操做。编程
Mycat是一个开源的面相企业应用开发的数据库中间件,支持大数据库集群、事物、ACID。适用于高可用性、数据库读写分离、数据分级存储保障、大型数据库的分表分库以及并行计算、数据库路由以及整合诸如MySQL、Oracle、SQL Server等数据库。因为Mycat开源中间件有一个发展的过程,每一个版本的迭代都会遇到一些问题,目前已经更新到了Mycat 2.0是一个相对稳定的版本。若是有条件的同窗尽可能使用最新版本,或者使用Mycat 1.6.5 以上的版本,其修正了一些经常使用SQL函数的问题。不过Mycat也不是万能的依旧会存在一些问题,咱们这里把它的优缺点列出以下表格方便你们参考。后端
优势缓存 |
缺点服务器 |
拆分后业务清晰,拆分规则明确 |
部分业务表没法join,只能经过接口调用 |
系统之间容易扩展和整合 |
跨库事务难以处理 |
数据维护简单 |
垂直切分后某些业务数据过于庞大,仍然存在单体性能瓶颈 |
解决了单库大数据、高并发的性能瓶颈 |
拆分规则很难抽象 |
拆分规则封装好,对应用端几乎透明,开发人员无需关心拆分细节 |
分片事务一致性难以解决,须要经过XA或者借助其余分布式事务方式,例如:Redis、Zookeeper。 |
提升了系统的稳定性和负载能力 |
二次扩展时,数据迁移、维护难度大 |
Mycat 架构介绍
上面讲到了Mycat在分布式数据库中起到的做用,让应用程序的开发专一于业务自己,把分表分库、读写分离、访问不一样数据以及控制数据库链接的问题都交给Mycat来处理。那么Mycat是经过怎样的架构实现上述功能的呢,下面就和我一块儿来看看Mycat的组件和架构。
从逻辑上划分如下六个模块。
上面六个模块看上去比较抽象,若是理清逻辑顺序记忆起来仍是比较方便的。通信协议模块接受到应用程序的SQL请求,会将其交给SQL执行模块,执行模块解析SQL以后须要知道访问哪些节点上的数据库。因而,它请求路由解析模块,再了解须要访问哪些数据库之后,经过数据库链接模块创建数据库链接,而且分发SQL到对应数据库上执行。将返回的数据经过结果集处理模块,汇总、排序,最后返回给应用程序。监控管理模块就好像一个大管家监视Mycat中的链接、内存等资源使用状况。
若是将上面的组件经过Mycat的处理流程展现的话,如图3所示,整个图由上、中、下3步部分组成。上面的部分表明客户端,其承载多个应用程序会向处在中间的Mycat服务发起SQL请求。中间Mycat服务,包含了上述的六大组件,负责对应用程序请求进行处理和响应。下面的存储层能够对接不一样的数据源,为Mycat提供存储服务。整个请求处理流程分为请求和响应两个部分,分别由“从上往下”和“从下往上”的两个箭头表明,这里咱们将Mycat的处理分为六个步骤给你们介绍以下:
图3 Mycat 数据处理流程
Mycat 核心概念及配置
在描述完Mycat 的架构和工做流程之后,相信你们对Mycat的执行机制和结构都有必定的了解。站在架构的高度对下面的核心概念的理解会有一些帮助,若是说上面讲的是Mycat逻辑架构,那么下面介绍的核心概念及配置就涉及到具体操做的范畴。毕竟Mycat须要提供配置工具完成开发者的功能,而后再经过架构来执行这些规则,最后实现对分布式数据库开发的透明性。接下来要介绍的就是在使用Mycat过程当中遇到的核心概念,以及这些概念对应的配置方式和对应的配置文件。方便咱们落地Mycat中间件的应用。
如图4所示,改图描述了Mycat 核心概念之间的关系,而且描述了这些核心概念在哪些配置文件中进行配置。咱们从上往下跟着序号来看这些概念:
图4 Mycat核心概念图
上面咱们将Mycat核心概念以及它们对应的配置文件给你们作了总体介绍,接下来将对上面的概念作深刻的描述。
Mycat中的用户是一个逻辑上的用户,他定义了用来链接Mycat中间件的用户信息,而且将这些信息存放在server.xml文件中。如图5所示,这是server.xml 文件中对user 信息的定义。
图5 用户的定义Server.xml文件
开发人员在进行数据库开发的时候都须要对某个具体的数据库进行操做,例如:查找、更新、删除等等。可是到了分布式数据库的时代,数据库以分布式的方式部署在不一样的服务器节点中,此时再去访问这些数据库难度就增长了。有Mycat介入之后,引入了逻辑库的概念。逻辑库是一个概念上的定义,其背后对应的是一个或者多个实体数据库。它的定义是在schema.xml文件中进行的。如图6所示,
图6 逻辑库在schema.xml文件中的定义
既然有逻辑库就必定有逻辑表,一般意义上逻辑表会和物理表进行对应,有多是一个逻辑表对应多个分布在不一样数据节点的物理表;也有可能对应一张没有进行分片的物理表。一样这些配置都是在schema.xml配置文件中完成的。如图7 所示,
图7 在逻辑库中定义逻辑表
定义逻辑存储对应的物理数据库,这里包含两个重要的信息:第一,保存数据的数据库主机(集群)的名字;第二,物理数据库的名称。一样在schema.xml配置文件的dataNode标签下配置。如图8 所示,
从两个数据节点(“orderdb01”,“orderdb02”)都定义到一个“mysql01”的datahost能够看出,它们的数据库都存放在同一个数据库集群中。
图8 数据节点定义
数据主机集群主要是描述存放数据库的主机信息,一般来讲是描述一个数据库服务器的集群。如图9所示,
图9 数据主机集群
在schema.xml文件中基本都是数据方面的定义,其中在逻辑表中有针对rule的定义,这种状况是用来定义分片规则的。通常而言分片规则的定义在rule.xml文件中完成。
如图10所示:
图10 tableRule和function定义
根据上面给出的配置规则的定义,能够获得图11所示分片规则。
图11 分片规则定义路由选择
总结
本文从分布式数据存储入手,描述了Mycat在分布式数据库中起到了怎样的做用。而后介绍了Mycat的六大模块:通讯协议、SQL执行、路由解析、数据库链接、结果集处理、监控管理,是如何工做的。最后经过介绍Mycat七大核心概念:用户、逻辑库、逻辑表、数据节点、数据主机集群、分片规则、分片函数,以及对应的三个配置文件:Server.xml、Schema.xml 和Rule.xml文件是如何帮助应用程序使用好Mycat中间件的。