当前位置: 首页 > 科技观察

掌握6个模块和7个核心概念!帮你搞定Mycat中间件

时间:2023-03-22 00:49:19 科技观察

本文转载自微信公众号《石山的架构笔记》,作者崔浩。转载本文请联系石山架构笔记公众号。开放近年来,随着经济的快速发展,企业的业务也在不断扩大。作为业务支撑的信息系统尤其是数据库系统也面临着前所未有的压力,行业应用产生的数据呈爆发式增长。数据从原来的GB级迅速增长到TB级甚至PB级,已经远远超过了传统计算技术的要求。原有的集中存储方式已经不能满足数据存储的要求。这时,由于分布式数据存储良好的透明性,数据的冗余性、可扩展性、自治性逐渐走入人们的视野。为了更好地使用和管理分布式数据库,业界推出了很多优秀的分布式数据库中间件,Mycat就是其中之一。今天就来看看Mycat的架构和实现原理。本文将学习以下内容:分布式数据存储和MycatMycat架构介绍Mycat的核心概念和配置分布式数据存储和Mycat众所周知,在分布式数据库的使用场景中,数据存储并不像中心化数据库那么简单它存储在一台服务器的一个数据库中,但会分布在不同服务器的不同数据库中。应用程序会根据不同的数据库进行访问,如图1所示,应用程序需要访问不同的数据库:数据库1、数据库2、数据库3使用不同的数据库连接,如果一个数据表存在于三个中数据库,并且需要以特定的方式访问它。可以说在应用端接入比较麻烦。图1分布式数据库团队增加了应用访问的复杂性。正因为应用在访问分布式数据库时会遇到类似的问题,所以引入数据库中间件来简化应用需要面对的问题。如图2所示,在应用程序和数据库之间引入Mycat数据库中间件后,应用程序的编程更加方便。不需要面向分布式数据库,只需要通过Mycat中间件进行数据库编程即可完成相应的数据操作,适用于以下场景:读写分离:可以使用Mycat对数据库1进行写操作,同时对数据库2和3进行读操作,如果写服务器宕机,Mycat可以临时将写请求转移到其他数据库服务器,保证数据库的可用性。竖表分库:数据库1和数据库2中存放订单表,数据库3中存放产品表。即不同的表放在不同的库中。横向分表分库:通过sharding算法(例如:hash取模)将order表的不同记录分别存入数据库1和数据库2。即把同一张表的不同数据放到不同库的表中。访问不同的数据库:数据库1和2访问MySQL数据库,数据库3访问Oracle数据库。控制应用程序到数据库的连接数:每个数据库连接都会占用数据库服务器的资源,每个数据库服务器可以连接的请求是有限的。这里Mycat可以控制前端应用请求数据库服务器的连接数,保证高可用。也就是说,当应用程序发起SQL语句时,不需要关心数据库存储在哪个服务器上,也不需要关心数据库表是否分为表和数据库。告诉Mycat要检查的数据就可以了。Mycat在考虑以上场景后,再将结果返回给应用程序,让开发者更方便快捷地操作数据。图2引入Mycat辅助应用实现读写分离、分表分库操作。如果没有Mycat中间件,上述的数据操作需要在应用端维护大量的代码。Mycat之后,应用程序只需要为MycatConfigureit,把它变成Mycat就可以完成这些操作了。Mycat是一个用于企业应用开发的开源数据库中间件,支持大型数据库集群、Things、ACID。适用于高可用、数据库读写分离、数据分层存储保障、大型数据库分表分库、并行计算、数据库路由、MySQL、Oracle、SQLServer等数据库集成。由于Mycat开源中间件有一个发展过程,版本的每一次迭代都会遇到一些问题。已经更新到Mycat2.0,是一个比较稳定的版本。有条件的话尽量使用最新版本,或者使用Mycat1.6.5以上版本,修复了一些常用SQL函数的问题。不过Mycat也不是万能的,还是存在一些问题。这里我们将其优缺点列在下表中,供大家参考。优缺点拆分后,业务清晰,拆分规则清晰。部分业务表无法join,只能通过接口调用。易于扩展和集成跨数据库事务。难以处理数据维护。简单垂直拆分后,部分业务数据过大,仍然存在单体性能瓶颈,解决了单库大数据和高并发的性能瓶颈。拆分规则很难抽象和封装。它对应用程序端几乎是透明的。开发者无需关心拆分细节。分片交易一致性很难解决。需要使用XA或者其他分布式事务方式,比如Redis、Zookeeper。提高系统稳定性和负载能力二次扩容时,数据迁移和维护难度加大分库、读写分离、不同数据的访问和控制数据库连接问题都由Mycat处理。那么Mycat是通过什么样的架构来实现以上功能的呢?让我看一下Mycat的组件和架构。从逻辑上划分以下六个模块。通信协议模块:主要负责底层通信功能,如发送接收数据、线程回调等。采用Reactor和Proctor模式,在网络IO架构中实现了NIO和AIO方式。SQL执行模块:顾名思义,接收到要执行的SQL后,通过数据库连接模块连接到数据库,通过连接池获取目标数据库,然后通过SQL将SQL语句分发到数据库节点执行路由分析。路由解析模块:当Mycat实现分表分库的功能时,路由就变得非常重要。模块接收到应用程序请求的查询语句后,会连接到后台数据,通过配置文件的规则设置将请求路由到对应的数据库表进行查询。同时该模块还承担了SQL分析的功能,需要对SQL语句的EXPLAIN、SET、SHOW、SELECT等命令进行分析,从而获取表名、条件、字段列表等信息.同时,你也可以改写SQL语句。数据库连接模块:主要负责创建、管理和维护后端数据库和对应的数据库连接池。并通过连接池机制来管理数据库连接的生命周期。结果集处理模块:在返回查询结果之前,需要对查询结果进行汇总和排序。尤其是在数据分片的情况下,返回的数据来自不同的数据库服务器和表,这些数据需要汇总后返回给应用程序。监控管理模块:主要对Mycat中的连接、内存等资源进行监控和管理。监控参数包括:连接数、缓存命中数等。以上6个模块看似抽象,按逻辑顺序理清更便于记忆。通信协议模块接收应用程序的SQL请求,交给SQL执行模块。解析完SQL后,执行模块需要知道要访问节点上的哪些数据库。因此请求路由分析模块,知道需要访问哪些数据库后,通过数据库连接模块建立数据库连接,并将SQL分发到对应的数据库执行,并通过结果集对返回数据进行汇总排序处理模块,最后返回给应用程序。监控管理模块就像一个大管家,监控Mycat中的连接、内存等资源使用情况。如果将以上组件通过Mycat的处理流程来展示:图3Mycat数据处理流程如图3所示,整个图由上、中、下三步组成。上半部分代表客户端,承载多个应用,向中间的Mycat服务发起SQL请求。中间的Mycat服务包括以上六个组件,负责处理和响应应用请求。下面的存储层可以连接不同的数据源,为Mycat提供存储服务。整个请求处理过程分为请求和响应两部分,用“自上而下”和“自下而上”两个箭头表示。这里我们把Mycat的处理分为六个步骤,分别给大家介绍一下:1、当客户端应用向Mycat服务发起SQL请求时,通信协议模块会通过NIO/AIO将请求提交给路由分析模块.2、路由解析模块包括SQL解析、优化和路由功能。主要功能是将SQL解析成需要执行的命令,进行优化,然后通过路由规则找到需要执行的数据库服务器。3、之后将请求交给SQL执行模块,根据路由分析结果分发到数据库服务器执行。4、执行前需要通过数据库连接模块获取对应的数据库连接,需要管理数据库连接池。5、同样,在SQL的分发和执行时,也需要通讯协议模块传递信息。6.SQL请求执行后,数据库通过结果处理模块对数据进行聚合、排序、汇总,最后将数据返回给客户端应用程序,完成整个请求过程。Mycat核心概念及配置介绍完Mycat的结构和工作流程,相信大家对Mycat的执行机制和结构有了一定的了解。站在架构的高度,理解以下核心概念会有帮助。如果以上是Mycat逻辑架构,那么下面介绍的核心概念和配置涉及到具体操作的范围。毕竟Mycat需要提供配置工具来完成开发者的功能,然后通过架构来实现这些规则,最终实现分布式数据库开发的透明化。接下来要介绍的是Mycat在使用过程中遇到的核心概念,以及这些概念对应的配置方法和对应的配置文件。方便我们实现Mycat中间件的应用。图4Mycat核心概念图如图4所示,修改后的图描述了Mycat核心概念之间的关系,并描述了这些核心概念配置在哪些配置文件中。下面按照序号从上到下看一下这些概念:系统mycat中的信息和用户信息都是在Server中配置的。逻辑库)权限。Schema.xml包含Mycat对数据的定义,Schema(逻辑库)会包含一个或多个tables(逻辑表)。表(逻辑表)将通过包含的datanode(数据节点)描述存储数据的服务器和物理数据库。Datahost和数据库包含在datanode中。其中datahost表示数据库所在的服务器集群,database是对物理数据库的描述。在rule.xml文件中为每个表分片定义规则,规则在定义规则时会调用描述规则算法的函数。上面我们已经为大家全面介绍了Mycat的核心概念及其对应的配置文件,接下来我们将对以上概念进行深入的介绍。1、用户(User)Mycat中的用户是一个逻辑用户,定义了用于连接Mycat中间件的用户信息,并将这些信息存储在server.xml文件中。如图5所示,这是server.xml文件中用户信息的定义。图5用户定义Server.xml文件可以看到用户名为“test”,密码“password”为123456。“test_db”定义在schemas标签中,是该用户可以访问的逻辑数据库。privileges标签中的true定义表示该用户还将具有对逻辑库的特定访问权限。这里定义dml到“test_db”的操作用四位数字表示,即“0110”。实际上,每一位代表一个操作,四个位对应的操作是“插入、更新、选择、删除”。对应位为“1”表示支持该操作,为“0”表示支持对应操作。“0110”表示支持插入操作、更新操作、选择操作,不支持删除操作。以此类推,schema标签下还有一个table标签,可以设置对逻辑表的权限,例如:table01的dml为0000,表示不能进行四项操作。2、逻辑库(schema)开发者在数据库开发时需要对特定的数据库进行操作,如:查找、更新、删除等。但是在分布式数据库时代,数据库是分布式部署在不同的服务器节点上的,这时候访问这些数据库就变得更加困难了。Mycat介入后,引入了逻辑库的概念。逻辑库是一种概念定义,对应一个或多个实体数据库,其定义在schema.xml文件中进行。如图6:图6中逻辑数据库的定义在schema.xml文件中定义了一个名为“test_db”的逻辑数据库。sqlMaxLimit用于限制每次查询数据最多可以返回的行数,这里设置为“1000”,为“-1”时没有限制。checkSQLschema是通过库名和表名访问数据库的开关,默认为“fasle”。3、逻辑表(table)既然有逻辑库,就一定有逻辑表。一般来说,逻辑表会对应物理表。可能是一个逻辑表对应分布在不同数据节点上的多个物理表;也可能对应一个没有分片的物理表。这些配置也是在schema.xml配置文件中完成的。如图7所示:图7在逻辑库中定义了一张逻辑表。在上面定义的逻辑库“test_db”中定义了一个逻辑表。表名是“order”,逻辑表名需要和物理表名保持一致。一致。因为在Mycat中将不再定义逻辑表和物理表之间的关系,所以通过这种隐式的方式让它们对应起来。“primaryKey”标签定义了逻辑表的主键,逻辑表的主键也与物理表的主键保持一致。设置主键的目的是,如果数据分片时没有选择主键,Mycat会通过主键的定义来查询物理表,从而提高查询效率。物理数据库的名称在“dataNode”标签中定义。如果一个物理表分片存储在多个物理数据库中,每个物理数据库需要用逗号分隔。这里物理节点的顺序也是索引的顺序。如图,“orderdb01”的索引为0,“orderdb02”的索引为1。最后在Rule标签中定义水平分片的规则,具体定义方法后面会详细说明.4、数据节点(DataNode)定义了逻辑存储对应的物理数据库,其中包含两个重要信息:保存数据的数据库主机(集群)的名称,物理数据库的名称也配置在schema.xml配置文件的dataNode标签。如图8所示:图8中的数据节点定义“dataHost”标签描述了物理数据库的数据库服务器(servernode/cluster)。“database”标签描述了客户端的物理数据库的名称,它必须存在于服务器节点上。从定义到一个“mysql01”数据主机的两个数据节点(“orderdb01”、“orderdb02”)可以看出,它们的数据库存储在同一个数据库集群中。5.数据主机集群(DataHost)数据主机集群主要描述了存储数据库的主机信息,通俗的说就是描述了一个数据库服务器集群。如图9:“mysql01”的数据库主机集群定义在图9的数据主机集群dataHost中,包括“maxCon”(最大连接数)、“minCon”(最小连接数)、“balance”(读写分离)开关)、“dbType”(数据库类型)等标签。重要的是,此集群中定义了三个数据库服务器。“192.168.0.1”是一个写服务器,对应的还有一个读服务器,就是“192.168.0.2”。此外,还有一个写入服务器“192.168.0.3”。6、分片规则(TableRule)&函数(Function)基本定义在schema.xml文件中的数据方面,逻辑表中有规则的定义,用于定义分片规则。一般来说,分片规则的定义是在rule.xml文件中完成的。如图10所示:图10tableRule及函数定义tableRule将分片规则定义为“mod_3_order_id”,该名称用于逻辑表中的规则标签。从名字的意思可以看出,order_id字段是对3取模计算的,从而实现分片操作。order_id在列标记中定义为模字段。具体的分片算法定义在algorithm标签中。这里的算法名称可以在下面的函数节点的对应定义中找到。Function中的name对应上面tablerule中的algorithmname,也是“mod_3”,即取3的模。算法实现的Class类的命名空间和对应的类名定义在class中标签。Count标签定义的3是具体的模数,这里是对3取模。根据上面给出的配置规则的定义,分片规则如图。可以获得11个。图11分片规则定义路由选择当应用程序对order表发起SQL查询时,查询的是order_id=1的数据。请求提交到Mycat后,order_id取模3得到1,简单取模方法。由于订单表是分片存储在DB0、DB1、DB2三个数据库中的,所以取模的值路由到DB1的订单表,执行SQL语句完成分布式查询。小结本文从分布式数据存储入手,介绍Mycat如何在分布式数据库中发挥作用。然后介绍了Mycat的六个模块是如何工作的:通信协议、SQL执行、路由分析、数据库连接、结果集处理、监控管理。最后介绍Mycat的七个核心概念:用户、逻辑库、逻辑表、数据节点、数据主机集群、分片规则、分片函数,以及对应的三个配置文件:Server.xml、Schema.xml和Rule。xml文件如何帮助应用程序使用Mycat中间件。