最后
还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
构造参数含义:
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;
难道这样就够了吗?不,远远不够!
提前多熟悉阿里往年的面试题肯定是对面试有很大的帮助的,但是作为技术性职业,手里有实打实的技术才是你面对面试官最有用的利器,这是从内在散发出来的自信。
备战阿里时我花的最多的时间就是在学习技术上,占了我所有学习计划中的百分之70,这是一些我学习期间觉得还是很不错的一些学习笔记
我为什么要写这篇文章呢,其实我觉得学习是不能停下脚步的,在网络上和大家一起分享,一起讨论,不单单可以遇到更多一样的人,还可以扩大自己的眼界,学习到更多的技术,我还会在csdn、博客、掘金等网站上分享技术,这也是一种学习的方法。
今天就分享到这里了,谢谢大家的关注,以后会分享更多的干货给大家!
已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录**
转载自CSDN-专业IT技术社区
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/2401_84023683/article/details/138467628