MySQL分布式中间件MYCAT解析

在应用系统用户量不断增加之后,带来性能上的瓶颈,此时通过在应用的服务端添加负载均衡即可提升性能,但是系统访问数量还在不断增加,有一天发现再增加应用层的负载均衡已经达不到预期的效果了,此时的性能瓶颈很可能在数据库,单台数据库已经达到了性能上限,但是将数据库进行负载均衡是非常麻烦的,此时应该考虑使用数据库的分布式中间件产品MYCAT,它为数据库访问量不断增大时出现性能瓶颈提供了解决问题思路。

1、MYCAT的起源

         阿里巴巴在2008年推出了Amoeba,当时正好是在阿里去IOE的浪潮中,Amoeba提供了负载均衡,SQL过滤等功能,在2012年随着阿里业务量增长,Amoeba也越来越不适应当时不断增长的需求,同年在Amoeba的基础上阿里开源了替代Amoeba的产品Cobar,不过后来就没进行维护了,Cobar本身也存在不少问题,在2013年阿里推出了开源产品MYCAT,MYCAT在Cobar系统的基础上进行了升级和改造,修复了很多问题(例如在高并发下回导致Cobar假死),同时开源社区非常活跃,在2017年,MYCAT推出了1.6版本。

2、什么是MYCAT?

    MYCAT是基于Java的一个分布式数据库系统中间层,为高并发下数据库的分布式提供解决方案。

3、MYCAT的主要作用是什么?

    数据库中间层是位于前端应用和后端数据库之间的一个层。

  1. 传统Java项目使用数据库连接池的形式连接数据库,这样多个项目连接同一个数据库,冗余的连接会随着项目的增加而出现线性增长,这不利于数据库连接数量的控制,但是当使用中间层之后,前端应用统一通过中间层获取连接,将不用自己维护连接池,可避免连接数不断增加的问题。
  2. 数据库中间层还可以屏蔽后端数据库的一些变更,使前台应用不受影响,例如对数据库进行了水平或者垂直切分。
  3. MYCAT原生实现了对MySQL的支持,也可以通过jdbc形式连接其它关系型数据库 如 Oracle,Sqlserver,也可以连接非关系型数据库 如 mongodb,这个功能其他同类型产品没有。
  4. 可实现数据库的读写分离,在后端的主从复制数据库集群中,通过MYCAT配置,将前台的写操作路由到主数据库中,将读操作路由到从数据库上。
  5. MYCAT可以实现读写分离下的读操作负载均衡,将大量的读操作均衡到不同的从库上,主要出现在一主多从情形下。
  6. MYCAT可实现数据库的高可用,在数据库主节点可用的情况下,配置一台可写从节点,这两个节点都配置在MYCAT中,当主节点宕机时,MyCAT会自动将写操作路由到备用节点上,但并不支持在切换之后的继续主从同步。
  7. 当读写分离已经不能满足持续增加的访问量时,MYCAT可实现数据库的垂直拆分,将所有的数据库表按照模块划分,不同类型的表拆分到不同的数据库服务器。
  8. 随着业务量的增长,垂直拆分之后如果又出现了数据库性能问题,则需要进行水平切分,这就是俗称的分库分表。将数据量很大的表数据切分到不同的服务器库中,表结构是一样的,而使用MYCAT实现水平切分,对前端应用是完全透明的,不用调整前台逻辑。

4、MYCAT使用场景

        当业务系统的读写操作都在一台数据库,数据库出现了性能问题,而且对数据库的所有操作中读负载明显高于写负载时,此时应使用MYCAT读写分离方案。

        当数据表数据量达到1000万以后,所有的优化操作都已经用完了,此时应使用MYCAT的分库分表功能。

        在统计报表系统中,也可以使用MYCAT加速数据的统计分析。

        MYCAT还可以使用在需要同时查询多种数据库的场景,MYCAT支持通过JDBC连接到不同类型的数据库。

5、MYCAT的优势

         MYCAT是基于阿里巴巴Cobar进行开发,经历了Alibaba大数据业务的考验。

         MYCAT是基于Java进行开发,开源免费,资料文档相对容易找到,跨平台移植更方便。

         MYCAT社区活跃,使用人数多,说明功能相对稳定。

         支持多种关系型和非关系性数据库。

6、MYCAT 其他概念

        逻辑库,逻辑库是存在于MYCAT中的一个数据库定义,相当于后端数据库分片之后的一个集合视图,前端应用只需要关注逻辑库而并不需要关注它的分片结构,MYCAT会保存逻辑库的定义,而不会保存逻辑库数据,同理的概念还有逻辑表,数据库表进行水平切分后分布在不同的服务器中,前端应用只需要对逻辑表进行操作。

         ER关系分片策略,在进行数据库表的垂直切分时,MYCAT可按照ER关系,将相互关联的表切分到相同的数据库中,提升查询效率。

         全局序列号,数据库分片之后,相同的表可能产生相同的ID,全局序列号可是提供跨分片的序列号。

猜你喜欢

转载自my.oschina.net/ruoli/blog/1789370