【ceph】存储领域的CAS是什么?什么是CAS|Open CAS|缓存加速软件
目录
作者:bandaoyu @UESTC 链接:https://blog.csdn.net/bandaoyu/article/details/122742029
什么是CAS
H3C的CAS是指:超融合UIS和虚拟化平台CAS,uis针对对网络 存储技术不太熟悉客户,提供一体化方案。cas是专业虚拟化解决方案。
分布式存储领域的CAS 不是CAS算法。
是指 Cache Acceleration Software 缓存加速软件,主要的开源软件是:Open CAS
CAS的用处是:通过使用更高性能的存储设备加速后端块存储IO访问。说白了就是增加一个缓存层
Open CAS:
- Open Cache Acceleration Software 主要目标是通过使用更高性能的存储设备加速后端块存储IO访问。
- CAS的核心是 Open CAS Framework,OCF是使用C语言写的高性能块存储元库,OCF具有平台无关性,访问系统API通过用户提供的Env实现,提供完美,高性能,低延迟的缓存工具,它仅仅是一个缓存引擎,APP自己实现适应层。
- 为在OCF基础上构建完整的缓存解决方案,CAS提供了两种实现,一个是Open CAS Linux,另一个是 SPDK Block Device。
出现原因和应用场景:
简洁说明:
HDD盘便宜,但是小块数据数据访问效率低。所以加一层缓存层提高性能==》Open-CAS缓存框架来加速Ceph OSD节点。
详细说明:
HDD的随机访问受到磁头寻道时间的限制,与SSD相比,这导致随机访问的性能大大下降。对于10,000 RPM机械硬盘,随机读写的IOPS(每秒输入/输出操作)大约为350。
基于机械硬盘的Ceph集群成本较低,适合于大规模数据的顺序访问场景,但是不适用于OLTP(在线事务处理)工作负载中的小块数据访问。
如何以最优的成本提高小块数据的随机操作的访问性能?我们提出了Open-CAS缓存框架来加速Ceph OSD节点。
产品例子:傲腾配OpenCAS 看傲腾配OpenCAS加速联通沃云业务_缓存
集群实例:《高性能CEPH存储:基于OpenCAS缓存的集群性能调研》高性能CEPH存储:基于OpenCAS缓存的集群性能调研_NewTyun的博客-CSDN博客
高性能CEPH存储:基于OpenCAS缓存的集群性能调研 - 知乎
《》https://www.supermicro.org.cn/solutions/Supermicro-SES-5-CAS-Implemetation-Guide.pdfIntel® Cache Acceleration Software Implementation Guide《》https://www.supermicro.org.cn/solutions/Supermicro-SES-5-CAS-Implemetation-Guide.pdf
初始Open CAS
摘抄自:初始Open CAS - 知乎
What
- Open Cache Acceleration Software 主要目标是通过使用更高性能的存储设备加速后端块存储IO访问。
- CAS的核心是 Open CAS Framework,OCF是使用C语言写的高性能块存储元库,OCF具有平台无关性,访问系统API通过用户提供的Env实现,提供完美,高性能,低延迟的缓存工具,它仅仅是一个缓存引擎,APP自己实现适应层。
- 为在OCF基础上构建完整的缓存解决方案,CAS提供了两种实现,一个是Open CAS Linux,另一个是 SPDK Block Device。
下图展示了SPDK和Linux实现的缓存软件栈。
SPDK Block Device
- [https://open-cas.github.io/getting_started_spdk.html] 查看如何配置SPDK
Open CAS Linux
- 作为内核模块安装在Linux系统中,透明化完整的缓存解决方案给用户,APP无需做任何的更改
- [https://open-cas.github.io/guide_installing.html] 查看CAS Linux安装信息
- [https://open-cas.github.io/guide_configuring.html] 看CASAdmin的配置信息
What's Cache?
- 通常来说,Cache就是APP与BackendStorage交换数据的中间组件,有选择地在一个相对较小和较快的高速存储器上存储大多数访问数据,已达到降低数据访问时间和提升系统性能。
- 应用程序的数据被Cache使用Cacheline维护起来,每一个Cacheline都与有一个Coreline关联,在某个指定的时间内不是所有的Coreline都被关联到Cacheline中。
What's Cache Object?
- 缓存对象是对Cache的一个抽象,提供一组接口用于与缓存状态机进行交互。
- 可挂载一个 Cache storage,添加或者删除 core
- 设置一个Cache的配置信息,比如 Cacheline Size, stat, etc
- 一个Cache可以处理多个Core的数据
- Core可以成为另一个Core的后端存储或某些缓存的缓存存储,通过这个特性我们可以创建多级缓存。
Cache operations
以下几个操作构建了基本的缓存逻辑
1. Mapping
> 用于将Coreline与Cacheline的映射关系存储在 Cache metadata中
> 一旦Cacheline被映射出去,就可以用于存储Coreline的数据
> 这种关系将被 eviction操作解除
2. Insertion
> 用于将Coreline的数据写入Cacheline
> 不修改mapping metadata,但会根据IO数据修改 valid与 dirty字段
> 只有被映射成功的Coreline才可以执行insert操作
3. Update
> 用于将CacheStorage中的Cacheline数据重写,主要是发生在写请求的IO数据已经被映射到cache中而且访问的数据被标记为 valid。如果其中一个数据被标记为无效,将执行 insert操作之后在执行 Update。
4. Invalidation
> 将Cacheline标记为 invalid,常发生于discard,purge等操作中
5. Eviction
> 移除Cacheline的mapping。当没有足够的空间存放新的缓存数据时候发生,根据淘汰算法进行淘汰相应的Cacheline。当前OCF只支持LRU(Least Recently Used)。
6. Flushing
> 用于同步CacheStorage数据至BackendStorage中,它将标志位为diry的缓存数据存放到后端存储盘中,然后将dirty位设置为零。该操作是由用户主动触发,用于刷新数据。
7. Cleaning
> 该操作等同于Flushing,只不过该操作是Cache自动执行的。一般同通过 cleaning policy策略执行。
Cache Configuration
Cache Mode
选项决定了IO事件将如何被缓存引擎处理。
1. Write-Though(WT)
数据将被写入到CacheStorage于BeckendStorage中,该模式保证数据一致性。
该模式只会加速读操作,因为写会执行两次写入。
2. Write-Back(WB)
数据首先被写入CacheStorage中,然后直接告诉APP写操作完成了。
根据 cleaning policy将数据回写至BackendStorage。
具有数据丢失风险
3. Write-Around(WA)
数据首先被写入BackendStorage中,如果Cacheline已经mapped,那么也立即写入到CacheStorage中。 进一步优化了缓存,以避免在写入数据之后不经常重新读取的情况下缓存污染。
4. Write-Invalidate(WI)
数据首先被写入BackendStorage中,如果Cacheline已经mapped,将Cacheline设置为 invalid。
减少了 eviction操作,也降低了写入数之后不经常读的工作负载。
5. Write-Only(WO)
数据首先被写入CacheStorage中,然后直接告诉APP写操作完成了。
读操作不会缓存数据。
具有数据丢失风险
6. Pass-Through(PT)
数据bypass缓存引擎,允许用户动态的开关缓存。
Cache line size
选项决定了缓存操作的数据块大小,目前OCF有一下几种值。
1. 4KiB
2. 8KiB
3. 16KiB
4. 32KiB
5. 64KiB
What's Core?
- 是APP访问BackendStorage的一个抽象,提供了一组接口用于IO操作。在正常缓存操作期间,后端存储由缓存对象独占所有,应用程序不应直接访问它,除非核心从缓存中删除。
What's Cache line?
- Cacheline是可以映射到缓存中的最小数据部分。
- 每个映射的缓存线都与一个核心线相关联,核心线是后端存储上的相应区域。
- 缓存存储和后端存储都被拆分为一个缓存行大小的块,所有缓存映射都与这些块对齐。
Cache line metadata
- OCF 为每个缓存行维护一小部分元数据。主要包含 core id,core line number,valid|dirty。
- valid的意思是指当前行已经被映射了一个core line,它的其他数据有效。否则该缓存行的其他元数据信息无效。只有它无效的时候才可以被用于映射IO请求访问的Coreline,然后让它变成有效。有以下几中情况将该行变成无效。
- 当cacheline被执行evicted时候
- 当core被移除的时候
- 当core被清理的时候
- 当cache被清理的时候
- 执行discard的时候
- 在WI模式下的写操作时候
- dirty位表明是否需要将CacheStorage中的数据flush至BackendStorage中。只有在写操作并且是WB模式下才可以发生该情况。