MyCat - 背景篇(2)

数据库路由中间件MyCat - 背景篇(2)

MyCat的前世今生

如前文所说,Amoeba、Cobar、MyCat等属于同宗一脉。若Amoeba能继续下去,Cobar就不会出来;若Cobar那批人不是都走光了的话,MyCAT也不会再另起炉灶。Cobar之后,有很多类似中间件仿照其架构以及思路,针对特定的业务场景,设计出了不同的中间件。MyCat算是其中业务场景比较全面,使用配置比较简便,性能优秀,而且功能算是稳定的。同类的中间件,都是针对特定场景或者功能进行设计,像某科技的hot某中间件,性能和功能更为稳定,但是业务场景有局限,扩展分布性不是很好。
所以,我们这里对MyCat进行较为全面的剖析,以供广大程序猿同志们的参考:)

MyCat架构对比

首先,我们参考MyCat的社区文档。对比下Amoeba、Cobar、MyCat这三个中间件的架构

Amoeba在前端实现了MySQL协议栈,前端链接属于NIO实现,应用将SQL请求发往Amoeba,Amoeba经过请求解析请求路由将请求通过JDBC发到后端数据库集群。返回的结果经过合并与过滤返回到前端。

Cobar首先将后端JDBC换成了自己实现的原生MySQL通信层,并引入了池化的思想管理后端BIO连接池。实现自己的MySQL通信层,可以实现更多后端的功能,比如主备切换、读写分离、异步操作等。而且,实现了管理协议,可以进行动态配置

MyCat通过连接池管理前后端连接,并且前后端都有NIO与AIO的实现。功能与改造开发上更为丰富与灵活

总结-为什么选择MyCat

MyCat实现了MySQL的协议栈,可以理解为,Mycat就是MySQL Server,而Mycat后面连接的MySQL Server,就好象是MySQL的存储引擎,如InnoDB,MyISAM等,因此,Mycat本身并不存储数据,数据是在后端的MySQL上存储的,因此数据可靠性以及事务等都是MySQL保证的,简单的说,Mycat就是MySQL最佳伴侣,它在一定程度上让MySQL拥有了能跟Oracle PK的能力:D
MyCat功能非常全面,从动态配置,集群配置,结果聚合,读写分离、到分表分库、容灾备份等。而且可以用于多租户应用开发、云平台基础设施、让你的架构具备很强的适应性和灵活性,借助于即将发布的Mycat智能优化模块,系统的数据访问瓶颈和热点一目了然,根据这些统计分析数据,你可以自动或手工调整后端存储,将不同的表映射到不同存储引擎上,而整个应用的代码一行也不用改变。MyCat的框架思路与源代码也有很多可圈可点的地方。
虽然MyCat功能很全面,但是某些功能受限于开源产品以及人的思路不同,MyCat的全面并不是那么“全面”。比如,它对于某些MySQL语句的支持并不是那么理想,后台数据库如果出现单点缓慢,性能会很受影响等的问题,还有弱XA分布式事务。我们在应用MyCat的时候,需要根据自己的业务,来改造MyCat。
改造MyCat不是一件很困难的事,对于MyCat源代码的研究与改造也是一件很锻炼团队的事,改造成功后相信MyCat能够撑住未来很长一段时间的数据库管理需求,这真是一石二鸟的事情。MyCat社区在中国的开源社区中也算是最活跃的几个之一,这也是件很难得的事情。
接下来我们将从MyCat的使用开始,一步一步深入到MyCat的源代码原理及设计思路,最后结合具体应用场景调优MyCat。敬请期待

时间: 2024-12-18 03:02:47

MyCat - 背景篇(2)的相关文章

MyCat - 使用篇(1)

数据库路由中间件MyCat - 使用篇(1) 基本概念 直接介绍概念太枯燥了,还是拿个和背景篇相似的例子介绍 业务场景:客户完成下单,快递员接受并更新运单状态,客户可以随时查看运单状态的任务.一票快递可能有多个子母件. 因此,我们需要建立如下表:  我们现在按照业务将数据库垂直拆分成运单(3000tps,4000W数据),快递员(1500tps,100W数据),客户(1500tps,4000W数据记录),运单表和客户表均按照某种规则分片,平均分成两片.然后假设他们都通过MyCat统一管理.  1

数据库路由中间件MyCat - 使用篇(1)

此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 基本概念 直接介绍概念太枯燥了,还是拿个和背景篇相似的例子介绍 业务场景:客户完成下单,快递员接受并更新运单状态,客户可以随时查看运单状态的任务.一票快递可能有多个子母件.同时,我们需要标记每个运单的状态,运单状态的解释和含义保存在运单状态字典表中. 因此,我们需要建立如下表:我们现在按照业务将数据库垂直拆分成运单库(单表2000tps,6000W数据),快递员库(单表1500tps,100W数据),客户

死磕MyCat使用篇之第一篇

基本概念 直接介绍概念太枯燥了,还是拿个和背景篇相似的例子介绍业务场景:客户完成下单,快递员接受并更新运单状态,客户可以随时查看运单状态的任务.一票快递可能有多个子母件.同时,我们需要标记每个运单的状态,运单状态的解释和含义保存在运单状态字典表中.因此,我们需要建立如下表: 我们现在按照业务将数据库垂直拆分成运单库(单表2000tps,6000W数据),快递员库(单表1500tps,100W数据),客户库(单表1500tps,1000W数据记录):假设每个MySQL数据库单表不能超过2000W数

MyCat - 使用篇(2)

数据库路由中间件MyCat - 使用篇(2) 基本概念 3. 分片 3.1 分片节点(dataNode) 表被水平切分后,每个分片表所在的数据库就是一个分片节点.一个分片节点对应一个数据库(mysql数据库).一个分片节点只能保存每个分片表的一个分片,因为db中不允许出现同名的表. 3.2 节点主机(dataHost) 分片节点究竟被放在那个主机上.对应mysql里的mysql实例:一台主机可以部署多个mysql实例,一个mysql实例可以有多个数据库.为了规避单节点主机并发数限制,尽量将读写压

MyCat - 使用篇(3)

数据库路由中间件MyCat - 使用篇(3) 全局序列号 数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯一性标识,这种保证全局性的数据唯一标识的机制就是全局序列号(sequence). 全局序列号有很多实现的方式,比如本地配置文件,或者拿一个分片节点保存全局序列号,但是这么做都有单点故障的问题,从架构上看不推荐这么做. 全局序列号还是推荐用独立的id生成器服务去实现最佳! 安装准备 环境 Red Hat Enterprise Linux Serv

MyCat - 使用篇(4)

数据库路由中间件MyCat - 使用篇(4) 配置MyCat 3. 配置conf/rule.xml 1.4.1中的规则配置比较笨,1.5中优化了一些,将tableRule标签和function标签合并了,并且支持Velocity模板语言,更加灵活.这里先介绍1.4.1的: <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mycat:rule SYSTEM "rule.dtd">

MyCat - 使用篇(5)

数据库路由中间件MyCat - 使用篇(5) 配置MyCat 4. 配置schema.xml schema.xml里面管理着MyCat的逻辑库.表,每张表使用的分片规则.分布在哪个DataNode以及DataSource上. 之前的例子:  <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:s

MyCat - 源代码篇(14)

数据库路由中间件MyCat - 源代码篇(14) 5. 路由模块 真正取得RouteResultset的步骤:AbstractRouteStrategy的route方法: Created with Rapha?l 2.1.0Start处理一些路由之前的逻辑,返回真假?return nullsql拦截器拦截(就是用户自定义拦截一些语句并改写)是否需要checkSQLschema去掉schema name设置autocommit?是否是DDL语句rrs = DDL语句路由return rrssche

Riak - 背景篇(3)

分布式高可用键值对数据库Riak - 背景篇(3) Dynamo对于数据版本的处理 数据版本问题不止存在于分布式系统,这里针对分布式数据库系统简单讨论下.先看一个简单的例子,用户x对key1做了一次写入操作,我们设值是数字3.然后用户y读取了key1,这个时候用户y知道的值是3.然后用户x对值做了一个+1操作,将新值写入,现在key1的值是4了.而用户y也做了一次+1操作,然后写入,因为用户y读到的值是3,y不知道这个值现在已经变化了,结果按照语义本应该是5的值,现在还是4. 解决这个问题常用的