Mycat的基本介绍

Posted 顶级程序员之家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mycat的基本介绍相关的知识,希望对你有一定的参考价值。

1、mycat是什么

Mycat 是什么?从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了 mysql 协议的Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用MySQL 原生(Native) 协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。 Mycat 发展到目前的版本,已经不是一个单纯的 MySQL 代理了,它的后端可以支持 MySQL、 SQL Server、Oracle、 DB2、 PostgreSQL 等主流数据库,也支持 MongoDB 这种新型 NoSQL 方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在 Mycat 里,都是一个传统的数据库表,支持标准的SQL 语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度,在测试阶段,可以将一个表定义为任何一种 Mycat 支持的存储方式,比如 MySQL 的 MyASIM 表、内存表、或者MongoDB、 LevelDB 以及号称是世界上最快的内存数据库 MemSQL 上。试想一下,用户表存放在 MemSQL 上,大量读频率远超过写频率的数据如订单的快照数据存放于 InnoDB 中,一些日志数据存放于 MongoDB 中,而且还能把 Oracle 的表跟 MySQL 的表做关联查询,你是否有一种不能呼吸的感觉?而未来,还能通过 Mycat 自动将一些计算分析后的数据灌入到 Hadoop 中,并能用 Mycat+Storm/Spark Stream 引擎做大规模数据分析,看到这里,你大概明白了, Mycat 是什么?Mycat 就是 BigSQL, Big Data On SQL Database。 

很多同学看到上面的描述之后,可能还是比较懵逼,不知道mycat到底是个啥,下面我们来详细讲解下对于不同的角色,mycat到底是个啥?

对于DBA而言,可以这么理解mycat:

Mycat就是MySQL Server,而Mycat后面连接的MySQL Server,就好像是MySQL的存储引擎,如InnoDB,MyISAM等,因此,Mycat本身并不存储数据,数据是在后端的MySQL上存储的,因此数据可靠性以及事务都是MySQL保证的,简单说,Mycat就是MySQL最佳伴侣,它再一定程度上让MySQL拥有了能跟Oracle PK的能力。

对于软件工程师来说,可以这么理解mycat:

Mycat就是一个近似等于MySQL的数据库服务器,你可以用连接MySQL的方式去连接Mycat,除了端口不同,默认的mycat端口是8066而不是mysql的3306,因此需要再连接字符串上增加端口信息,大多数情况下,可以用你熟悉的对象映射框架使用mycat,但建议对于分片表,尽量使用基础的SQL语句,因为这样能达到最佳性能,特别是几千万甚至几百亿条记录的情况下。

对于架构师来说,可以这么理解mycat:

mycat是一个强大的数据库中间件,不仅仅可以用作读写分离、以及分库分表、容灾备份,而且可以用于多租户应用开发,云平台基础设施,让你的架构具备很强的适应性和灵活性,借助于即将发布的mycat只能优化模块,系统的数据访问瓶颈和热点一目了然,根据这些统计分析数据,你可以自动或手工调整后端存储,将不同的表映射到不同的存储引擎上,而整个应用的代码一行也不用改变。

2、mycat的原理

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

mycat的原理中最重要的一个动作是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发送后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。

上述图片里,orders表被分为了三个分片datanode(简称dn),这三个分片是分布在两台MySQL Server上(Datahost),即datanode=database@datahost方式,因此你可以用一台到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上的查询结果,并返回给用户。

如果上述sql改为select * from orders where prov in (wuhan,beijing),那么,sql就会发给MySQL1和MySQL2去执行,然后结果集合并后输出给用户。但通常业务中我们的SQL会有order by以及limit翻页语法,此时就设计到结果集在mycat端的二次处理,这部分代码也比较复杂,而最复杂的则属两个表的join,为此,mycat提出了创新性的ER分片,全局表,HBT(human brain tech)人工智能的catlet,以及结合storm/spark引擎等十八般武艺的解决办法,从而称为目前业界最强大的方案,这就是开源的力量。

3、应用场景

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

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

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

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

4、报表系统,借助mycat的分表能力,处理大规模报表的统计

5、整合多数据源

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

7、数据库路由器,mycat基于mysql实例的连接池复用机制,可以让每一个应用最大程度地共享一个mysql实例地所有连接池,让数据库地并发访问能力大大提升

4、为什么使用mycat

1、java与数据库紧耦合

2、高访问量高并发对数据库的压力

3、读写请求数据不一致

5、数据库中间件对比

对比项目 mycat mango cobar heisenberg altas amoeba
数据切片 支持 支持 支持 支持 支持 支持
读写分离 支持 支持 支持 支持 支持 支持
宕机自动切换 支持 不支持 支持 不支持 半支持,影响写 不支持
mysql协议 前后端支持 JDBC 前端支持 前后端支持 前后端支持 JDBC
支持的数据库 mysql,oracle,mongodb,postgresql mysql mysql mysql mysql mysql,mongodb
社区活跃度 活跃 停滞 中等 停滞
文档资料 极丰富 较齐全 较齐全 较少 中等 缺少
是否开源 开源 开源 开源 开源 开源 开源
是否支持事务 弱XA 支持 单库强一致,分布式弱事务 单库强一致,多库弱事务 单库强一致,分布弱事务 不支持


明天继续介绍:mycat的核心概念

以上是关于Mycat的基本介绍的主要内容,如果未能解决你的问题,请参考以下文章

MyCAT+MySQL 搭建高可用企业级数据库集群

MyCAT+MySQL 搭建高可用企业级数据库集群

mycat基本概念及读写分离一

MyCat - 使用篇

MyCAT介绍

MyCat介绍和使用