分布式数据库中间件Mycat百亿级数据存储(转)

此文转自: https://www.jianshu.com/p/9f1347ef75dd

 

2013年阿里的Cobar在社区使用过程中发现存在一些比较严重的问题,如高并发下的假死,心跳连接的故障,只实现了一半的NIO,和看上去很美的自动连接让我们在使用过程中掉入了一个接一个的陷阱,苦苦挣扎。终于,经过Mycat带头人Leader.us的改良——Mycat诞生了。

Mycat 开源后,一些 Cobar 的用户参与了Mycat的开发,最终 Mycat 发展成为一个由众多软件公司的实力派架构师和资深开发人员维护的社区型开源软件。

2014 年 Mycat 首次在上海的《中华架构师》大会上对外宣讲,更多的人参与进来,随后越来越多的项目采用了 Mycat。

2015 年 5 月,由核心参与者们一起编写癿第一本官方权威指南《 Mycat 权威指南》电子版发布,累计超过500 本,成为开源项目中的首创。

2015 年 10 月为止,Mycat 项目总共有 16 个 Committer。

截至 2015 年 11 月,超过300 个项目采用 Mycat,涵盖银行、电信、电子唱务、物流、移动应用、 O2O

的众多领域和公司。

截至2016 年 3 月,超过6000 名用户加群或研究讨论或测试或使用 Mycat。

Mycat是基于开源cobar演变而来,我们对cobar的代码进行了彻底的重构,使用NIO重构了网络模块,并且优化了Buffer内核,增强了聚合,Join等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。1.4 版本以后 完全的脱离基本cobar内核,结合Mycat集群管理、自动扩容、智能优化,成为高性能的中间件。我们致力于开发高性能数据库中间而努力。永不收费,永不闭源,持续推动开源社区的发展。

MyCat是什么?

从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库读写分离,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。也可以指定多个写库多个读库。

MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

by 落羽成霜

为什么用Mycat?

1. 连接过多问题,可以通过MyCat统一管理所有的数据源,后端数据库集群对前端应用程序透明。

使用MyCat之前。 关注微信号架构设计者看更多干货

 

MyCat改造后。 关注微信架构设计者看更多干货

2. 独创的ER关系分片,解决E-R分片难处理问题,存在关联关系的父子表在数据插入的过程中,子表会被MyCat路由到其相关父表记录的节点上,从而父子表的Join查询可以下推到各个数据库节点上完成,这是最高效的跨节点Join处理技术,也是MyCat首创。

 

关注微信架构设计者看更多干货

3. 采用全局分片技术,每个节点同时并发插入和更新数据,每个节点都可以读取数据,提升读性能的同时,也解决跨节点Join的效率。

 

关注微信架构设计者查看更多干货

4. 通过人工智能的catlet支持跨分片复杂SQL实现以及存储过程支持等。使用方式主要通过MyCat注释的方式来执行,如下:

(1)跨分片联合查询注解支持:

/*!MyCat:catlet=demo.catlets.ShareJoin / select bu. ,sg.* from base_user bu,sam_glucose sg where bu.id_=sg.user_id;

注:sam_glucose是跨分片表。

(2)存储过程注解支持:

/*!MyCat: sql=select * from base_user where id_=1;*/ CALL proc_test();

注:目前执行存储过程通过MyCat注解的方式执行,注意需要把存储过程中的sql写到注解中。

(3)批量插入与ID自增长结合的支持:

/*!MyCat:catlet=demo.catlets.BatchInsertSequence */ insert into sam_test(name_) values(‘t1’),(‘t2’);

注:此方式不需要在sql语句中显示的设置主键字段,程序在后台根据primaryKey配置的主键列,自动生成主键的sequence值并替换原sql中相关的列和值;

(4)获取批量sequence值的支持:

/*!MyCat:catlet=demo.catlets.BatchGetSequence */SELECT MyCat_get_seq(‘MyCat_TEST’,100);

注:此方法表示获取MyCat_TEST表的100个sequence值,例如当前MyCat_TEST表的最大sequence值为5000,则通过此方式返回的是5001,同时更新数据库中的MyCat_TEST表的最大sequence值为5100。

(5)更好地支持数据库读写分离与高可用性,MyCat支持基于MySQL主从复制状态的高级读写分离控制机制(比如Slave_behind_master <100则开启),而一旦检测到主从同步出错或者延时超过发展,则自动排除readHost,防止程序读到很久的旧数据。

MyCat下一步规划

强化分布式数据库中间件的面的功能,使之具备丰富的插件、强大的数据库智能优化功能、全面的系统监控能力、以及方便的数据运维工具,实现在线数据扩容、迁移、事物等高级功能。

Mycat 吸引和聚集了一大批业内大数据和云计算方面的资深工程师,Mycat 的发展壮大基于开源社区志愿者的持续努力,感谢社区志愿者的努力让Mycat更加强大,同时我们也欢迎更多的志愿者参与Mycat的开发,一起推动社区的发展,为程序世界提供更好的开源中间件。

Mycat 官方网站:http://www.mycat.io/

Mycat 源码:https://github.com/MyCATApache/Mycat-Server

Mycat 下载地址:https://github.com/MyCATApache/Mycat-download



作者:落羽成霜丶
链接:https://www.jianshu.com/p/9f1347ef75dd
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2018-02-03 12:09  西凤楼  阅读(1071)  评论(0编辑  收藏  举报
如果,您认为阅读这篇博客让您有些收获, 如果,您希望更容易地发现我的新博客,不妨关注一下。因为,我的写作热情也离不开您的肯定支持。 感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客。 因为有小孩,兼职卖书,路过的朋友有需要低价购买图书、点读笔、纸尿裤等资源的,可扫最上方二维码,质量有保证,价格很美丽,欢迎咨询!