一、背景随着时间和业务的发展,数据库中数据的增长是不可控的,而数据库中的数据数据库和表会越来越大,带来更高的磁盘、IO、系统开销,甚至性能瓶颈,而且一个服务的资源毕竟是有限的,所以需要分库分表,更好的提供数据服务。当用户表达量达到千万级时,做大量的操作会非常吃力,所以当数据增长到千万级以上时,需要分库分表来缓解单库压力(桌子)。2、什么是分库分表[1]简单来说就是我们存储在同一个数据库中的数据,通过一定的特定条件,分散存储在多个数据库(主机)上,从而实现去中心化的单设备负载的影响。数据分片(Sharding)根据分片规则的类型可以分为两种分片模式。一种是根据不同的表(或模式)拆分到不同的数据库(主机)中,可以称为数据的垂直(纵向)拆分;另一种是根据表中数据的逻辑关系,将同一张表中的数据按照一定的条件拆分到多个数据库(主机)中。这种拆分称为数据的水平(水平)拆分。垂直切分最大的特点就是规则简单,实施起来也比较方便。特别适用于业务之间耦合度很低,相互影响很小,业务逻辑非常清晰的系统。在本系统中,很容易将不同业务模块使用的表拆分到不同的数据库中。按照不同的表拆分对应用的影响更小,拆分规则也会更简单明了。水平拆分相对于垂直拆分要复杂一些。因为需要将同一张表的不同数据拆分到不同的数据库中,对于应用来说,拆分规则本身比根据表名拆分要复杂,后期的数据维护也会更加复杂。3、纵向切分[1]一个数据库是由很多表组成的,每个表对应不同的业务。垂直切分是指将表按照业务进行分类,分布到不同的数据库中,让数据或者说压力分摊到不同的库上,如下图:系统分为几个模块,用户、订单交易和付款。一个架构设计良好的应用系统,其整体功能必然是由许多功能模块组成,每个功能模块所需的数据对应数据库中的一张或多张表。在架构设计中,各功能模块之间的交互点越统一,系统的耦合度越低,系统各模块的可维护性和扩展性越好。这样的系统更容易实现数据的垂直切分。但是,系统中的一些表往往很难做到完全独立。存在数据库扩容和join的情况。对于这样的表,需要平衡业务。是数据库特许业务,共享一个数据源,或者分成多个数据库。商务电话是通过界面进行的。在系统初期,当数据量比较少,或者资源有限时,会选择共享数据源,但当数据发展到一定规模,负载较重时,就需要共享数据源。拆分它。一般来说,业务有复杂join的场景很难拆分,往往业务是独立的,容易拆分。如何拆分,拆分到什么程度,是考验技术架构的难题。下面来分析一下垂直切分的优缺点:优点:切分后业务清晰,切分规则清晰;系统之间的集成或扩展容易;数据维护简单。缺点:部分业务表无法join,只能通过接口解决,增加了系统的复杂度;由于各业务的限制不同,存在单库性能瓶颈,难以扩展数据和提升性能;事务处理复杂。由于垂直切分是将表按照业务的分类分散到不同的库中,有些业务表会过大,单个数据库的读写和存储都会出现瓶颈,所以需要水平切分来解决问题.4.水平拆分[1]相对于垂直拆分,水平拆分不是对表进行分类,而是将某个字段按照一定规则分散到多个库中,每个表包含一部分数据。简单的说,我们可以把数据的水平切分理解为按照数据行的切分,即表中的一些行切入一个数据库,另一些行切入其他数据库,如图:拆分数据需要定义分片规则。关系数据库是行和列的二维模型。分裂的首要原则是找到分裂维度。例如:从会员的角度来看,如果在商户订单交易系统中查询某个会员在某日某月的某笔订单,那么就需要按照会员的组合日期进行拆分,根据不同的数据进行分组会员ID,可以查询所有数据Join将在单一数据库中解决;从商户的角度,如果想查询某个商户在某天的订单数,需要根据商户ID进行拆分;但是如果系统要按会员拆分,要业务数据,就会有一定的困难。如何找到合适的分片规则需要综合考虑和权衡。几种典型的分片规则包括:根据用户ID取模,将数据分布到不同的数据库中,相同数据的用户的数据分布到一个数据库中;根据日期,将不同月份甚至不同日期的数据分发到不同的数据库中。在图书馆;根据特定领域,或根据特定范围分散到不同的库中。如图所示,切分原则就是根据业务找到合适的切分规则,分发到不同的库中。下面使用用户ID查找模型。既然数据拆分有优点,那么它也有优点和缺点。优点:拆分规则抽象的很好,join操作基本可以由数据库完成;不存在单库大数据、高并发性能瓶颈;更少的应用端修改;提高了系统稳定性和负载能力。缺点:拆分规则难以抽象;碎片化的事务一致性很难解决;数据扩容和维护难度极大;跨库join性能差五、什么是Mycat?它是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它当成一个数据库代理,用MySQL客户端工具和命令行来访问,它的后端可以和多个MySQL服务器使用MySQL本机(Native)协议。JDBC协议可用于与大多数主流数据库服务器进行通信。它的核心功能是分表分库,即把一个大表横向分成N个小表存储在后端的MySQL服务器或其他数据库中。常见应用场景:简单的读写分离,此时配置最简单,支持读写分离,主从切换;分表分库,超过1000万张表分片,最大支持1000亿单表分片;多租户应用,每个应用都有一个库,但是应用只连接Mycat,这样不修改程序本身就可以实现多租户;报表系统,借助Mycat的分表能力,处理大规模报表的统计;?代替Hbase,分析大数据;作为海量数据实时查询的简单有效的解决方案,例如3秒内查询100亿条高频查询记录。除了基于主键的查询之外,还可能有范围查询或其他属性查询。Mycat可能是此时最简单有效的选择。六、SpringBoot+Mycat+MySQL实现分表分库案例关于分库分表,Mycat内部已经帮我们实现了路由功能。我们只需要在Mycat中配置如下分段规则就可以了。对于开发者来说,我们可以把Mycat看成是一个数据库,然后开始搭建环境:第一步:Mycat是用java编写的数据库中间件,所以在运行Mycat之前必须准备好jdk环境需要jdk1.7以上的环境。所以需要在系统中配置JAVA_HOME环境变量。第二步:从官网下载Mycat,http://dl.mycat.io/1.6-RELEASE/我们搭建的Mycat环境是基于CentOS7的,所以下载的版本是:Mycat-server-1.6-RELEASE-20161028204710-linux。tar.gz第三步:将下载的安装包上传到服务器并解压。解压后目录结构如下:第四步:配置切分规则:复制粘贴以下配置覆盖mycat/conf/schema.xml中的内容。:表示mycat中的逻辑表配置,逻辑表名为:user,映射到两个数据库节点dataNode,拆分规则为:rule1(在rule.xml中配置)
