瞧一瞧~看一看~MyCat架构剖析免费不要钱!(下)
一、MyCat线程架构与实现
1.MyCat线程池实现
在MyCat中大量用到了线程池, 通过线程池来避免频繁的创建和销毁线程而造成的系统性能的浪费。在MyCat中使用的线程池是JDK中提供的线程池 ThreadPoolExecutor
的子类 NameableExecutor
, 构造方法如下:
父类构造为:
构造参数含义:
corePoolSize
: 核心池大小
maximumPoolSize
: 最大线程数
keepAliveTime
: 线程没有任务执行时, 最多能够存活多久
timeUnit
: 时间单位
workQueue
: 阻塞任务队列
threadFactory
: 线程工厂, 用来创建线程
2.MyCat线程架构
在MyCat中主要有两大线程池: timerExecutor
和 businessExecutor
。
timerExecutor
线程池主要完成系统时间定时更新、处理器定时检查、数据节点定时连接空闲超时检查、数据节点定时心跳检测等任务。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_Master
、Slave_IO_Running
、Slave_SQL_Running
三个字段,来确定当前主从同步的状态以及主从之间的数据延迟。 Seconds_Behind_Master
为0表示没有延迟,数值越大,则说明延迟越高。
2.MyCat主从切换实现
基于延迟的切换, 则判断结果集中的Slave_IO_Running
、Slave_SQL_Running
两个个字段是否都为yes,以及Seconds_Behind_Master
是否小于配置文件中配置的 slaveThreshold
的值,如果有其中任何一个条件不满足, 则切换。
主要流程如下:
五、MyCat核心技术
1.MyCat分布式事务实现
MyCat在1.6版本以后已经支持XA分布式事务类型了。具体的使用流程如下:
- 在应用层需要设置事务不能自动提交
set autocommit=0;
- 在SQL中设置XA为开启状态
set xa = on;
- 执行SQL
insert into user(id,name,sex) values(1,'Tom','1'),(2,'Rose','2'),(3,'Leo','1'),(4,'Lee','1');
- 对事务进行提交或回滚
commit/rollback
完整流程如下:
2.MyCat SQL路由实现
MyCat的路由是和SQL解析组件息息相关的, SQL路由模块是MyCat数据库中间件最重要的模块之一,使用MyCat主要是为了分库分表, 而分库分表的核心就是路由。
A.路由的作用
如图所示, MyCat接收到应用系统发来的查询语句, 要将其发送到后端连接的MySQL数据库去执行,但是后端有三个数据库服务器,具体要查询那一台数据库服务器呢, 这就是路由需要实现的功能。
SQL的路由既要保证数据的完整 , 也不能造成资源的浪费, 还要保证路由的效率。
B.SQL解析器
Mycat1.3版本之前模式使用的是Fdbparser
的foundationdb
的开源SQL解析器,在2015年被apple收购后,从开源变为闭源了。
目前版本的MyCat采用的是Druid
的SQL解析器, 性能比采用Fdbparser
整体性能提高20%以上。
3.MyCat跨库Join
A.全局表
每个企业级的系统中, 都会存在一些系统的基础信息表, 类似于字典表、省份、城市、区域、语言表等, 这些表与业务表之间存在关系, 但不是业务主从关系,而是一种属性关系。
当我们对业务表进行分片处理时, 可以将这些基础信息表设置为全局表, 也就是在每个节点中都存在该表。
全局表的特性如下:
A.全局表的insert
、update
、delete
操作会实时地在所有节点同步执行, 保持各个节点数据的一致性
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
ShareJoin
是Catlet
的实现, 是一个简单的跨分片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架构剖析免费不要钱!(下)相关推荐
- mysql免费框架_瞧一瞧~看一看~MyCat架构剖析免费不要钱!(上)
一.MyCat总体架构介绍 1.源码下载及导入 导入Idea 2.总体架构 MyCat在逻辑上由几个模块组成: 通信协议.路由解析.结果集处理.数据库连接.监控等模块.如图所示: 通信协议模块: 通信 ...
- 有这么一套,阿里架构师熬夜一周整理的java进阶路线,你看不看?
前言 最近老是有粉丝私信我说感觉自己学java越来越难了,这其中有刚毕业的应届生说自己的技术找不到满意的工作,也有在学校的大学习说找不到学习方式,更多的是正在工作的java开发人员说是现在的技术更新太 ...
- 进阶Java架构师必看书:大型架构+框架+性能优化+中间件+分布式
进阶Java架构师必看书:大型架构+框架+性能优化+中间件+分布式 优知学院 2018-09-05 07:21:00 1.大型网站技术架构:核心原理与案例分析 本书通过梳理大型网站技术发展历程,剖析大 ...
- 从Watson看AI平台的架构设计
本文转自:https://blog.csdn.net/dev_csdn/article/details/78426133 摘要:本文分析IBM Watson在技术架构上所面临的问题及解决办法,总结了人 ...
- android 第三方社区,从友盟微社区看Android第三方SDK架构实践
原标题:从友盟微社区看Android第三方SDK架构实践 开发Android第三方SDK说难不难,但说简单也不简单,要开发一个给很多人使用的第三方SDK,如何在保证稳定性的同时,增强SDK的灵活性,让 ...
- 从12306看海量并发网站架构
TUP第19期综述:从12306看海量并发网站架构(含PPT下载) 发表于2012-02-20 20:27| 19643次阅读| 来源CSDN专稿| 28 条评论| 作者付江 高并发产品设计新浪微博t ...
- 从 VSCode 看大型 IDE 技术架构
关注 逆锋起笔 学习 资源.工具不用愁 ☞ 程序员进阶必备资源免费送「各种技术!」 ☜ 零.前言 为什么要去看 VSCode?因为我们团队在做的中后台快速研发平台云凤蝶也是一款类似 Web IDE 形 ...
- 一张图看懂微服务架构路线
目录 一张图看懂微服务架构路线 我为什么选择微服务架构? 微服务架构路线 基本思路 Docker 容器编排 Docker 容器管理 API网关 负载均衡 服务发现 事件总线 日志记录 监控和警报 分布 ...
- 一分钟看懂数据湖架构
一分钟看懂数据湖架构 数据湖和数据仓库两者都广泛应用于大数据存储,但两者之间概念不可互换.数据湖是存储原始数据的池,目的仍没有明确.数据仓库存储结构化的.已过滤.处理的数据,用于特定分析目的. 两种数 ...
最新文章
- php遍历文件夹下文件内容_PHP遍历某文件夹下的文件与文件夹名
- java 计划日视图,GitHub - sddysz/calendarSchedule: 日程表,仿滴答清单,包含日视图、三日视图、周视图、月视图、列表视图、同步手机系统日程、添加日程...
- python 删除n天前文件_Linux 按时间批量删除文件命令(删除N天前文件)
- C#输入姓名或者拼音码(姓名的首字母,大小写均可)进行快速模糊查找
- Python稳基修炼之计算机等级考试易错概念题3(含答案与解析)
- Python标准库shutil中rmtree()使用回调函数
- 热电偶校验仪_热电偶校验方法_南昌手持热工校验仪,杭州全功能热工过程校验仪厂家...
- NAT-PT (Network Address Translation-Protocol)网络地址转换协议转换
- 简单好用一键恢复丢失办公文档
- BT601和BT709到底什么关系
- fot mac matlab_Matlab for Mac
- Web 3D 的初临
- vba批量合并指定的sheet_用VBA实现把多个Excel文件合并到一个Excel文件的多个工作表(Sheet)里...
- dh参数逆运动学_UR机械臂运动学正逆解方法
- IDEA报错:Lombok Requires Annotation Processing, Annotation processing seems to be disabled
- Invalid Host/Origin header vue项目
- 鸿蒙招聘店铺主是真的吗,为什么很多店铺门口贴着招聘,然而进去问都说招满了,但是招聘的内容还是放在那不收走?...
- YDOOK: Sanic: Python request post请求 上传照片或文件 详细具体步骤 亲测可用!
- python中的位运算符
- html guids标签,Windows下编译kaldi--kaldi(二)