Mycat是一个彻底开源的面向企业应用开发的大数据库集群,支持事务、ACID,是可以替代MySQL的加强版数据库。Mycat被视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群,它是融合了内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server,是结合了传统数据库和新型分布式数据仓库的新一代的企业级数据库产品,也是一个优秀的数据库中间件。
目前的数据库中间件有很多。
Mango的中文名是“芒果”,它是一个轻量级的极速数据层访问框架,目前已有十多个大型线上项目在使用它。据称,某一支付系统利用Mango承载了每秒12万的支付下单请求,其超高的性能及超快的响应速度几乎相当于直接使用JDBC。它采用接口与注解的形式定义DAO,完美地结合了db与cache操作;支持动态SQL,可以构造任意复杂的SQL语句;支持多数据源、分表、分库、事务;内嵌“函数式调用”功能,能将任意复杂的对象映射到数据库的表中。但是从整体上看Mango是一个Java Dao Framework,是一个jar包,它的运行依赖于应用系统的项目代码和服务器,采用了JDBC Shard思想,与TDDL是同款产品。
Cobar是阿里巴巴研发的关系型数据的分布式处理系统(Amoeba的升级版,该产品成功替代了原先基于Oracle的数据存储方案,目前已经接管了3000多个MySQL数据库的scheme,平均每天处理近50亿次的SQL执行请求。
Heisenberg源于Cobar,结合了Cobar和TDDL的优势,让其分片策略变为分库分表策略,节约了大量的连接。优点是分库分表与应用脱离,分库分表如同使用单库表一样,减少了db连接数的压力,采用热重启配置,可水平扩容,并遵循 MySQL原生协议,采用读写分离,无语言限制。MySQL Client、C、Java等都可以使用Heisenberg服务器通过管理命令查看和调整连接数、线程池、节点等。Heisenberg采用velocity的分库分表脚本进行自定义分库分表,相当灵活。
Atlas是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据库中间层项目。它在MySQL-proxy 0.8.2版本的基础上进行了优化,增加了一些新的功能和特性。奇虎360内部使用Atlas运行的MySQL业务,每天承载的读写请求数达几十亿条。Atlas位于应用程序与MySQL之间,实现了MySQL的客户端与服务端协议,作为服务端与应用程序通信,同时作为客户端与MySQL通信。它对应用程序屏蔽了db的细节,同时为了降低MySQL的负担,维护了连接池。
Ameoba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的Proxy。它集中响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行,基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,Ameoba的作者强调的是Amoeba配置的便捷性(基于XML的配置文件,用SQLJEP语法书写规则,比基于Lua脚本的MySQL Proxy简单)。
Mycat与以上中间件的对比如下表所示。
对比项目 | Mycat | Mango | Coba | Heisenberg | Atlas | Amoeba |
---|---|---|---|---|---|---|
数据切片 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
读写分离 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
宕机自动切换 | 支持 | 不支持 | 支持 | 不支持 | 半支持,影响写 | 不支持 |
MySQL协议 | 前后端支持 | JDBC | 前端支持 | 前后端支持 | 前后端支持 | JDBC |
支持的数据库 | MySQL、Oracle、MongoDB、PostgreSQL | MySQL | MySQL | MySQL | MySQL | MySQL、MongoDB |
社区活跃度 | 高 | 活跃 | 停滞 | 低 | 中等 | 停滞 |
文档资料 | 极丰富 | 较齐全 | 较齐全 | 缺少 | 中等 | 缺少 |
是否开源 | 开源 | 开源 | 开源 | 开源 | 开源 | 开源 |
是否支持事务 | 弱XA | 支持 | 单库强一致、分布式弱事务 | 单库强一致、多库弱事务 | 单库强一致、分布式弱事务 | 不支持 |
业务开发人员通常在实际应用中并不需要知道中间件的存在,只需要关注数据库,所以数据库中间件可以被当作一个或多个数据库集群构成的逻辑库。
在云计算时代,数据库中间件可以以多租户的形式为一个或多个应用提供服务,每个应用访问的可能是一个独立或者共享的物理库。
分片表是将指数据量很大的表切分到多个数据库实例中,所有分片组合起来构成了一张完整的表。
并非所有的表在数据量很大时都需要进行分片,某些表可以不用分片。非分片表是相对于分片表而言的不需要进行数据切片的表。
关系型数据库是基于实体关系模型(Entity Relationship Model)的,Mycat中的ER表便来源于此。基于此思想,Mycat提出了基于E-R关系的数据分片策略,子表的记录与其所关系的父表的记录存放在同一个数据分片上,即子表依赖于父表,通过表分组(Table Group)保证数据关联查询不会跨库操作。
表分组(Table Group)是解决跨分片数据关联查询的一种很好的思路,也是数据切分的一条重要规则。
在一个真实的业务场景中往往存在大量类似的字典表,这些字典表中的数据变动不频繁,而且数据规模不大,很少有超过数十万条的记录。
当业务表因为规模进行分片后,业务表这些附属的字典表之间的关联查询就成了比较棘手的问题,所以在Mycat中通过数据冗余来解决这类表的关联查询,即所有分片都复制了一份数据,我们把这些冗余数据的表定义为全局表。
数据冗余是解决跨分片数据关联查询的一种很好的思路,也是数据切分规划的另一条重要规则。
将数据切分后,一个多大个被分到不同的分片数据 库上,每个表分片所在的数据库就是分片节点。
将数据切分后,每个分片节点不一定会独占一台机器,同一台机器上可以有多个分片数据库,这样一个或多个分片节点所在的机器就是节点主机。为了规避单节点主机并发数量的限制,尽量将读写压力高的分片节点均匀地放在不同的节点主机上。
参考资料:
[1] http://mycat.io/
[2] 《分布式数据库架构及企业实践——基于Mycat中间件》
[3] 龙哥官方课程课件
本文出自 “ygqygq2” 博客,请务必保留此出处http://ygqygq2.blog.51cto.com/1009869/1973653
原文地址:http://ygqygq2.blog.51cto.com/1009869/1973653