MyCat - 架构剖析 - MyCat 连接池架构实现 | 学习笔记

简介: 快速学习 MyCat - 架构剖析 - MyCat 连接池架构实现

开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(三):MyCat - 架构剖析 - MyCat 连接池架构实现】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/757/detail/13299


MyCat - 架构剖析 - MyCat 连接池架构实现

内容介绍:

一、连接池创建

二、连接池分配

三、架构

 

一、连接池创建

连接池是 my cat 的后端连接池,即 my cat 后端与各个数据库节点之间的连接架

MyCat 会根据 dataHost 当中所配置的参数来创建一个连接池,比如代码:

image.png

//" maxCon="1000"  minCon="10" 这些是创建连接池的参数,minCo 指的就是 connection ,最小连接是10,最大连接是1000。dbType="mysql" dbDriver="native" 决定创建一个什么样的连接池。minCon 根据 schema.xml 文件的配置取得最小的连接数 minCon , 并初始化 mincon 个连接。

在初始化连接时 还需要判定用户选择的是 JDBC 还是原生的 MySQL 协议 以便于创建对应的连接。

 

二、连接池分配

连接池分配指的是分配连接,即从连接池队列中取出一个连接,在取出一个连接时, Mycat 需要根据负载均衡( balance 属性)的类型选择不同的数据源因为连接和数据源绑在一起,所以需要知道 Mycat  读写的是那些数据源,才能分配响应的连接。

因为在 dataHost 中有代码:

<writeHosthost="hostMl" url="192.168.192.157:3306"user="root"password="itcast">

<readhost host="hostS1" url="192.168.192.158:3306" user="root" password="itcast" /></writehost>

如果配置了读写分离,就需要根据balance来决定当前到底要使用哪一个。

 

三、架构

image.png

MyCatserver 这个就是慢方法当中调用了一个 Startup(),然后就调用了一个 MyCatserver 中的一个 Startup(),在 physicalDBPool 进行初始化一些连接池的相关信息。也可以通过根据跟踪源码按下面这个图的流程简单跟踪一下。

在 MycatStartup 当中调用了 MycatStartup sever 的 startup 方法。

Init datahost 就是在初始化的 dataHost 的部分。

在初始化dataHost的时候,获取到getDataHosts,组装了一个Map<string,PhysicalDBPool >dataHosts=config.getDataHosts(); 接下来要初始化 Physica1DBPoo1,调用 init 的方法。接下来点击 init ,代码:

If(!checkIndex(index)) {

Index=0;

}

//进行相应操作

If(initSource(j,writeSources[j]) ) {

//这个代码当中调用了一个方法:init方法,initSource 就是初始化,点击 initSource ,找到代码如下:

Int initSize=ds.getConfig().getMinCon();

//其中 MinCon 获取到的就是参数 minCon="10"

下面的代码:

CopyonWriteArrayList<BackendConnection>list=newCopyOnWriteArrayList<~>();

GetConnectionHandlergetConHandler= new GetConnectionHandler(list, initsize);

// long start =System.currentTimeMillis ();

// long timeout = start + 5000 * 1000L;

//这一部分代码就是创建连接池的过程

代码:ds.getConnection

//调用了 ds,ds 指的就是 physicalDatasource ,获取连接

点击 getConnectio ,在 getConnectio 当中代码:

//当前最大连接

LongactiveCons=increamentCount.longValue()+totalConnectionCount; if (activecons <size){// 下一个连接大于最大连接数

//在这里进行一个判定,如果下一个连接小于最大连接数,就会创建一个新的连接。

点击 createNewConnection,应用了一个线程池,

代码:

MycatServer.getInstance().getBusinessExecutor()

//通过这个线程池执行了一个任务:创建线程的任务。Mycat 中的线程池在此的作用就是后端用原生协议连接数据。

这个线程池执行的任务:调用 creatNewConnection 这个方法,这是一个抽象方法,作用就是创建新连接。点击时限位的时候,有三个时限:

JDBCDatasource,MYSQLDatasource,PostgreSQLDatasource, 用哪个时限取决于 dbDriver="native" ,如果选择的是 native ,那么选择的就是 MYSQLDatasource 。如果此处配置的是 JDBC ,说明要使用 JDBCDatasource 连接后端数据库。

点击 MYSQLDatasource ,此处调用了 factory.make ,作用是执行创建连接的过程。

make方法最终返回了 MYSQLConnection ,这就是创建了后端连接。

接下来应用了一个代码:

MysQLConnection c = new MySQLConnection(channel, pool.isReadNode ());

紧接着设置了一系列的参数,然后进行了一个if条件判断,主要是判断当前的 io 模型是 aio 还是 nio ,

代码如下:

If (channel instanceof AsynchronousSocketChannel){

((AsynchronousSocketChannel) channel).connect (

new InetSocketAddress (dsc.getIp(), dsc.getPort()), c,

(CompletionHandler) MycatServer.getInstance()

.getConnector());

//如果 channel 是一个 aio ,则创建的是一个 aio

}else {

((NIOConnector) MycatServergetInstance().getConnector())

.postConnect(c);

//如果不是 aio ,则是 nio ,创建一个 nio 。

最终将 MySQLConnection 返回,通过这个 MySQLConnection 连接后端的 MYSQL Database 。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
12月前
|
自然语言处理 JavaScript Java
《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》学习笔记——HarmonyOS架构介绍
HarmonyOS采用分层架构设计,从下至上分为内核层、系统服务层、框架层和应用层。内核层支持多内核设计与硬件驱动;系统服务层提供核心能力和服务;框架层支持多语言开发;应用层包括系统及第三方应用,支持跨设备调度,确保一致的用户体验。
1081 81
|
9月前
|
人工智能 前端开发 Java
DDD四层架构和MVC三层架构的个人理解和学习笔记
领域驱动设计(DDD)是一种以业务为核心的设计方法,与传统MVC架构不同,DDD将业务逻辑拆分为应用层和领域层,更关注业务领域而非数据库设计。其四层架构包括:Interface(接口层)、Application(应用层)、Domain(领域层)和Infrastructure(基础层)。各层职责分明,避免跨层调用,确保业务逻辑清晰。代码实现中,通过DTO、Entity、DO等对象的转换,结合ProtoBuf协议,完成请求与响应的处理流程。为提高复用性,实际项目中可增加Common层存放公共依赖。DDD强调从业务出发设计软件,适应复杂业务场景,是微服务架构的重要设计思想。
|
SpringCloudAlibaba Java 网络架构
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
1255 0
|
架构师 网络协议 算法
Android高级架构师整理面试经历发现?(大厂面经+学习笔记(1)
Android高级架构师整理面试经历发现?(大厂面经+学习笔记(1)
|
SpringCloudAlibaba 负载均衡 Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(目录大纲)
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(目录大纲)
693 1
|
SpringCloudAlibaba Java 测试技术
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(六)Hystrix(豪猪哥)的使用
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(六)Hystrix(豪猪哥)的使用
361 1
|
Java Nacos Sentinel
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
2441 0
|
消息中间件 SpringCloudAlibaba Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
1668 0
|
SpringCloudAlibaba 负载均衡 Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(五)OpenFeign的使用
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(五)OpenFeign的使用
450 0
|
负载均衡 算法 Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(四)Ribbon的使用
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(四)Ribbon的使用
435 0