一、MyCat总体架构介绍

1.源码下载及导入

导入Idea

2.总体架构

MyCat在逻辑上由几个模块组成: 通信协议、路由解析、结果集处理、数据库连接、监控等模块。如图所示:

通信协议模块: 通信协议模块承担底层的收发数据、线程回调处理工作, MyCat通信协议默认采用Reactor模式,在协议层采用MySQL协议;

路由解析模块: 负责对传入的SQL语句进行语法解析, 解析语句的条件、类型、关键字等,并进行优化;

SQL执行模块: 负责从连接池中获取连接, 再根据路由解析的结果, 把SQL语句分发到相应的节点执行;

数据库连接模块: 负责创建、管理、维护后端的连接池。为减少每次建立数据库连接的开销,数据库使用连接池机制对连接声明周期进行管理;

结果集处理模块: 负责对跨分片的查询结果进行汇聚、排序、截取等;

监控管理模块: 负责MyCat的连接、内存等资源进行监控和管理。监控主要通过管理指令及监控服务展现一些监控数据; 管理则主要通过轮询事件来检测和释放不适用的资源;

3.总体执行流程

二、MyCat网络I/O架构及实现

1.BIO、NIO与AIO

BIO

BIO(同步阻塞I/O) 通常由一个单独的Acceptor线程负责监听客户端的连接, 接收到客户端的连接请求后, 会为每个客户端创建一个新的线程进行处理, 处理完成之后, 再给客户端返回结果, 销毁线程 。

每个客户端请求接入时, 都需要开启一个线程进行处理, 一个线程只能处理一个客户端连接。 当客户端变多时,会创建大量的处理线程, 每个线程都需要分配栈空间和CPU, 并且频繁的线程上下文切换也会造成性能的浪费。所以该模式, 无法满足高性能、高并发接入的需求。

NIO

NIO(同步非阻塞I/O)基于Reactor模式作为底层通信模型,Reactor模式可以将事件驱动的应用进行事件分派, 将客户端发送过来的服务请求分派给合适的处理类(handler)。当Socket有流可读或可写入Socket时, 操作系统会通知相应的应用程序进行处理, 应用程序再将流读取到缓冲区或写入操作系统。 这时已经不是一个连接对应一个处理线程了, 而是一个有效的请求对应一个线程, 当没有数据时, 就没有工作线程来处理。

NIO 的最大优点体现在线程轮询访问Selector, 当read或write到达时则处理, 未到达时则继续轮询。

AIO

AIO,全程 Asynchronous IO(异步非阻塞的IO), 是一种非阻塞异步的通信模式。在NIO的基础上引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。AIO中客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

AIO与NIO的主要区别在于回调与轮询, 客户端不需要关注服务处理事件是否完成, 也不需要轮询,只需要关注自己的回调函数。

2.通信架构

在MyCat中实现了NIO与AIO两种I/O模式, 可以通过配置文件server.xml进行指定 :

1

usingAIO为1代表使用AIO模型 , 为0表示使用NIO模型;

MyCat的AIO架构

MyCatStartUp是整个MyCat服务启动的入口;

在获取到MyCat的home目录后, 把主要的任务交给MyCatServer , 并调用其startup方法;

初始化系统配置, 获取配置文件中的 usingAIO的配置 , 如果配置为1, 说明使用AIO模型 , 进入到AIO的分支, 并创建两个连接, 一个是管理后台连接(9066), 一个server的连接(8066);

进入AIO分支 , 主要有AIOAcceptor接收客户端请求, 绑定端口, 创建服务端的异步Socket;在accept方法中完成两件事: ①. FrontedConnection的创建, 这是前段连接的关键; ②.register注册事件, MySQL协议握手包就在此时发送;

MyCat的NIO架构

如果设置的usingAIO为0 ,那么将走NIOAcceptor通道 , 流程如下:

如果走NIO分支 , 将首先创建NIOAcceptor对象, 并调用其start方法;

NIOAcceptor 负责处理Accept事件, 服务端接收客户端的连接事件, 就是MyCat作为服务端去处理前端业务程序发过来的连接请求, 建立链接后, 调用NIOAcceptor的NIOReactor.postRegister方法进行注册(并没有注解注册, 而是放入缓冲队列, 避免加锁的竞争)。

NIOAcceptor的accept方法 :

NIOReactor的postRegister方法:

三、Mycat实现MySQL协议

1.MySQL协议简介

A.概述

MySQL协议处于应用层之下、TCP/IP之上, 在MySQL客户端和服务端之间使用。包含了链接器、MySQL代理、主从复制服务器之间通信,并支持SSL加密、传输数据的压缩、连接和身份验证及数据交互等。其中,握手认证阶段和命令执行阶段是MySQL协议中的两个重要阶段。

B.握手认证阶段

握手认证阶段是客户端连接服务器的必经之路, 客户端与服务端完成TCP的三次握手以后, 服务端会向客户端发送一个初始化握手包, 握手包中包含了协议版本、MySQLServer版本、线程ID、服务器的权能标识和字符集等信息。

客户端在接收到服务端的初始化握手包之后, 会发送身份验证包给服务端(AuthPacket), 该包中包含用户名、密码等信息。

服务端接收到客户端的登录验证包之后,需要进行逻辑校验,校验该登录信息是否正确。如果信息都符合,则返回一个OKPacket,表示登录成功,否则返回ERR_Packet,表示拒绝。

Wireshark抓包如下:

报文分析如下:

初始化握手包

通过抓包工具Wireshark抓取到的握手包信息如下, 握手包格式:

说明:

Packet Length : 包的长度;

Packet Number : 包的序号;

Server Greeting : 消息体, 包含了协议版本、MySQLServer版本、线程ID和字符集等信息。

登录认证包

客户端在接收到服务端发来的初始握手包之后, 向服务端发出认证请求, 该请求包含以下信息(由Wireshark抓获) :

OK包或ERROR包

服务端接收到客户端的登录认证包之后,如果通过认证,则返回一个OKPacket,如果未通过认证,则返回一个ERROR包。

OK报文如下:

ERROR报文如下 :

C.命令执行阶段

在握手认证阶段通过并完成以后, 客户端可以向服务端发送各种命令来请求数据, 此阶段的流程是:命令请求->返回结果集。

Wireshark 捕获的数据包如下:

命令包

结果集包

2.MySQL协议在MyCat中实现

A.握手认证实现

在MyCat中同时实现了NIO和AIO, 通过配置可以选择NIO和AIO。MyCat Server在启动阶段已经选择好采用NIO还是AIO,因此建立I/O通道后,MyCat服务端一直等待客户端端的连接,当有连接到来的时候,MyCat首先发送握手包。

握手包源码实现

MyCat中的源码中io.mycat.net.FrontendConnection类的实现如下:

握手包信息组装完毕后, 通过FrontedConnection写回客户端。

认证包源码实现

客户端接收到握手包后, 紧接着向服务端发起一个认证包, MyCat封装为类 AuthPacket:

客户端发送的认证包转由 FrontendAuthenticator 的Handler来处理, 主要操作就是拆包, 检查用户名、密码合法性, 检查连接数是够超出限制。源码实现如下:

认证失败, 调用failure方法, 认证成功调用success方法。

failure方法源码:

success方法源码:

B.命令执行实现

命令执行阶段就是SQL命令和SQL语句执行阶段, 在该阶段MyCat主要需要做的事情, 就是对客户端发来的数据包进行拆包, 并判断命令的类型, 并解析SQL语句, 执行响应的SQL语句, 最后把执行结果封装在结果集包中, 返回给客户端。

从客户端发来的命令交给 FrontendCommandHandler 中的handle方法处理:

处理具体的请求, 返回客户端结果集数据包:

mysql免费框架_瞧一瞧~看一看~MyCat架构剖析免费不要钱!(上)相关推荐

  1. 瞧一瞧~看一看~MyCat架构剖析免费不要钱!(下)

    一.MyCat线程架构与实现 1.MyCat线程池实现 在MyCat中大量用到了线程池, 通过线程池来避免频繁的创建和销毁线程而造成的系统性能的浪费.在MyCat中使用的线程池是JDK中提供的线程池 ...

  2. net core mysql开源框架_.NetCore开源集成框架

    (感兴趣的Fork给个小星星吧~) AspNetCoreScaffolding 本框架在.netCore和.netStandard的基础上,集成了多种中间件 .NetCore集成框架,即开即用 如果对 ...

  3. kafka mysql秒杀框架_一次模拟简单秒杀场景的实践 Docker Node.js Kafka Redis MySQL...

    秒杀活动可以说在互联网上随处可见,从12306抢票,到聚划算抢购,我们生活的方方面面都可以看到秒杀的身影.秒杀的架构设计也是对于一个架构师架构设计能力的一次考验.本文的目的并不在于提供一个可以直接落地 ...

  4. mysql后台框架_后端服务开发 - 认识后端框架

    后端的基本概念 在软件架构和程序设计领域,前端是软件系统中直接和用户交互的部分,而后端控制着软件的输出. 前端控制ajax等技术向后端进行网络请求:后端收到请求后对数据库进行操作,返回给前端JSON数 ...

  5. c# mysql ef框架_首页 C# EF6数据库第一-EF试图创建我的数据...

    好吧,我有一点背景如何到达这里.我正在重建一个旧的MVC3网站.我最近有一个Database First MVC5 EF6项目,该项目具有要使用的UI包.我复制了现有项目并撕下了几乎所有内容(所有项目 ...

  6. mysql无偿献血_献血的好处1、无偿献血者可以享受免费用血的待遇,献血者本人自...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 献血的好处 1.无偿献血者可以享受免费用血的待遇,献血者本人自献血之日起五年之内免费享受五倍无偿献血量的医疗用血,五年之后免费享受与无偿献血量等量的医疗用 ...

  7. mysql 分库 框架_数据库水平分库框架设计

    1水平分库 最近在做一个IM系统,之前的旧系统没有考虑到用户量会增长得这么庞大,导致现在数据库性能瓶颈非常严重,迫切需要分库,用于减少每个库的用户数量,进而分摊负载,最终达到数据库横向扩展的目的. 数 ...

  8. java mysql orm框架_主流 Java ORM 框架有哪些?

    主流 Java ORM 框架有哪些? ORM 是 Object Relational Mapping 的缩写,译为 "对象关系映射" 框架. 所谓的 ORM 框架就是一种为了解决面 ...

  9. 支付宝mysql集群_支付宝支撑2135亿成交额的数据库架构原理

    OceanBase的SQL优化器和分布式并行执行 摘要:本文主要介绍蚂蚁金服自主研发的通用关系型数据库OceanBase,OceanBase采用了分布式架构,其通过技术创新在普通PC服务器集群上实现了 ...

最新文章

  1. 麦肯锡问题与解决方法技巧
  2. ASP.NET froms 身份验证之Roles
  3. Java字符串格式化
  4. android 分段显示百分比,按百分比设置排名-Android DisplayMetrics
  5. 基于simulink的SVC与SVG的性能比较
  6. ExtJS 中自定义类
  7. Java两则故障分析和常见连接超时时间
  8. bzoj 3157 bzoj 3516 国王奇遇记 —— 推式子
  9. jdk8 接口默认方法_JDK 8中方便的新地图默认方法
  10. shell安装mysql5.7_一键部署----shell脚本安装MySQL5.7
  11. 放射性渐变色html,html5 canvas绘制放射性渐变色效果
  12. 与40mhz信道不兼容设置_为什么面包板不适合高频电路
  13. 硬件——nrf51822第二篇,如何设置keil用来下载程序
  14. JDK安装环境变量配置以及java命令可用但javac命令不可用解决方案
  15. C# Json转对象(object)
  16. SSH 只能用于远程 Linux 主机?那说明你见识太小了!
  17. 高等数学---向量解析几何
  18. 吃握手包的电子宠物 - Pwnagotchi开箱教程
  19. python安装第三方库超时
  20. 显卡的游戏性能看什么参数

热门文章

  1. Matlab心得及学习方法(不断更新)
  2. mencoder视频旋转
  3. C#实现Web应用程序定时启动任务
  4. linux中文乱码怎么办
  5. 目录服务技术介绍——ADSI(三)
  6. android 内部存储 清空,Android清空应用内部文件缓存
  7. plantuml样式_PlantUML 简明教程
  8. java开发checklist,Java API设计CheckList
  9. python tab键自动补全_Python Tab自动补全
  10. 2021全国大学生智能汽车竞赛中小学组国赛获奖名单