Mycat 概述

是什么

是一种数据库中间件。中间件是一种连接软件组件和应用的计算机软件,便于软件各部分的沟通与解耦。比如 Tomcat 就是一种 web 中间件。

使用数据库中间件的原因:

  1. Java 程序与数据库间存在耦合;
  2. 高并发情况下数据库压力大;
  3. 读写请求数据不一致。

各个数据库中间件间对比:Mycat 概述

干什么

读写分离

通过 Mycat 将 Java 程序对数据库的写请求与读请求分别转发向不同的数据库。
Mycat 概述

数据分区

通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机) 上面,以达到分散单台设备负载的效果。

垂直切分

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

优点: ①拆分后业务清晰,拆分规则明确;②系统易整合易扩展;③数据维护简单。

缺点: ①部分业务表无法 join,只能通过接口方式解决,提高了系统复杂度;②受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高;③事务处理复杂。

水平切分

相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,如图:
Mycat 概述

拆分数据就需要定义分片规则。关系型数据库是行列的二维模型,拆分的第一原则是找到拆分维度。比如: 从会员的角度来分析,商户订单交易类系统中查询会员某天某月某个订单,那么就需要按照会员结合日期来拆分, 不同的数据按照会员 ID 做分组,这样所有的数据查询 join 都会在单库内解决;如果从商户的角度来讲,要查询某 个商家某天所有的订单数,就需要按照商户 ID 做拆分。

几种分片规则:

  1. 按照用户 ID 求模,将数据分散到不同的数据库,具有相同数据用户的数据都被分散到一个库中;
  2. 按照日期,将不同月甚至日的数据分散到不同的库中;
  3. 按照某个特定的字段求模,或者根据特定范围段分散到不同的库中。

优点: ①拆分规则抽象好,join 操作基本可以数据库做;②不存在单库大数据,高并发的性能瓶颈;③应用端改造较少;④提高系统稳定性与负载能力。

缺点: ①拆分规则抽象;②分片事务一致性难以解决;③数据多次扩展难度跟维护量极大;④跨库 join 性能差。

共同的缺点:

  1. 引入分布式事务的问题
  2. 跨节点 join 的问题
  3. 跨节点合并排序分页问题
  4. 多数据源管理问题

多数据源管理

Mycat 概述

原理

Mycat 的原理中最重要的一个动词是 拦截,它拦截了用户发送过来的 SQL 语句,首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
Mycat 概述
上述图片里,Orders 表被分为三个分片 datanode(简称dn),这三个分片是分布在两台 MySQL Server上(DataHost),即 [email protected] 方式,因此你可以用一台到 N 台服务器来分片,分片规则为(sharding rule)典型的字符串枚举分片规则,一个规则的定义是分片字段(sharding column) + 分片函数(rule function),这里的分片字段为 prov 而分片函数为字符串枚举方式。

当Mycat 收到一个 SQL 时,会先解析这个 SQL,查找涉及到的表,然后看此表的定义,如果有分片规则,则获取到 SQL 里分片字段的值,并匹配分片函数,得到该 SQL 对应的分片列表,然后将 SQL 发往这些分片去执行,最后收集和处理所有分片返回的结果数据,并输出到客户端。以 select*from Orders where prov=? 语句为例,查到 prov=wuhan,按照分片函数,wuhan 返回 dn1,于是 SQL 就发给了MySQL1,去取 DB1 上的查询结果,并返回给用户。