暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

优化读取:Curve 文件存储的缓存策略

OpenCurve 2023-09-28
696

背景

Curve 是云原生计算基金会 (CNCF) Sandbox 项目,是网易主导自研和开源的高性能、易运维、云原生的分布式存储系统。Curve 分为CurveFS(文件存储)和CurveBS(块存储)。
Curve 文件存储简介
Curve 文件存储的架构如下:

  • 客户端 Posix 兼容:像本地文件系统一样使用,业务无缝接入,无侵入性;

  • 独立的元数据集群:元数据分布式设计,可以无限扩展。同一文件系统可以在数千台服务器上同时挂载,高性能并发读写,共享数据;

  • 多种数据后端的支持:数据支持存储在各种支持 S3 接口的对象存储中,也支持存储在 Curve 块存储中;

  • close-to-open 一致性:文件重新 open 可以看到最新的修改信息。

Curve 文件存储数据缓存

为了让读写有更高的性能,Curve 文件存储支持了多级数据缓存:

  • 内存缓存:用于加速当前节点上的读写速度。内存缓存按照地址空间的方式组织,按照 chunk 和 block 两级做拆分,到 S3 以数据分片的方式写入;到 Curve 块存储后端需要按照数据量大小申请空间并写入。S3/Curve 块存储后端均支持。内存缓存和后端持久化存储的对应关系如下:

  • 本地缓存:用于加速当前节点上的读写速度,当前仅支持 S3 后端,可以使用本地盘/云盘格式化文件系统后使用。存储的是不变的 S3 分片。

  • 全局缓存集群:用于加速当前节点以及多节点数据共享时的速度。当前仅支持 S3 后端。同样存储的是不变的 S3 分片。说明:为了保证多挂载下数据的一致性,要求A挂载点写完,B挂载点可以读取到数据,在没有全局缓存的情况下,A写完的数据必须要上传到 S3,B挂载点才可见。数据上传 S3 的延迟是不可控的,有时可能达到百 ms 级别,对共享性能的影响很大,所以添加一个全局缓存用于加速。在有全局缓存的情况下,数据的可靠性等价于本地缓存的可靠性。

在有多级缓存的情况下,缓存的一致性如何保证?数据的写入顺序总是先内存缓存,再 S3/Curve块存储/全局缓存;到数据的读取顺序也是先内存缓存,再 S3/Curve块存储/全局缓存。


Curve文件系统元数据缓存

Curve 的元数据缓存并不保证全场景下的元数据一致性,对于元数据来说,需要实现大部分场景下的缓存一致性,并提供足够好的性能。当前一致性从 3 个维度来衡量:

  • 文件可见性:在一个客户端执行文件创建、删除、重命名等操作,另外一个客户端可以立马看到。这一维度需要完全保证;

  • 属性一致性:一个文件属性(如 atime、ctime、mtime、mode、size...)在一个客户端修改后,另外一个客户端立即能看到。针对这一维度,允许某些属性在某些场景下存在一定延迟;

  • 内容一致性:文件内容符合 close-to-open 的语义,即关闭后,重新打开能立即看到全部修改。

文件的元数据缓存主要有两个部分:一部分是在 kernel 中,一部分在 CurveFS-Fuse 中:

【(1) 内核缓存超时

除受缓存影响的查找和获取属性请求外,其他请求均发送到 FUSE 层。如果条目或属性缓存超时,VFS 层将向 FUSE 层发送请求。

(2) 重新验证缓存

对于打开文件和打开目录请求,FUSE 层应通过比较修改时间重新验证缓存。如果已修改,FUSE 层应该:

  • 打开文件:返回 ESTALE 以触发 VFS 层再次打开,忽略缓存。

  • 打开目录:丢弃所有目录缓存。

  • 其他请求:直接代理到元服务器。

(3) 获取最新元数据

对于读取目录请求,FUSE 层应该缓存目录条目和它们的属性。其他请求不进行缓存。

(4) 超时回复

将条目或属性回复给 VFS 层,并设置相应的缓存超时时间。提供四种类型的超时:entryTimeout、dirEntryTimeout、attrTimeout、dirAtttTimeout。在将属性回复给 VFS 层时,FUSE 层应该记住属性的修改时间。】

Kernel Cache

  • 缓存类型:entry、dirEntry、attr、dirAttr

  • 缓存机制

    • 通过各类可以返回 attr、entry 给内核的接口(例如 mknode, mkdir, link, getattr等)

  • 缓存失效机制

    • 各项 timeout 的配置

    • 通过 open 的返回码 ESTALE 触发 entry 和 attr 缓存的失效(通过比较 mtime 的方式); 通过 readdir 和 opendir 的结果更新 direntry 和 dirattr的缓存

CurveFS Fuse

  • 缓存类型:length、chunk、directory cache、lookup negative cache

  • 缓存机制

  • lookup negative cache:从 metaserver 中连续获取到 N (通过配置文件设置) 次 not exis t信息,这个状态将被缓存

  • directory cachereaddir 从 metaserver 中获取到的信息

  • length & chunk: lookup,getattr,setattr,create...从 metaserver 中获取的相关信息

  • 缓存失效机制

  • lookup negative cache:timeout配置(这里是有误判的可能性的,这个状态被记住后需要依赖timeout来更新)

  • directory cache:通过opendir处理时对mtime的比较(这里至少会有一次到metaserver的rpc)

  • length & chunk:通过close接口的调用失效



<原创作者,李小翠,Curve maintainer>



------ END. ------
🔥 社区资讯:
兴趣 + Curve 社区 == 秋招秘诀?(附网易内推码)
Curve 社区上半年 Roadmap 进展及下半年规划
🔥 用户案例:
Curve 文件存储在 Elasticsearch 冷热数据存储中的应用实践
扬州万方:基于申威平台的 Curve 块存储在高性能和超融合场景下的实践
创云融达:基于 Curve 块存储的超融合场景实践 
🔥 技术解析:
探索 : CurveBS 模拟 RBD 接口对接 OpenStack
Curve 混闪之性能优化记录
CurveBS RDMA & SPDK 部署指南



关于 Curve 

Curve 是一款高性能、易运维、云原生的开源分布式存储系统。可应用于主流的云原生基础设施平台:对接 OpenStack 平台为云主机提供高性能块存储服务;对接 Kubernetes 为其提供 RWO、RWX 等类型的持久化存储卷;对接 PolarFS 作为云原生数据库的高性能存储底座,完美支持云原生数据库的存算分离架构。

Curve 亦可作为云存储中间件使用 S3 兼容的对象存储作为数据存储引擎,为公有云用户提供高性价比的共享文件存储。

  • GitHub:https://github.com/opencurve/curve
  • 官网https://opencurve.io/
  • 用户论坛:https://ask.opencurve.io/
    微信群:搜索群助手微信号 OpenCurve_bot



文章转载自OpenCurve,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论