数据库性能提高利器—Mycat数据切分

1、前言
      数据库是每一个系统都不可缺乏的东西,里面记录了系统各类数据资料。可是现在的数据膨胀的时代,数据库性能不能知足咱们的须要了。因此咱们要对数据库进行强化,就用到了Mycat。sql

2、何为数据切分?
      简单来讲,就是指经过某种特定的条件,把咱们存放在同一个数据库中的数据分散存储到多个数据库里。数据库

      数据的切分(Sharding)根据其切分规则的类型,能够分为两种切分模式。一种是按照不一样的表(或者Schema)来切分到不一样的
数据库(主机)之上,这种切能够称之为数据的垂直(纵向)切分;另一种则是根据表中的数据的逻辑关系,将同一个表中的
数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。后端

      垂直切分的最大特色就是规则简单,实施也更为方便,尤为适合各业务之间的耦合度很是低,相互影响很小,业务逻辑很是清晰
的系统。在这种系统中,能够很容易作到将不一样业务模块所使用的表分拆到不一样的数据库中。根据不一样的表来进行拆分,对应用
程序的影响也更小,拆分规则也会比较简单清晰。缓存

      水平切分于垂直切分相比,相对来讲稍微复杂一些。由于要将同一个表中的不一样数据拆分到不一样的数据库中,对于应用程序来
说,拆分规则自己就较根据表名来拆分更为复杂,后期的数据维护也会更为复杂一些。服务器

2.1 垂直切分
      一个数据库由不少表的构成,每一个表对应着不一样的业务,垂直切分是指按照业务将表进行分类,分布到不一样的数据库上面,这样
也就将数据或者说压力分担到不一样的库上面,以下图:架构

      下面来分析下垂直切分的优缺点:并发

优势:
拆分后业务清晰,拆分规则明确。框架

系统之间整合或扩展容易。分布式

数据维护简单。高并发

缺点:
部分业务表没法join,只能经过接口方式解决,提升了系统复杂度。

受每种业务不一样的限制存在单库性能瓶颈,不易数据扩展跟性能提升。
事务处理复杂。

因为垂直切分是按照业务的分类将表分散到不一样的库,因此有些业务表会过于庞大,存在单库读写与存储瓶颈,因此就须要水平拆分来作解决。

2.2 水平切分
      相对于垂直拆分,水平拆分不是将表作分类,而是按照某个字段的某种规则来分散到多个库之中,每一个表中包含一部分数据。简
单来讲,咱们能够将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切
分到其余的数据库中,如图:

      几种典型的分片规则包括:

按照用户ID求模,将数据分散到不一样的数据库,具备相同数据用户的数据都被分散到一个库中。

按照日期,将不一样月甚至日的数据分散到不一样的库中。

按照某个特定的字段求摸,或者根据特定范围段分散到不一样的库中。

      既然数据作了拆分有优势也就优缺点。

优势有:
拆分规则抽象好,join操做基本能够数据库作。

不存在单库大数据,高并发的性能瓶颈。

应用端改造较少。

提升了系统的稳定性跟负载能力。

缺点有:
拆分规则难以抽象。

分片事务一致性难以解决。

数据屡次扩展难度跟维护量极大。

跨库join性能较差

      前面讲了垂直切分跟水平切分的不一样跟优缺点,会发现每种切分方式都有缺点,但共同的特色缺点有:

引入分布式事务的问题。

跨节点Join的问题。跨节点合并排序分页问题。

多数据源管理问题。

因为数据切分后数据Join的难度在此也分享一下数据切分的经验:

第一原则:能不切分尽可能不要切分。

第二原则:若是要切分必定要选择合适的切分规则,提早规划好。

第三原则:数据切分尽可能经过数据冗余或表分组(Table Group)来下降跨库Join的可能。

第四原则:因为数据库中间件对数据Join实现的优劣难以把握,并且实现高性能难度极大,业务读取尽可能少使用多表Join。

3、Mycat简介
      最近项目中使用了数据库中间件——Mycat。

      这个中间件能够说是很奇妙的东西,可让数据库的负载能力提升不少。小编项目中使用的是Mysql,单表数据达到500w的时候,数据库的各方面性能就会有必定的降低,好比,单表查询,或者连表查询等。

      加入mycat后,能够对数据库进行分库,分表。把一个逻辑完整的数据库分红物理拆分的数据库。

      Mycat背后是阿里曾经开源的知名产品——
Cobar。Cobar的核心功能和优点是MySQL数据库分片,此产品曾经广为流传,听说最先的发起者对Mysql很精通,后来从阿里
跳槽了,阿里随后开源的Cobar,并维持到2013年年初,而后,就没有而后了。

      Mycat就是一个近似等于MySQL的数据库服务器,你能够用链接MySQL的方式去链接Mycat(除了端口不一样,默认的Mycat端
口是8066而非MySQL的3306,所以须要在链接字符串上增长端口信息),大多数状况下,能够用你熟悉的对象映射框架使用
Mycat,但建议对于分片表,尽可能使用基础的SQL语句,由于这样能达到最佳性能,特别是几千万甚至几百亿条记录的状况下。

      Mycat是一个强大的数据库中间件,不只仅能够用做读写分离、以及分表分库、容灾备份,并且能够用于多租户应用开发、云平
台基础设施、让你的架构具有很强的适应性和灵活性,借助于即将发布的Mycat智能优化模块,系统的数据访问瓶颈和热点一目
了然,根据这些统计分析数据,你能够自动或手工调整后端存储,将不一样的表映射到不一样存储引擎上,而整个应用的代码一行也
不用改变。

3.1 Mycat原理
      Mycat的原理并不复杂,复杂的是代码,若是代码也不复杂,那么早就成为一个传说了。
      Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句作了一些特定的分析:如分
片分析、路由分析、读写分离分析、缓存分析等,而后将此SQL发日后端的真实数据库,并将返回的结果作适当的处理,最终再
返回给用户。

3.2 应用场景
      Mycat发展到如今,适用的场景已经很丰富,并且不断有新用户给出新的创新性的方案,如下是几个典型的应用场景:

单纯的读写分离,此时配置最为简单,支持读写分离,主从切换

分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片

多租户应用,每一个应用一个库,但应用程序只链接Mycat,从而不改造程序自己,实现多租户化

报表系统,借助于Mycat的分表能力,处理大规模报表的统计

替代Hbase,分析大数据

做为海量数据实时查询的一种简单有效方案,好比100亿条频繁查询的记录须要在3秒内查询出来结果,除了基于主键的查
询,还可能存在范围查询或其余属性查询,此时Mycat多是最简单有效的选择

4、小结      这一篇博客主要向你们介绍了一下数据库分片和mycat的宏观介绍。

相关文章
相关标签/搜索