目前的数据库中间件有很多,本节将介绍主流的中间件,并从各个维度将其与Mycat进行对比。
Mango的中文名是“芒果”,它是一个轻量级的极速数据层访问框架,目前已有十多个大型线上项目在使用它。据称,某一支付系统利用Mango承载了每秒12万的支付下单请求,其超高的性能及超快的响应速度几乎相当于直接使用JDBC。它采用接口与注解的形式定义DAO,完美地结合了db与cache操作;支持动态SQL,可以构造任意复杂的SQL语句;支持多数据源、分表、分库、事务;内嵌“函数式调用”功能,能将任意复杂的对象映射到数据库的表中。但是从整体上看Mango是一个Java Dao Framework,是一个jar包,它的运行依赖于应用系统的项目代码和服务器,采用了JDBC Shard思想,与TDDL是同款产品。
Cobar是阿里巴巴研发的关系型数据的分布式处理系统(Amoeba的升级版,该产品成功替代了原先基于Oracle的数据存储方案,目前已经接管了3000多个MySQL数据库的schema,平均每天处理近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的负担,维护了连接池。
Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的Proxy。它集中响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行,基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,Amoeba的作者强调的是Amoeba配置的便捷性(基于XML的配置文件,用SQLJEP语法书写规则,比基于Lua脚本的MySQL Proxy简单)。
Mycat与以上中间件的对比如表1-1所示。
Mycat对Cobar代码进行了彻底重构,使用NIO重构了网络模块,并且优化了Buffer内核,增强了聚合、Join等基本特性,同时兼容绝大多数数据库,成为通用的数据库中间件。Mycat后端以JDBC方式支持Oracle、DB2、SQL Server、MongoDB、SequoiaDB等数据库,支持透明的读写分离机制,减轻了写库的压力,提高了数据库的并发查询能力,支持各种MySQL集群,包括标准的主从异步集群、MySQL Galera Cluster多主同步集群等,提升了数据库的可用性与性能,还可以通过大表水平分片方式支持100亿级大表的分布式存储和秒级的并行查询能力,内建数据库集群故障切换机制,实现了自动切换,可满足大部分应用的高可用性要求。
Mycat现在由一支强大的技术团队维护,吸引和聚集了一大批业内大数据和云计算方面的资深工程师,参与者都是有5年以上经验的资深软件工程师、架构师、DBA,优秀的技术团队保证了Mycat的产品质量。Mycat不依托于任何一家商业公司,因此不像某些开源项目将一些重要的特性封闭在其商业产品中,它的发展和壮大主要基于开源社区志愿者的持续努力。
Mycat还形成了一系列周边产品,比较有名的是Mycat-web、Mycat-NIO、Mycat-Balance等,已成为一个比较完整的数据处理解决方案,而不仅仅是中间件。
想要用好Mycat,就需要了解其适用场景,以下几个场景适合使用Mycat。
利用Mycat可以轻松实现热备份,当一台服务器停机时,可以由双机或集群中的另一台服务器自动接管其业务,从而在无须人工干预的情况下,保证系统持续提供服务。这个切换动作由Mycat自动完成。
Mycat还可以轻松实现数据库的读写分离,实现主数据库处理事务的增、改、删(INSERT、UPDATE、DELETE)操作,而在数据库中处理查询(SELECT)操作。需要强调的是,Mycat的读写分离及自动切换都依赖于数据库产品的主从数据同步。
企业的数据量总是在无休止地增长,这些数据的格式不一样,访问频率不一样,重要性也不一样。如果将这些数据统一存储在高性能的数据库产品中,不但价格昂贵,而且随着数据量的不断增长,读写的性能会受到影响,统一存储的性能也会逐渐下降,维护成本相当高,所以此时我们需要对数据进行分级存储。
数据分级存储是指数据客体存放在不同级别的存储设备(磁盘、磁盘阵列、光盘库、磁带库)中,通过分级存储管理软件实现数据客体在存储设备之间的自动迁移及自动访问切换。在企业的数据中,比较重要的交易类热数据通常存放在Oracle等关系型数据库中;历史数据通常存放在其他数据库中;日志数据通常存放在NoSQL或其他日志管理产品中;图片数据通常存放在图片分布式系统中。考虑到成本因素,对于不同的数据所采用的磁盘性能也不一样。如何统一管理这些不同的业务数据,并给业务系统提供一个统一的入口呢?此时,Mycat可以派上用场。
Mycat与生俱来的中间件特性决定了它能承担这一重任,并且只需几个配置就能实现。在Mycat中,一个逻辑库可以对应Oracle、MySQL、MongoDB等多个数据源,对于用户而言就像一个数据库,用户并不知道后端有哪些数据库,只需要关注Mycat。
数据切分是Mycat的核心功能,是指通过某种特定的条件,将存放在同一个数据库中的数据分散存放在多个数据库(主机)中,以达到分散单台设备负载的效果。数据切分有两种切分模式:一种是按照不同的表(或者schema)将数据切分到不同的数据库(主机)中,这种切分可以叫作数据的垂直(纵向)切分;另外一种则是根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多个数据库(主机)中,这种切分叫作数据的水平(横向)切分。当数据量超过800万行时需要做分片,这时可以利用Mycat实现数据切分。
Mycat基于MySQL实例的连接池复用机制,可以让每个应用最大程度地共享一个MySQL实例的所有连接池,让数据库的并发访问能力大大提升。
当一个项目需要用到多种数据源如Oracle、MySQL、SQL Server、PostgreSQL时,可以利用Mycat进行整合,只需访问Mycat这一个数据源就行。