
MyCat全面解析
MyCat从使用到源码深度解析
hashcon
做自媒体技术分享很久了,大家的抬爱与支持让我很开心很感激,但是个人本来做这些也并不是为了收益,只是为了个人学习与传播知识帮助更多的人,所以我将全网所有账号全部收益,持续捐给各种公益项目,也算不辜负大家的抬爱,也是回报祖国对我的一番培养。
曾任职于顺丰,华为,网易等公司,从Java小白,成长为资深开发与项目组首席架构师。喜欢源码与开源,曾贡献 MyCat1.6 核心源码,贡献过druid,Spring Cloud,dubbox,Apache RocketMQ,Apache Bookeeper 等多开源项目。
展开
-
MyCat - 背景篇(1)
数据库分库分表(路由)中间件MyCat - 背景篇(1)SQL与NoSQL目前,对于互联网海量数据的存储以及处理,按使用场景,分为OLTP(联机事务处理,比如即时交易,强调快速响应与处理)与OLAP(联机分析处理,比如BI,强调多维数据分析)。对于这些数据的存储,主要有两种解决方案,即基于SQL的关系型数据库,和NoSQL的非关系型数据库。 非关系型数据库在某些特定场景下有奇效,比如键值存储(re原创 2016-01-30 14:57:20 · 13179 阅读 · 1 评论 -
MyCat - 背景篇(2)
数据库路由中间件MyCat - 背景篇(2)MyCat的前世今生如前文所说,Amoeba、Cobar、MyCat等属于同宗一脉。若Amoeba能继续下去,Cobar就不会出来;若Cobar那批人不是都走光了的话,MyCAT也不会再另起炉灶。Cobar之后,有很多类似中间件仿照其架构以及思路,针对特定的业务场景,设计出了不同的中间件。MyCat算是其中业务场景比较全面,使用配置比较简便,性能优秀,而且原创 2016-02-01 09:57:18 · 11753 阅读 · 3 评论 -
MyCat - 使用篇(1)
数据库路由中间件MyCat - 使用篇(1)基本概念直接介绍概念太枯燥了,还是拿个和背景篇相似的例子介绍 业务场景:客户完成下单,快递员接受并更新运单状态,客户可以随时查看运单状态的任务。一票快递可能有多个子母件。同时,我们需要标记每个运单的状态,运单状态的解释和含义保存在运单状态字典表中。 因此,我们需要建立如下表: 我们现在按照业务将数据库垂直拆分成运单库(单表2000tps,6000原创 2016-02-22 21:09:00 · 30757 阅读 · 11 评论 -
MyCat - 使用篇(2)
数据库路由中间件MyCat - 使用篇(2)基本概念3. 分片3.1 分片节点(dataNode)表被水平切分后,每个分片表所在的数据库就是一个分片节点。一个分片节点对应一个数据库(mysql数据库)3.2 节点主机(dataHost)分片节点究竟被放在那个主机上。对应mysql里的mysql实例:一台主机可以部署多个mysql实例,一个mysql实例可以有多个数据库。为了规避单节点主机并发数限制,原创 2016-02-23 09:30:55 · 13090 阅读 · 10 评论 -
MyCat - 源代码篇(1)
数据库路由中间件MyCat - 源代码篇(1)进入了源代码篇,将按照框架->模块->细节的方式进行。模块的顺序按照从前端接收请求到后端发送给数据库,之后从数据库返回结果到前端的顺序进行。 MyCat整体框架图: 1. 整体通信与业务框架:前端与后端通信框架都为NIO/AIO,因为目前生产上用的linux发行版内核都没有真正实现网络上的AIO,如果应用用AIO的话可能比NIO还要慢一些,所以,我们原创 2016-02-17 14:00:01 · 17027 阅读 · 28 评论 -
MyCat - 使用篇(3)
数据库路由中间件MyCat - 使用篇(3)全局序列号数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯一性标识,这种保证全局性的数据唯一标识的机制就是全局序列号(sequence)。1. 本地文件方式classpath下有一个sequence_conf.properties文件:GLOBAL_SEQ.HISIDS=GLOBAL_SEQ.MINID=1原创 2016-02-23 10:08:29 · 71194 阅读 · 9 评论 -
MyCat - 使用篇(4)
数据库路由中间件MyCat - 使用篇(4)配置MyCat3. 配置conf/rule.xml1.4.1中的规则配置比较笨,1.5中优化了一些,将tableRule标签和function标签合并了,并且支持Velocity模板语言,更加灵活。这里先介绍1.4.1的:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mycat:rule SYSTEM "原创 2016-02-16 15:15:31 · 13877 阅读 · 2 评论 -
MyCat - 源代码篇(2)
数据库路由中间件MyCat - 源代码篇(2)2. 前端通信模块Created with Raphaël 2.1.0MySql连接建立以及认证过程clientclientMySqlMySql1.TCP连接请求2.接受TCP连接3.TCP连接建立4.握手包HandshakePacket5.认证包AuthPacket6.如果验证成功,则返回OkPacket7.默认会发送查询版本信息的包8.返回结果包2.原创 2016-02-17 17:51:44 · 12176 阅读 · 8 评论 -
MyCat - 源代码篇(3)
数据库路由中间件MyCat - 源代码篇(3)2. 前端连接建立与认证Created with Raphaël 2.1.0MySql连接建立以及认证过程clientclientMySqlMySql1.TCP连接请求2.接受TCP连接3.TCP连接建立4.握手包HandshakePacket5.认证包AuthPacket6.如果验证成功,则返回OkPacket7.默认会发送查询版本信息的包8.返回结果原创 2016-02-18 10:56:46 · 11678 阅读 · 2 评论 -
MyCat - 源代码篇(4)
数据库路由中间件MyCat - 源代码篇(4)2. 前端连接建立与认证Created with Raphaël 2.1.0MySql连接建立以及认证过程clientclientMySqlMySql1.TCP连接请求2.接受TCP连接3.TCP连接建立4.握手包HandshakePacket5.认证包AuthPacket6.如果验证成功,则返回OkPacket7.默认会发送查询版本信息的包8.返回结果原创 2016-02-20 10:33:37 · 6923 阅读 · 3 评论 -
MyCat - 使用篇(5)
数据库路由中间件MyCat - 使用篇(5)配置MyCat4. 配置schema.xmlschema.xml里面管理着MyCat的逻辑库、表,每张表使用的分片规则、分布在哪个DataNode以及DataSource上。 之前的例子: <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd">原创 2016-02-24 09:39:20 · 12400 阅读 · 6 评论 -
MyCat - 源代码篇(5)
数据库路由中间件MyCat - 源代码篇(5)3. 连接模块如之前所述,MyCat的连接分为前端和后端,下面是连接基本相关类图: 3.1 ClosableConnection:public interface ClosableConnection { String getCharset(); //关闭连接 void close(String reason); boo原创 2016-02-21 10:53:38 · 7578 阅读 · 5 评论 -
MyCat - 源代码篇(6)
MyCat - 源代码篇(6)3. 连接模块3.3 AbstractConnection:3.3.2 NIOHandlerNIOHandler实际上就是对于业务处理方法的封装,对于不同的连接有不同的处理方法,也就是不同的NIOHandlerpublic interface NIOHandler { void handle(byte[] data);}它的实现以及子类会在之后的对应的处理模块原创 2016-02-24 19:22:23 · 7423 阅读 · 3 评论 -
MyCat - 使用篇(6)
数据库路由中间件MyCat - 使用篇(5)配置MyCat-eye接下来在开始使用MyCat之前,我们先把监控平台部署好。下载MyCat-eye项目,mvn打包。之后得到类似于Mycat-web-1.0-SNAPSHOT-20160215151602-linux.tar.gz这个文件,部署到和zookeeper同一台服务器上。 如果要部署到其他机器,需要修改mycat-web\mycat-web\原创 2016-02-24 16:32:49 · 17667 阅读 · 16 评论 -
MyCat - 源代码篇(7)
数据库路由中间件MyCat - 源代码篇(7)3. 连接模块3.4 FrontendConnection前端连接 构造方法:public FrontendConnection(NetworkChannel channel) throws IOException { super(channel); InetSocketAddress localAddr = (Inet原创 2016-02-27 08:48:23 · 11735 阅读 · 3 评论 -
MyCat - 生产进阶篇(1)
数据库路由中间件MyCat - 生产进阶篇(1)首先,利用开源产品,我们的第一个首要目标是–稳定! 1. MyCat求稳首要原则:还是用之前的例子: 1.1 事务:首先,我们可以这么理解,MyCat只应该做两件事:请求转发与结果合并。源代码篇讲过MyCat的分布式事务的弱XA原理(其实根本不算是分布式事务),这是不可靠的,我们要想稳定的高可信的利用MyCat,就要避免一切分布式事务。 从现在开原创 2016-03-03 23:02:42 · 9781 阅读 · 3 评论 -
MyCat - 测试篇
数据库路由中间件MyCat - 测试篇测试背景为了检测MyCat性能表现以及架构扩展性,设计测试。首先需要编写压力测试代码,程序基于Jmeter,并且封装了JDBC,模拟涅槃项目实际应用的连接方式。测试程序生成基于当前系统时间的随机数,并且保证这个随机数一秒内重复概率为百万分之一。 程序请求必须保证每个分片的请求量是一样的,同时,必须保证这个请求是NIO方式发送的(BIO会导致在某个分片故障时,压原创 2016-03-06 15:16:16 · 11669 阅读 · 4 评论 -
MyCat - 源代码篇(8)
数据库路由中间件MyCat - 源代码篇(8)3. 连接模块3.5 后端连接对于后端连接,我们只关心MySQL的。 从后端连接工厂开始MySQLConnectionFactory.java: public MySQLConnection make(MySQLDataSource pool, ResponseHandler handler, String schema) t原创 2016-04-28 08:18:57 · 7473 阅读 · 0 评论 -
MyCat - 源代码篇(9)
数据库路由中间件MyCat - 源代码篇(9)3. 连接模块3.5 后端连接3.5.1 后端连接获取上一节我们讲了后端连接的基本建立和响应处理,那么这些后端连接是什么时候建立的呢? 首先,MyCat配置文件中,DataHost标签中有minIdle这个属性。代表在MyCat初始化时,会在这个DataHost上初始化维护多少个连接(这些连接可以理解为连接池)。每个前端Client连接会创建Sessi原创 2016-04-28 10:50:37 · 16621 阅读 · 19 评论 -
MyCat - 源代码篇(10)
数据库路由中间件MyCat - 源代码篇(10)Created with Raphaël 2.1.0MyCat接受客户端连接并为之建立唯一绑定的SessionMyCat接受客户端的请求,计算路由根据请求和路由创建合适的handler,这里为SingleNodeHandler从PhysicalDBNode中获取后端连接尝试获取连接,连接够用?将请求发送给对应连接,处理完之后归还连接尝试异步创建新的连接原创 2016-04-28 11:29:03 · 15450 阅读 · 0 评论 -
MyCat - 源代码篇(11)
数据库路由中间件MyCat - 源代码篇(11)4.配置模块每个MyCatServer初始化时,会初始化: MyCatServer.java:public static final String NAME = "MyCat";private static final long LOG_WATCH_DELAY = 60000L;private static final long TIME_UPD原创 2016-05-03 11:38:02 · 13752 阅读 · 2 评论 -
MyCat - 源代码篇(12)
数据库路由中间件MyCat - 源代码篇(12)4.配置模块4.2 schema.xml接上一篇,原创 2016-05-10 17:08:24 · 9054 阅读 · 2 评论 -
MyCat - 源代码篇(13)
数据库路由中间件MyCat - 源代码篇(13)5. 路由模块5.1 路由模块组成:路由模块,我们可以先把他当做个黑盒,看下输入和输出都是神马。 输入,很明显,就是个SQL语句,原生的,不加任何修饰的,纯洁的,从客户端发过来刚刚被解码的SQL语句。 输出呢?就是个优化,改写后的SQL语句,以及要发送到的后台分片。 这个RouteResultSet就是输出,长什么样子呢? 下图是主要涉及到原创 2016-05-20 09:42:59 · 10477 阅读 · 1 评论 -
MyCat - 源代码篇(14)
数据库路由中间件MyCat - 源代码篇(14)5. 路由模块真正取得RouteResultset的步骤:AbstractRouteStrategy的route方法: 对应源代码:public RouteResultset route(SystemConfig sysConfig, SchemaConfig schema, int sqlType, String origSQL,原创 2016-05-20 17:26:14 · 16249 阅读 · 23 评论 -
MyCat - 源代码篇(15)
数据库路由中间件MyCat - 源代码篇(15)5. 路由模块5.4 DDL语句路由可以分为两步,整体源代码:public static RouteResultset routeToDDLNode(RouteResultset rrs, int sqlType, String stmt,SchemaConfig schema) throws SQLSyntaxErrorException {原创 2016-05-23 20:20:52 · 9443 阅读 · 2 评论 -
MyCat - 源代码篇(16)
数据库路由中间件MyCat - 源代码篇(16)5. 路由模块5.5 AST语义解析路由DruidParser结构: 基本使用解析代码://sql是一组SQL语句MySqlStatementParser parser = new MySqlStatementParser(sql);//获取每个语句粗粒度的parse结果List<SQLStatement> statementList = pa原创 2016-05-25 11:31:59 · 9961 阅读 · 11 评论