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 | 支持,事务自动恢复 |
..... | ..... | ..... |