一、MyCat线程架构与实现

1.MyCat线程池实现

在MyCat中大量用到了线程池, 通过线程池来避免频繁的创建和销毁线程而造成的系统性能的浪费。在MyCat中使用的线程池是JDK中提供的线程池 ThreadPoolExecutor 的子类 NameableExecutor , 构造方法如下:

父类构造为:

构造参数含义:

corePoolSize : 核心池大小

maximumPoolSize : 最大线程数

keepAliveTime: 线程没有任务执行时, 最多能够存活多久

timeUnit: 时间单位

workQueue: 阻塞任务队列

threadFactory: 线程工厂, 用来创建线程

2.MyCat线程架构


在MyCat中主要有两大线程池: timerExecutorbusinessExecutor

  1. timerExecutor 线程池主要完成系统时间定时更新、处理器定时检查、数据节点定时连接空闲超时检查、数据节点定时心跳检测等任务。
  2. businessExecutor是MyCat最重要的线程资源池, 该资源池的线程使用的范围非常广, 涵盖以下方面:

A.后端用原生协议连接数据

B.JDBC执行SQL语句

C.SQL拦截

D.数据合并服务

E.批量SQL作业

F.查询结果的异步分发

G.基于guava实现异步回调


参考资料:《开源数据库中间件MyCat实战笔记》
快速入手通道:发送简信“MyCat资料”免费获取

二、MyCat内存管理及缓存框架与实现

这里所提到的内存管理指的是MyCat缓冲区管理, 众所周知设置缓冲区的唯一目的是提高系统的性能,缓冲区通常是部分常用的数据存放在缓冲池中以便系统直接访问, 避免使用磁盘IO访问磁盘数据, 从而提高性能。

1.内存管理

A.缓冲池组成

缓冲池的最小单位为chunk, 默认的chunk大小为4096字 (DEFAULT_BUFFER_CHUNK_SIZE),BufferPool的总大小为4096 x processors x 1000(其中processors为处理器数量)。对I/O进程而言, 他们共享一个缓冲池。缓冲池有两种类型: 本地缓存线程(以$_开头的线程)缓冲区和其他缓冲区, 分配buffer时, 优先获取ThreadLocalPool中的buffer, 没有命中时会获取BufferPool中的buffer

B.分配MyCat缓冲池

分配缓冲池时, 可以指定大小, 也可以用默认值。

A.allocate(): 先检测是否为本地线程, 当执行线程为本地缓存线程时, localBufferPool 取出一个可用的buffer。如果不是, 则从ConcurrentLinkedQueue队列中取出一个buffer进行分配, 如果队列没有可用的buffer, 则创建一个直接缓冲区。

B.allocate(size): 如果用户指定的size不大于chunkSize, 则调用allocate()进行分配;反之则调用createTempBuffer(size)创建临时非直接缓冲区。

C.MyCat缓冲池的回收

回收时先判断buffer是否有效, 有如下情况时缓冲池不回收。

A.不是直接缓冲区

B.buffer是空的

C.buffer的容量大于chunkSize

2.MyCat缓存架构

A.缓存框架选择

MyCat支持ehcache、mapdb、leveldb缓存, 可通过配置文件cacheserver.properties来进行配置;

B.缓存内容

MyCat有路由缓存表主键到datanode缓存ER关系缓存

A.路由缓存: 即SQLRouteCache, 根据SQL语句查找路由信息的缓存, 该缓存只是针对select语句, 如果执行了之前已经执行过的某个SQL语句(缓存命中), 那么路由信息就不需要重复计算了, 直接从缓存中获取。

B.表主键到datanode缓存: 当分片字段与主键字段不一致时, 直接通过主键值查询时无法定位具体分片的(只能全分片下发), 所以设置该缓存之后, 就可以利用主键值查找到分片名, 缓存的key是ID值, value是节点名。

C.ER关系缓存: 在ER分片时使用, 而且在insert查询中才会使用缓存, 当字表插入数据时, 根据父子关联字段确定子表分片, 下次可以直接从缓存中获取所在的分片。

查看缓存指令: show @@cache;

三、MyCat连接池架构与实现

这里我们所讨论的连接池是MyCat的后端连接池, 也就是MyCat后端与各个数据库节点之间的连接架构。

A.连接池创建

MyCat按照每个dataHost创建一个连接池, 根据schema.xml文件的配置取得最小的连接数minCon,并初始化minCon个连接。在初始化连接时, 还需要判定用户选择的是JDBC还是原生的MySQL协议,以便于创建对应的连接。

B.连接池分配

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

C.架构

四、MyCat主从切换架构与实现

1.MyCat主从切换概述

MyCat实现MySQL读写分离的目的在于降低单节点数据库的访问压力, 原理就是让主数据库执行增删改操作, 从数据库执行查询操作, 利用MySQL数据库的复制机制将Master的数据同步到slave上。

master宕机后,slave承载的业务如何切换到master继续提供服务,以及slave宕机后如何将master切换到slave上。手动切换数据源很简单, 但不是运维工作的首选,本文重点就是讲解如何实现自动切换。

MyCat的读写分离依赖于MySQL的主从同步, 也就是说MyCat没有实现数据的主从同步功能, 但是实现了自动切换功能。

A.自动切换

自动切换是MyCat主从复制的默认配置 , 当主机或从机宕机后, MyCat自动切换到可用的服务器上。假设写服务器为M, 读服务器为S, 则:

正常时, 写M读S;

当M宕机后, 读写S ; 恢复M后, 写S, 读M ;

当S宕机后, 读写M ; 恢复S后, 写M, 读S ;

B.基于MySQL主从同步状态的切换

这种切换方式与自动切换不同, MyCat检测到主从数据同步延迟时, 会自动切换到拥有最新数据的MySQL服务器上, 防止读到很久以前的数据。

原理就是通过检查MySQL的 主从同步状态(show slave status) 中的Seconds_Behind_MasterSlave_IO_RunningSlave_SQL_Running三个字段,来确定当前主从同步的状态以及主从之间的数据延迟。 Seconds_Behind_Master为0表示没有延迟,数值越大,则说明延迟越高。

2.MyCat主从切换实现

基于延迟的切换, 则判断结果集中的Slave_IO_RunningSlave_SQL_Running两个个字段是否都为yes,以及Seconds_Behind_Master 是否小于配置文件中配置的 slaveThreshold的值,如果有其中任何一个条件不满足, 则切换。

主要流程如下:

五、MyCat核心技术

1.MyCat分布式事务实现

MyCat在1.6版本以后已经支持XA分布式事务类型了。具体的使用流程如下:

  1. 在应用层需要设置事务不能自动提交
set autocommit=0;
  1. 在SQL中设置XA为开启状态
set xa = on;
  1. 执行SQL
insert into user(id,name,sex) values(1,'Tom','1'),(2,'Rose','2'),(3,'Leo','1'),(4,'Lee','1');
  1. 对事务进行提交或回滚
commit/rollback

完整流程如下:

2.MyCat SQL路由实现

MyCat的路由是和SQL解析组件息息相关的, SQL路由模块是MyCat数据库中间件最重要的模块之一,使用MyCat主要是为了分库分表, 而分库分表的核心就是路由。

A.路由的作用


如图所示, MyCat接收到应用系统发来的查询语句, 要将其发送到后端连接的MySQL数据库去执行,但是后端有三个数据库服务器,具体要查询那一台数据库服务器呢, 这就是路由需要实现的功能。

SQL的路由既要保证数据的完整 , 也不能造成资源的浪费, 还要保证路由的效率。

B.SQL解析器

Mycat1.3版本之前模式使用的是Fdbparserfoundationdb的开源SQL解析器,在2015年被apple收购后,从开源变为闭源了。

目前版本的MyCat采用的是Druid的SQL解析器, 性能比采用Fdbparser整体性能提高20%以上。

3.MyCat跨库Join

A.全局表

每个企业级的系统中, 都会存在一些系统的基础信息表, 类似于字典表、省份、城市、区域、语言表等, 这些表与业务表之间存在关系, 但不是业务主从关系,而是一种属性关系。

当我们对业务表进行分片处理时, 可以将这些基础信息表设置为全局表, 也就是在每个节点中都存在该表。

全局表的特性如下:

A.全局表的insertupdatedelete操作会实时地在所有节点同步执行, 保持各个节点数据的一致性

B.全局表的查询操作会从任意节点执行,因为所有节点的数据都一致

C.全局表可以和任意表进行join操作

B.ER表

关系型数据库是基于 实体关系模型(Entity Relationship Model) 的, MyCat中的ER表便来源于此。 MyCat提出了基于ER关系的数据分片策略 , 子表的记录与其所关联的父表的记录存放在同一个数据分片中, 通过 表分组(Table Group) 保证数据关联查询不会跨库操作。

C.catlet

catlet是MyCat为了解决跨分片Join提出的一种创新思路, 也叫做 人工智能(HBT) 。MyCat参考了数据库中存储过程的实现方式,提出类似的跨库解决方案,用户可以根据系统提供的API接口实现跨分片Join。

采用这种方案开发时,必须要实现Catlet接口的两个方法 :

route 方法: 路由的方法, 传递系统配置和schema配置等 ;

processSQL方法: EngineCtx执行SQL并给客户端返回结果集 ;

当我们自定义Catlet完成之后, 需要将Catlet的实现类进行编译,并将其字节码文件XXXCatlet.class存放在mycat_home/catlet目录下, 系统会加载相关Class, 而且每隔1分钟扫描一次文件是否更新, 若更新则自动重新加载,因此无需重启服务。

ShareJoin

ShareJoinCatlet的实现, 是一个简单的跨分片Join, 目前支持两个表的Join,原理就是解析SQL语句, 拆分成单表的语句执行, 单后把各个节点的数据进行汇集。

要想使用Catlet完成join, 还需要借助于MyCat中的注解, 在执行SQL语句时,使用catlet注解:

/*!mycat:catlet=demo.catlets.ShareJoin */ select a.id as aid , a.id , b.id as bid , b.name as name from customer a,
company b where a.company_id=b.id and a.id = 1;

4.MyCat数据汇聚与排序

通过MyCat实现数据汇聚和排序,不仅可以减少各分片与客户端之间的数据传输IO, 也可以帮助开发者总复杂的数据处理中解放出来,从而专注于开发业务代码。

在MySQL中存在两种排序方式: 一种利用有序索引获取有序数据, 另一种通过相应的排序算法将获取到的数据在内存中进行排序。 而MyCat中数据排序采用堆排序法对多个分片返回有序数据,并在合并、排序后再返回给客户端。


参考资料:《开源数据库中间件MyCat实战笔记》
最后,附一张自己面试前准备的脑图:

面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典

  • Java核心知识整理

  • Spring全家桶(实战系列)

Step3:刷题

既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

以下是我私藏的面试题库:

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

资料领取方式:Java全套学习手册

一点。

以下是我私藏的面试题库:

[外链图片转存中…(img-htPVksxL-1623623600629)]

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

资料领取方式:Java全套学习手册

以上学习资料均免费分享,最后祝愿各位身体健康,顺利拿到心仪的offer!

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

  1. mysql免费框架_瞧一瞧~看一看~MyCat架构剖析免费不要钱!(上)

    一.MyCat总体架构介绍 1.源码下载及导入 导入Idea 2.总体架构 MyCat在逻辑上由几个模块组成: 通信协议.路由解析.结果集处理.数据库连接.监控等模块.如图所示: 通信协议模块: 通信 ...

  2. 有这么一套,阿里架构师熬夜一周整理的java进阶路线,你看不看?

    前言 最近老是有粉丝私信我说感觉自己学java越来越难了,这其中有刚毕业的应届生说自己的技术找不到满意的工作,也有在学校的大学习说找不到学习方式,更多的是正在工作的java开发人员说是现在的技术更新太 ...

  3. 进阶Java架构师必看书:大型架构+框架+性能优化+中间件+分布式

    进阶Java架构师必看书:大型架构+框架+性能优化+中间件+分布式 优知学院 2018-09-05 07:21:00 1.大型网站技术架构:核心原理与案例分析 本书通过梳理大型网站技术发展历程,剖析大 ...

  4. 从Watson看AI平台的架构设计

    本文转自:https://blog.csdn.net/dev_csdn/article/details/78426133 摘要:本文分析IBM Watson在技术架构上所面临的问题及解决办法,总结了人 ...

  5. android 第三方社区,从友盟微社区看Android第三方SDK架构实践

    原标题:从友盟微社区看Android第三方SDK架构实践 开发Android第三方SDK说难不难,但说简单也不简单,要开发一个给很多人使用的第三方SDK,如何在保证稳定性的同时,增强SDK的灵活性,让 ...

  6. 从12306看海量并发网站架构

    TUP第19期综述:从12306看海量并发网站架构(含PPT下载) 发表于2012-02-20 20:27| 19643次阅读| 来源CSDN专稿| 28 条评论| 作者付江 高并发产品设计新浪微博t ...

  7. 从 VSCode 看大型 IDE 技术架构

    关注 逆锋起笔 学习 资源.工具不用愁 ☞ 程序员进阶必备资源免费送「各种技术!」 ☜ 零.前言 为什么要去看 VSCode?因为我们团队在做的中后台快速研发平台云凤蝶也是一款类似 Web IDE 形 ...

  8. 一张图看懂微服务架构路线

    目录 一张图看懂微服务架构路线 我为什么选择微服务架构? 微服务架构路线 基本思路 Docker 容器编排 Docker 容器管理 API网关 负载均衡 服务发现 事件总线 日志记录 监控和警报 分布 ...

  9. 一分钟看懂数据湖架构

    一分钟看懂数据湖架构 数据湖和数据仓库两者都广泛应用于大数据存储,但两者之间概念不可互换.数据湖是存储原始数据的池,目的仍没有明确.数据仓库存储结构化的.已过滤.处理的数据,用于特定分析目的. 两种数 ...

最新文章

  1. php遍历文件夹下文件内容_PHP遍历某文件夹下的文件与文件夹名
  2. java 计划日视图,GitHub - sddysz/calendarSchedule: 日程表,仿滴答清单,包含日视图、三日视图、周视图、月视图、列表视图、同步手机系统日程、添加日程...
  3. python 删除n天前文件_Linux 按时间批量删除文件命令(删除N天前文件)
  4. C#输入姓名或者拼音码(姓名的首字母,大小写均可)进行快速模糊查找
  5. Python稳基修炼之计算机等级考试易错概念题3(含答案与解析)
  6. Python标准库shutil中rmtree()使用回调函数
  7. 热电偶校验仪_热电偶校验方法_南昌手持热工校验仪,杭州全功能热工过程校验仪厂家...
  8. NAT-PT (Network Address Translation-Protocol)网络地址转换协议转换
  9. 简单好用一键恢复丢失办公文档
  10. BT601和BT709到底什么关系
  11. fot mac matlab_Matlab for Mac
  12. Web 3D 的初临
  13. vba批量合并指定的sheet_用VBA实现把多个Excel文件合并到一个Excel文件的多个工作表(Sheet)里...
  14. dh参数逆运动学_UR机械臂运动学正逆解方法
  15. IDEA报错:Lombok Requires Annotation Processing, Annotation processing seems to be disabled
  16. Invalid Host/Origin header vue项目
  17. 鸿蒙招聘店铺主是真的吗,为什么很多店铺门口贴着招聘,然而进去问都说招满了,但是招聘的内容还是放在那不收走?...
  18. YDOOK: Sanic: Python request post请求 上传照片或文件 详细具体步骤 亲测可用!
  19. python中的位运算符
  20. html guids标签,Windows下编译kaldi--kaldi(二)

热门文章

  1. 用C语言求平均数的四种方法
  2. 校园无线网登陆成功,但打开浏览器不能上网怎么办?标签上显示注销页怎么办?
  3. Centos重装ssh服务
  4. JS中将中文数字转化为阿拉伯数字
  5. SM2263XT贴四片PF29F01T2ANCTH2,SM2263XT量产工具成功开卡
  6. SEVERE: Error configuring application listener of
  7. Linux-tar打包与解压命令
  8. 版权所有者删除链接要求大部分被尊重 谷歌去年共删3.45亿个侵权
  9. 英语计算机主板接口有,主板上常见英文的解释
  10. React学习七(React Hooks)