mycat架构剖析

举报
别团等shy哥发育 发表于 2023/02/04 11:33:02 2023/02/04
【摘要】 @toc 1.1 MyCat总体架构介绍 1.1.1 源码下载及导入导入Idea 1.1.2 总体架构  MyCat在逻辑上由几个模块组成: 通信协议、路由解析、结果集处理、数据库连接、监控等模块。如图所示:1). 通信协议模块: 通信协议模块承担底层的收发数据、线程回调处理工作, MyCat通信协议默认采用Reactor模式,在协议层采用MySQL协议;2). 路由解析模块: 负责对传入的...

@toc

1.1 MyCat总体架构介绍

1.1.1 源码下载及导入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LeWRPEpt-1634539223001)(assets/image-20200202220149279.png)]
导入Idea
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qvFhvSGf-1634539223005)(assets/image-20200202220220682.png)]

1.1.2 总体架构

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fEvsjK0z-1634539223007)(assets/image-20200107230122662.png)]

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

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

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

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

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

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

1.1.3 总体执行流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xLpI6Iwt-1634539223010)(assets/image-20200107233001248.png)]

1.2 MyCat网络I/O架构及实现

1.2.1 BIO、NIO与AIO

1). BIO

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

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

2). NIO

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

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

3). AIO

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

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

1.2.2 通信架构

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

<property name="usingAIO">1</property>

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

MyCat的AIO架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wBDUXLL2-1634539223014)(assets/image-20200108103954458.png)]

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

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0e7BGowd-1634539223016)(assets/image-20200108111012502.png)]

MyCat的NIO架构

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bhTFQNUx-1634539223017)(assets/image-20200108111153230.png)]

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

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

NIOAcceptor的accept方法 :

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CsMQxFSZ-1634539223019)(assets/image-20200108112521438.png)]

NIOReactor的postRegister方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aA4aZLQl-1634539223020)(assets/image-20200108112959564.png)]

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。