搜索 K
Appearance
博客正在加载中...
Appearance
介绍下 MyCat
Mycat 是数据库中间件。
先说说什么是中间件:中间件是一类连接软件组件和应用的计算机软件,以便于软件各部件之间的沟通。例子:web 中间件(Tomcat,Nginx 等),消息中间件。
数据库中间件:连接 Java 应用程序和数据库
为什么要用 Mycat?首先我们来看没有 MyCat 时的情况:
而如果用了 MyCat 呢?
相当于 MyCat 是一个逻辑数据库,对于 Java 应用来说,只有一个数据源,就比如 Nginx 分发给多台主机 数据库中间件对比
官网:MyCat2
GitHub:MyCATApache/Mycat
Gitee:Mycat2
1、读写分离。当访问量大的时候,一台数据库不足以支撑,此时可以再搭建一个数据库,由 2 台数据库提供访问;但只有一台主机提供写请求(避免两个数据库的数据不一致):

如果主机挂了怎么办?可以再搭建一个主从,实现双主双从结构。首先搭建单主单从,后续再搭建双主双从:
2、数据分片
当一个表,数据达到千万级别,查询效率会变的很低;此时我们可以拆分该表:
拆分后,如果在 Java 程序里去指定该查询哪个库的哪个表,那么是也太不方便了,而且是紧耦合。这时我们可以使用 MyCat 中间件。

3、多数据源整合。
有时候我们不仅仅会用到一种数据源,有时候还会使用 Redis、Mongodb 等;此时我们也可以使用 MyCat,针对不同的请求使用,由 MyCat 分发给对应的数据源。
比如关键数据用多主,常规数据用主从切换,一些只存储一段时间的日志类数据等

MyCat 功能这么强大,它的原理很复杂吗?MyCat 的原理中最重要的一个动词是 "拦截",它拦截了用户发送过来的 SQL 语句,然后对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
比如我们用了分表技术,根据 prov 字段差分了 3 个库,如果我要查询 zhejiang 的数据,MyCat 就会去查询 DB1:

这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用 Mycat 还是 MySQL。
MyCat2 和之前的版本对比如下(内容来自官网文档 Mycat1.x 与 Mycat2 功能对比):
| 功能 | 1.6 | 2 |
|---|---|---|
| 多语句 | 不支持 | 支持 |
| blob 值 | 支持一部分 | 支持 |
| 全局二级索引 | 不支持 | 支持 |
| 任意跨库 join(包含复杂查询) | catlet 支持 | 支持 |
| 分片表与分片表 JOIN 查询 | ER 表支持 | 支持 |
| 关联子查询 | 不支持 | 支持一部分 |
| 分库同时分表 | 不支持 | 支持 |
| 存储过程 | 支持固定形式的 | 支持更多 |
| 支持逻辑视图 | 不支持 | 支持 |
| 支持物理视图 | 支持 | 支持 |
| 批量插入 | 不支持 | 支持 |
| 执行计划管理 | 不支持 | 支持 |
| 路由注释 | 支持 | 支持 |
| 集群功能 | 支持 | 支持更多集群类型 |
| 自动 hash 分片算法 | 不支持 | 支持 |
| 支持第三方监控 | 支持 mycat-web | 支持普罗米斯, kafka 日志等监控 |
| 流式合拼结果集 | 支持 | 支持 |
| 范围查询 | 支持 | 支持 |
| 单表映射物理表 | 不支持 | 支持 |
| XA 事务 | 弱 XA | 支持, 事务自动恢复 |
| ..... | ..... | ..... |