开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(三):MyCat-架构剖析-内存管理及缓存框架】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/757/detail/13298
MyCat-架构剖析-内存管理及缓存框架
内容介绍
一.内存管理
二.缓存架构
MyCat 的内存管理实际上指的是 MyCat 的缓冲区管理。缓冲区的存在是为了提高 MyCat 的性能,因为在缓冲区当中通常存储的是常用的一些数据,将它缓存在我们的这个缓冲区,可以让系统直接访问,不用再去访问具体的磁盘以及 MyCat 降低磁盘的 Io ,从而来提高性能。
一.内存管理
1).缓冲池组成
缓冲池的最小单位为 chunk ,默认的 chunk 大小为4096字节(DEFAULT_BUFFER_CHUNK_SIZE),缓冲池的大小与处理器有关, BufferPool 的总大小为4096× processors ×1000(其中 processors 为处理器数量)。
对 I/O 进程而言,他们共享一个缓冲池。缓冲池有两种类型:本地缓存线程(以S_开头的线程)缓冲区和其他缓冲区,分配 buffer 时,优先获取 ThreadLocalPool 中的 buffer ,没有命中时会获取 BufferPool 中的 buffer 。
2).分配 MyCat 缓冲池
分配缓冲池时有两种方法,可以指定大小,也可以用默认值。
Allocate ():先检测是否为本地线程,当执行线程为本地缓存线程时, LocalBufferPool 取出一个可用的 buffer 。
如果不是,则从 ConcurrentLinkedQueue 队列中取出一个 buffer 进行分配,如果队列没有可用的 buffer ,则创建一个直接缓冲区。
Allocate(size) :如果用户指定的 size 不大于 chunkSize ,则调用 allocate ()进行分配;反之则调用
CreateTempBuffer(size) 创建临时非直接缓冲区。
3). MyCat 缓冲池的回收
回收时先判断 buffer 是否有效,如有以下情况缓冲池不回收。
A.不是直接缓冲区
B. Buffer 是空的
C. Buffer 的容量大于 ChunkSize
二.MyCat 缓存架构
1).缓存框架选择
MyCat 支持 ehcache、mapdb、leveldb 缓存,可通过配置文件 cacheserver.properties 来进行配置
打开 157 服务器
切换到 usr/local/mycat 的目录下并打开 conf 配置文件即上文提到的 cacheserver.properties 。
输入 cacheserver.properties 后进入
其中的第一行为注释, factory.inchache 表明当前缓冲池是用哪一种框架实现的默认为 encache 也可以用 mapdb、leveldbshi 。 Key is pool name 是缓冲池的名字 value is tupe 表示缓存类型,
size 表示大小, expire seconds 表示过期时间,后四行则表示默认的缓存内容。
2).缓存内容
MyCat 有路由缓存、表主键到 datanode 缓存、 ER 缓存。
A.路由缓存:即 SQLRouteCache ,根据 SQL 语句查找路由信息的缓存,该缓存只是针对 select 语句,如果执行了之前已经执行过的某个 SQL 语句(缓存命中),那么路由信息就不需要重复计算了,直接从缓存中获取。
B.表主键到 datanode 缓存:当分片字段与主键字段不一致时,直接通过主键值查询时无法定位具体分片的(智能全分片下发),所以设置该缓存之后,就可以利用主键值查找到分片名,缓存的 key 值时 ID 值, value 是节点名。
全分片下发是指:如上图所示在 MyCat 中执行 select*from user wherre id=1 语句时,下方三个数据节点时根据 user 表来进行分片的,而且他并不是根据id来分片的,他是根据字段来进行分片的,假设在第一个分片中录入 status=“0” ,第二个分片中 status=“1” ,第三个分片中 status=“2” ,在根据id不知道要将该语句录入哪一种分片时, MyCat 会将语句同时下发到三个分片中,在三种分片中执行完毕后再通过 MyCat 进行汇总,以此来推断该语句在哪一种分片中。
在第二次有相同 SQL 语句输入进来之后 MyCat 就会知道该语句在哪一种分片当中,不用再全部下发到所有分片里,从而提高性能。
C. ER 关系缓存:在 ER 分片时使用,而且在 insert 查询中才会使用缓存,当字表插入数据时,根据父子关联字段确定子表分片,下次可以直接从缓存中获取所在的分片。
图中 encache 表示缓存类型,10000、50000 表示缓存最大大小,1800 代表缓存过期时间即缓存的内容在 1800 秒内有效。




