背景

客户端 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 的元数据缓存并不保证全场景下的元数据一致性,对于元数据来说,需要实现大部分场景下的缓存一致性,并提供足够好的性能。当前一致性从 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 cache:readdir 从 metaserver 中获取到的信息
length & chunk: lookup,getattr,setattr,create...从 metaserver 中获取的相关信息
缓存失效机制
lookup negative cache:timeout配置(这里是有误判的可能性的,这个状态被记住后需要依赖timeout来更新)
directory cache:通过opendir处理时对mtime的比较(这里至少会有一次到metaserver的rpc)
length & chunk:通过close接口的调用失效
<原创作者,李小翠,Curve maintainer>


关于 Curve
Curve 亦可作为云存储中间件使用 S3 兼容的对象存储作为数据存储引擎,为公有云用户提供高性价比的共享文件存储。
GitHub:https://github.com/opencurve/curve 官网:https://opencurve.io/ 用户论坛:https://ask.opencurve.io/ 微信群:搜索群助手微信号 OpenCurve_bot




