zoukankan      html  css  js  c++  java
  • 关于Mycat

    一.Mycat简介

    这个中间件可以说是很奇妙的东西,可以让数据库的负载能力提高很多。

    使用mycat后,可以对数据库进行分库,分表。把一个逻辑完整的数据库分成物理拆分的数据库。

    Mycat背后是阿里曾经开源的知名产品——Cobar。Cobar的核心功能和优势是MySQL数据库分片,

    此产品曾经广为流传,据说最早的发起者对Mysql很精通,后来从阿里跳槽了,阿里随后开源的Cobar,并维持到2013年年初,然后,就没有然后了。

    Mycat就是一个近似等于MySQL的数据库服务器,可以用连接MySQL的方式去连接Mycat(除了端口不同,默认的Mycat端口是8066而非MySQL的3306,因此需要在连接字符串上增加端口信息),

    大多数情况下,可以用你熟悉的对象映射框架使用Mycat,但建议对于分片表,尽量使用基础的SQL语句,因为这样能达到最佳性能,特别是几千万甚至几百亿条记录的情况下。

    Mycat是一个强大的数据库中间件,不仅仅可以用作读写分离、以及分表分库、容灾备份,而且可以用于多租户应用开发、云平台基础设施、让你的架构具备很强的适应性和灵活性,

    借助于即将发布的Mycat智能优化模块,系统的数据访问瓶颈和热点一目了然,根据这些统计分析数据,可以自动或手工调整后端存储,将不同的表映射到不同存储引擎上,而整个应用的代码一行也不用改变。

    二.Mycat原理

    Mycat的原理并不复杂,复杂的是代码,如果代码也不复杂,那么早就成为一个传说了。

    Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等。

     

    三.应用场景

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

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

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

    (3)多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化;

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

    (5)替代Hbase,分析大数据;

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

    四.何为数据切分

    简单来说,就是指通过某种特定的条件,把我们存放在同一个数据库中的数据分散存储到多个数据库里。

    数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;

    另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。

    垂直切分的最大特点就是规则简单,实施也更为方便,尤其适合各业务之间的耦合度非常低,相互影响很小,业务逻辑非常清晰的系统。

    在这种系统中,可以很容易做到将不同业务模块所使用的表分拆到不同的数据库中。根据不同的表来进行拆分,对应用程序的影响也更小,拆分规则也会比较简单清晰。

    水平切分于垂直切分相比,相对来说稍微复杂一些。

    因为要将同一个表中的不同数据拆分到不同的数据库中,对于应用程序来说,拆分规则本身就较根据表名来拆分更为复杂,后期的数据维护也会更为复杂一些。

    1、垂直切分

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

    如下图:

    优点:

    (1)拆分后业务清晰,拆分规则明确。

    (2)系统之间整合或扩展容易。

    (3)数据维护简单。

    缺点:

    (1)部分业务表无法join,只能通过接口方式解决,提高了系统复杂度。

    (2)受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高。

    (3)事务处理复杂。

    (4)由于垂直切分是按照业务的分类将表分散到不同的库,所以有些业务表会过于庞大,存在单库读写与存储瓶颈,所以就需要水平拆分来做解决。

    2、水平切分

    相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。

    简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中。

    如图:

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

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

    (2)按照日期,将不同月甚至日的数据分散到不同的库中。

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

    优点有:

    (1)拆分规则抽象好,join操作基本可以数据库做。

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

    (3)应用端改造较少。

    (4)提高了系统的稳定性跟负载能力。

    缺点有:

    (1)拆分规则难以抽象。

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

    (3)数据多次扩展难度跟维护量极大。

    (4)跨库join性能较差

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

    (1)引入分布式事务的问题。

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

    (3)多数据源管理问题。

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

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

    第二原则:如果要切分一定要选择合适的切分规则,提前规划好。

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

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

  • 相关阅读:
    微服务- 认识我们的服务2
    微服务- 用于定位日志的会话的传播简单实现4
    微服务-Feign性能调优3
    微服务-为什么要微服务1
    GateWay与熔断器
    slf4j-api、slf4j-log4j12、log4j之间关系
    关于tomcat的axConnections、maxThreads、acceptCount
    Spring注解@Resource和@Autowired区别对比详解
    关于spring MVC 关键组件 & 流程
    关于spring MVC的全局异常处理
  • 原文地址:https://www.cnblogs.com/ZJOE80/p/12957184.html
Copyright © 2011-2022 走看看