IBM 大面积辞退 40 岁 + 的员工,瞧一瞧
前言
作为一个已经毕业的计算机专业学长,其实几年大学走来还是挺感慨万千的。(说明一下:一本,非 958、211)老实说,上大学之前填志愿选专业的时候没有任何打算,就觉得学海熬到头了,向往已久的大学舒坦日子要来了,像老一辈人说的“飞出笼的鸟”。最后选的计算机专业也挺喜剧的,因为爱打游戏,所以觉得自己对计算机还挺感兴趣的。当时我并不知道之后我会因为这个决定而改变我的生活。
参考资料:
《开源数据库中间件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 分布式事务类型了。具体的使用流程如下:
在应用层需要设置事务不能自动提交
在 SQL 中设置 XA 为开启状态
执行 SQL
对事务进行提交或回滚
完整流程如下:
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.全局表
每个企业级的系统中, 都会存在一些系统的基础信息表, 类似于字典表、省份、城市、区域、语言表等, 这些表与业务表之间存在关系, 但不是业务主从关系,而是一种属性关系。
面试结束复盘查漏补缺
每次面试都是检验自己知识与技术实力的一次机会,面试结束后建议大家及时总结复盘,查漏补缺,然后有针对性地进行学习,既能提高下一场面试的成功概率,还能增加自己的技术知识栈储备,可谓是一举两得。
以下最新总结的阿里 P6 资深 Java 必考题范围和答案,包含最全 MySQL、Redis、Java 并发编程等等面试题和答案,用于参考~
资料免费领取方式:点赞关注后,戳这里免费领取
重要的事说三遍,关注+关注+关注!
更多笔记分享
评论