MyCat 是什么,为什么要用
# 10.MyCat 是什么,为什么要用
介绍下 MyCat
# 第一章 入门概述
# 是什么
Mycat 是数据库中间件。
先说说什么是中间件:中间件是一类连接软件组件和应用的计算机软件,以便于软件各部件之间的沟通。例子:web 中间件(Tomcat,Nginx 等),消息中间件。
数据库中间件:连接 Java 应用程序和数据库
为什么要用 Mycat?首先我们来看没有 MyCat 时的情况:
- Java 与数据库紧耦合。如果搭建集群,查询用这个库,写用另一个库,也是紧耦合。
- 高访问量高并发对数据库的压力。
- 读写请求数据不一致。比如有些系统是读请求多,写请求少(例如在商城经常需要浏览商品,最后才下单)
而如果用了 MyCat 呢?
- 有了 MyCat,Java 应用就不用担心数据库配置了 ,只需访问 MyCat 即可。
- 搭建 MySQL 集群,例如 3 个
- 指定某一台 MySQL 写,其他数据库同步
相当于 MyCat 是一个逻辑数据库,对于 Java 应用来说,只有一个数据源,就比如 Nginx 分发给多台主机
数据库中间件对比
- Cobar 属于阿里 B2B 事业群,始于 2008 年,在阿里服役 3 年多,接管 3000+个 MySQL 数据库的 schema, 集群日处理在线 SQL 请求 50 亿次以上。由于 Cobar 发起人的离职,Cobar 停止维护。
- Mycat 是开源社区在阿里 cobar 基础上进行二次开发,解决了 cobar 存在的问题,并且加入了许多新的功能在其中。青出于蓝而胜于蓝。官网:http://www.mycat.org.cn/
- OneProxy 基于 MySQL 官方的 proxy 思想利用 c 进行开发的,OneProxy 是一款商业收费的中间件,不开源。舍弃了一些功能,专注在性能和稳定性上。
- kingshard 由小团队用 go 语言开发,还需要发展,需要不断完善。
- Vitess 是 Youtube 生产在使用,架构很复杂。不支持 MySQL 原生协议,使用需要大量改造成本。
- Atlas 是 360 团队基于 mysql proxy 改写,功能还需完善,高并发下不稳定。
- MaxScale 是 mariadb(MySQL 原作者维护的一个版本) 研发的中间件
- MySQLRoute 是 MySQL 官方 Oracle 公司发布的中间件
- ......
# 官网地址
GitHub:MyCATApache/Mycat (opens new window)
Gitee:Mycat2 (opens new window)
# 能干什么
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 功能对比 (opens new window)):
功能 | 1.6 | 2 |
---|---|---|
多语句 | 不支持 | 支持 |
blob 值 | 支持一部分 | 支持 |
全局二级索引 | 不支持 | 支持 |
任意跨库 join(包含复杂查询) | catlet 支持 | 支持 |
分片表与分片表 JOIN 查询 | ER 表支持 | 支持 |
关联子查询 | 不支持 | 支持一部分 |
分库同时分表 | 不支持 | 支持 |
存储过程 | 支持固定形式的 | 支持更多 |
支持逻辑视图 | 不支持 | 支持 |
支持物理视图 | 支持 | 支持 |
批量插入 | 不支持 | 支持 |
执行计划管理 | 不支持 | 支持 |
路由注释 | 支持 | 支持 |
集群功能 | 支持 | 支持更多集群类型 |
自动 hash 分片算法 | 不支持 | 支持 |
支持第三方监控 | 支持 mycat-web | 支持普罗米斯, kafka 日志等监控 |
流式合拼结果集 | 支持 | 支持 |
范围查询 | 支持 | 支持 |
单表映射物理表 | 不支持 | 支持 |
XA 事务 | 弱 XA | 支持, 事务自动恢复 |
..... | ..... | ..... |