MyCat-架构剖析-内存管理及缓存框架 | 学习笔记

简介: 快速学习 MyCat-架构剖析-内存管理及缓存框架

开发者学堂课程【全面讲解开源数据库中间件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 服务器

image.png

切换到 usr/local/mycat 的目录下并打开 conf 配置文件即上文提到的 cacheserver.properties 。

image.png

输入 cacheserver.properties 后进入

image.png

其中的第一行为注释, 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 是节点名。

image.png

全分片下发是指:如上图所示在 MyCat 中执行 select*from user wherre id=1 语句时,下方三个数据节点时根据 user 表来进行分片的,而且他并不是根据id来分片的,他是根据字段来进行分片的,假设在第一个分片中录入 status=“0” ,第二个分片中 status=“1” ,第三个分片中 status=“2” ,在根据id不知道要将该语句录入哪一种分片时, MyCat 会将语句同时下发到三个分片中,在三种分片中执行完毕后再通过 MyCat 进行汇总,以此来推断该语句在哪一种分片中。

在第二次有相同 SQL 语句输入进来之后 MyCat 就会知道该语句在哪一种分片当中,不用再全部下发到所有分片里,从而提高性能。

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

image.png

图中 encache 表示缓存类型,10000、50000 表示缓存最大大小,1800 代表缓存过期时间即缓存的内容在 1800 秒内有效。

相关文章
|
2月前
|
缓存 运维 监控
Redis 7.0 高性能缓存架构设计与优化
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Redis 7.0高性能缓存架构,探索函数化编程、多层缓存、集群优化与分片消息系统,用代码在二进制星河中谱写极客诗篇。
|
8月前
|
缓存 并行计算 PyTorch
PyTorch CUDA内存管理优化:深度理解GPU资源分配与缓存机制
本文深入探讨了PyTorch中GPU内存管理的核心机制,特别是CUDA缓存分配器的作用与优化策略。文章分析了常见的“CUDA out of memory”问题及其成因,并通过实际案例(如Llama 1B模型训练)展示了内存分配模式。PyTorch的缓存分配器通过内存池化、延迟释放和碎片化优化等技术,显著提升了内存使用效率,减少了系统调用开销。此外,文章还介绍了高级优化方法,包括混合精度训练、梯度检查点技术及自定义内存分配器配置。这些策略有助于开发者在有限硬件资源下实现更高性能的深度学习模型训练与推理。
1634 0
|
11月前
|
存储 缓存 NoSQL
分布式系统架构8:分布式缓存
本文介绍了分布式缓存的理论知识及Redis集群的应用,探讨了AP与CP的区别,Redis作为AP系统具备高性能和高可用性但不保证强一致性。文章还讲解了透明多级缓存(TMC)的概念及其优缺点,并详细分析了memcached和Redis的分布式实现方案。此外,针对缓存穿透、击穿、雪崩和污染等常见问题提供了应对策略,强调了Cache Aside模式在解决数据一致性方面的作用。最后指出,面试中关于缓存的问题多围绕Redis展开,建议深入学习相关知识点。
760 8
|
5月前
|
存储 缓存 NoSQL
Spring Cache缓存框架
Spring Cache是Spring体系下的标准化缓存框架,支持多种缓存(如Redis、EhCache、Caffeine),可独立或组合使用。其优势包括平滑迁移、注解与编程两种使用方式,以及高度解耦和灵活管理。通过动态代理实现缓存操作,适用于不同业务场景。
478 0
|
存储 前端开发 Java
Kotlin教程笔记 - MVVM架构怎样避免内存泄漏
Kotlin教程笔记 - MVVM架构怎样避免内存泄漏
179 2
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
817 0
|
存储 前端开发 Java
Android MVVM架构模式下如何避免内存泄漏
Android采用MVVM架构开发项目,如何避免内存泄漏风险?怎样避免内存泄漏?
395 1
|
8月前
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
|
9月前
|
缓存 NoSQL Java
Redis应用—8.相关的缓存框架
本文介绍了Ehcache和Guava Cache两个缓存框架及其使用方法,以及如何自定义缓存。主要内容包括:Ehcache缓存框架、Guava Cache缓存框架、自定义缓存。总结:Ehcache适合用作本地缓存或与Redis结合使用,Guava Cache则提供了更灵活的缓存管理和更高的并发性能。自定义缓存可以根据具体需求选择不同的数据结构和引用类型来实现特定的缓存策略。
610 16
Redis应用—8.相关的缓存框架
|
12月前
|
自然语言处理 JavaScript Java
《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》学习笔记——HarmonyOS架构介绍
HarmonyOS采用分层架构设计,从下至上分为内核层、系统服务层、框架层和应用层。内核层支持多内核设计与硬件驱动;系统服务层提供核心能力和服务;框架层支持多语言开发;应用层包括系统及第三方应用,支持跨设备调度,确保一致的用户体验。
1081 81