CurveFS方案设计
namespace 的管理形式?留有租户这个概念),直接基于 namespace 开发: a. 功能 软/硬链接:目前是都不支持的。软链接可以通过标识文件类型解决;由于 prefix + parentid + filename 作为 key , filename 直接和 fileInfo 关联,硬链接无法支持 b. 性能 list:list在通用文件系统中是很常见的操作,目前 curve 的元数据缓存使用的 Rename(/A → /B) 获取 /A 所在的 copyset /A 对应的dentry新增计数 创建 /B 节点 删除 /A 节点 Symlink 创建新的inode节点,dentry中标明符号链接 实际数据保存链接到的路径 Link 创建新的dentry, 指向同一个inode 文件系统快照 方案一:文件/目录级别快照 快照是文件系统或卷的只读副本,快照要求可以即时创建。类似 moosefs,curvefs parentID+Filename → FileInfo 表示一个文件)和分级元数据(ParentID+Filename → Inode; Inode → FileInfo)最大的区别在硬链接的实现上。扁平化元数据无法做到共用同一个数据区域,对于硬链接的实现很不友好。 根据之前的调研,分级元数据可以分为两种实现方式。一是类似 fastcfs 把 inode 和 dentry 合并为一个 dentry 的结构,dentry0 码力 | 14 页 | 619.32 KB | 5 月前3SOFAMOSN持续演进路径及实践分享
metrics技术案例 – 协议自动识别 TLS链接 核心实现思路: Ø TLS通过ALPN来识别。 Ø TLS不带ALPN或者明文,通过预读首部字段识别。 ALPN扩展 预读字段 是 否 获取ALPN协商 所得协议 有 无 遍历所有协议 实现,执行 ProtocolMatch 返回AGAIN 匹配成功,获 取对应协议 无法识别协议, 断开链接 继续读取数据技术案例 – HTTP/2 393% New http2(4 core) 17200 57ms 40M 395%技术案例 – 长连接网关RawEpoll模式 经典Golang netpoll模型 ² 问题:协程数量与链接数量成正比,大 量链接场景下,协程数量过多 u Stack内存开销 u Read buffer开销 u Runtime调度开销 参考阅读:million-websockets-and-go Netpoll read conn …… 调度切换/就绪通知 3.请求处理过程中,协程调度 与经典netpoll模式一致 Raw Epoll goroutine pool conn.read conn 1. 链接建立后,向epoll注册oneshot 可读事件监听;并且此时不允许有协 程调用conn.read,避免与runtime netpoll冲突。 2. 可读事件达到,从gorotine pool挑 选一个协程进行读事件处理;由于使0 码力 | 29 页 | 7.03 MB | 5 月前3CurveFS rename 接口实现方案
而每一步骤都有可能出错,chubaofs 针对以上的 4 步骤中出现的错误处理如下: 步骤 1 出错,啥事都没发生 步骤 2 出错,等同于创建硬连接出错,恢复机制如下: 将源文件的 nlink 减一 步骤 3 出错,相当于创建了硬链接,但是没有删除源文件,此时源文件和目标文件同时存在,恢复机制如下: 删除目标文件 dentry 将源文件的 nlink 减一 备注: 如果这一步骤出错,并且恢复机制没有执行成功,那么会导致一些问题:© rename /dir1/file1 /dir2/file2,既不能在 /dir1 目录下创建 file1,也不能在 /dir2 目录下创建 file2 ) (2) 并且因为存在硬链接,不能通过再次 rename 来获取成功(一般用户 rename 返回失败后,有可能希望再次执行 rename 以获得成功) 步骤 4 出错,会导致 inode 有可能没办法被正常回收 (nlink 没减一的情况 步骤 3: ,就会同时存在 src、dst 的 dentry,相当于多了一个硬链接,Linux 和 POSIX 这一步出错 接口中表明这允许一段时间内存在,但是最终还是要原子性,所以这一步出错会导致和本地文件系统不一致的行为: Linux 接口定义允许 rename 过程中某一段时间存在这样的硬链接(或者 rename 执行到一半断电也会存在) 而 POSIX 接口中提到了该函数得是原子(不断电的情况下,rename0 码力 | 15 页 | 555.93 KB | 5 月前3Open Flags 调研
TS=64)。 O_LARGEFILE : 以目录形式打开,如果pathname不是一个目录则会打开失败。 O_DIRECTORY : 。 O_NOFOLLOW 如果pathname是一个符号链接,则会打开失败(ELOOP) : 不更新Inode中的last access time(进程uid=文件uid或者进程在它的user namespace有CAP_FOWNER, 而文件的uid在这个namespace中有一个映射)。 标志位的话系统会忽略大部分其他的标志位(除了O_CLOEXEC, O_DIRECTORY, O_NOFOLLOW)。特别是如果配合使用 O_NOFOLLOW,那么遇到符号链接的时候将会返回这个符号链接本身的文件描述符,而非符号链接所指的对象。 : 用于生产临时的无名的普通文件,pathname指定一个目录。 O_TMPFILE libfuse open void(* fuse_lowleve fs。具体实现后续可以再深入看看。© XXX Page 23 of 23 结论 1,需要实现file_truncate接口来支持O_TRUNC flag(优先级高)。 2,待curvefs支持链接和支持对inode中atime、ctime、mtime的修改后,对O_NOFOLLOW和O_NOATIME进行测试(优先级中)。 3,目前I/O模式类flag(O_SYNC, O_DSYNC, O0 码力 | 23 页 | 524.47 KB | 5 月前3Curve文件系统元数据管理
还需要额外考虑一下的hard link, symlink,rename的处理。 fastcfs的inode和dentry没有分开,两者在同一个结构体里面。这种方式如何应对硬链接? 看了下fastcfs的实现,在硬链接这里是有问题的。 考虑inode和dentry的内存组织形式,可以考虑hashmap,skiplist,btree等,但是无论选择哪种方式组织,节点都可以抽象成一个Key 这里rename的时候,涉及到inode信息跨节点迁移。需要引入分布式锁,是个难点。 symbolic link: 这个类型的文件和普通文件一样创建删除,区别在于,在inode信息中记录需要链接到的地址。 hardlink:生成一个hardlink /B/E,指向文件/A/C 1、client给server0发送请求: parentid 0 + name "A",查询"A"的inodeid为100 4、client给server2发送请求: parentid 200 + name "E",查询不到 生成记录?inode 300,按照原文件/A/B,应该在A的inodeid映射的机器上;按照硬链接/B/E,应该在B的inodeid映射的机器上。 生成记录 200 + E → 300 5、client给server1发送请求: 修改记录 "C"的inode link++ 这里涉及到增加0 码力 | 24 页 | 204.67 KB | 5 月前3CurveFS S3本地缓存盘方案
写本地硬盘缓存目录之前先判断缓存目录容量是否已达到阈值,如果已经达到阈值,那么则直接写入到远端对象存储;否则,则写入到本地硬盘写缓存目录中。文件写入本地硬盘写缓存目录后,从本地硬盘读目录© XXX Page 4 of 9 做一个硬链接链接到该文件。 本次io在本地硬盘写入好之后,异步上传模块会适时把本地硬盘写缓存目录中的文件上传到远端对象存储集群,上传成功后,删除本地写缓存目录中的对应文件。 同时,缓存清理模块会定时检查本地硬 了)。 本地缓存盘的文件内容表示 本地缓存盘存放的文件即是存储到对象存储中的对象。 写缓存如何作为读缓存利用 除了写缓存目录,另外引入读缓存目录;当写缓存目录中有新文件加入时,则对该文件做硬链接到读缓存目录。 这样,写缓存目录中的文件上传完之后就可以直接删除了,那么该文件的读缓存还是存在的。 缓存盘空间管理 当缓存文件内容达到阈值时,停止向本地缓存盘写入。 同时,缓存清理模块会定时0 码力 | 9 页 | 150.46 KB | 5 月前3Curve核心组件之Client - 网易数帆
快照克隆服务器CURVE基本架构 01 02 03 04 Client总体介绍 热升级NEBD总体介绍 新版本Client/NEBD性能优化 QEMU、Curve-NBD:上层应用 通过链接curve-client使用curve提供的服务 FileManager:提供接口,记录已挂载卷 FileInstance:对应一个已挂载的卷 LeaseExecutor:负责定期与MDS通信,获取卷的元数据信息 新版本Client/NEBD性能优化NEBD 整体介绍 热升级之前,QEMU是直接链接curve-client, 所以client版本需要升级时,需要对QEMU进 程进行重启。NEBD 整体介绍 在QEMU和Curve Client中间加入热升级模块,避 免直接依赖 热升级模块是CS结构: NEBD Client(part1):只包含轻量的业务逻辑, 以链接库的形式提供给QEMU使用 NEBD Server(part2):将NEBD0 码力 | 27 页 | 1.57 MB | 5 月前3蚂蚁金服ServiceMesh数据平面 SOFAMosn深层揭秘
容器管理平台更替快速进行中 ØGolang 性能,成本评估符合蚂蚁实际需求2 构架SOFAMesh 1SOFAMosn 2SOFAMosn内数据流 3NET/IO 4 Ø屏蔽IO处理细节 Ø定义网络链接生命周期,事件机制 Ø定义可编程的网络模型,核心方法,监控指标 Ø定义可扩展的插件机制PROTOCOL 5 Ø定义编解码核心数据结构 üMesh处理三段式:Headers + Data + Trailers C模块划分 11要点总结 12 Ø模块化,分层解耦 Ø统一的编程模型接口 Ø可扩展的事件驱动模型 Ø可扩展的路由/后端管理机制 Ø更好的吞吐量3 能力核心能力 1 网络处理 •网络编程接口 •链接管理 •事件机制 •Metrics 收集 •TCP 代理 •TLS 支持 •TProxy 支持 •平滑 reload •平滑版本升级 多协议 •SOFA RPC •HTTP 1.x •基础负载均衡算法 •主动健康检查 •Subset 负载策略Highlights 2 ØX-Protocol: 支持 RPC on HTTP2的通用方案(完善中) Ø支持平滑升级中协议无关存量链接迁移 Ø支持指定 / 更新 Downstream / Upstream 协议配置 ØSOFARPC 支持 Upstream 反向请求Istio集成 3 Ø支持 Istio 0.8 版本 Pilot0 码力 | 44 页 | 4.51 MB | 5 月前3CurveFS Client 概要设计
eadlink向上返回link contents。 软链接相关接口目前可先不实现。 link void (*link) (fuse_req_t req, fuse_ino_t ino, fuse_ino_t newparent, const char *newname); 这个涉及到下文中”重要问题讨论“,目前暂时无法设计 硬链接相关目前可先不实现。© XXX Page 9 of 110 码力 | 11 页 | 487.92 KB | 5 月前3curvefs client删除文件和目录功能设计
目录的nlink字段与文件的nlink字段不同, , 并且在目录下, , 删除目录nlink相应的减1。 目录的nlink字段初始值为2 每创建一个新目录,nlink字段也会+1 目录不支持硬链接。 二是删除时lookup count未考虑: lookup count 指的是文件的访问计数。当文件/目录被打开时, ,该文件/目录仍然可以被打开的进程访问,不会造成崩溃或报错,我们的curvefs也需要实现 是nlink-1,那么在执行完第一步之后,client如果崩溃或者掉电,或者是发送nlink-1的rpc失败(可以重试,但重试仍有可能失败), 这种情况下,就会存在nlink未被减1的情况,当所有硬链接都被删除后,就会出现孤儿inode。 moosefs由于只有一个mds节点看,所以不存在这个问题。 chubaofs的解决方案是: 在Delete_ll(api.go) 函数中,在delete0 码力 | 15 页 | 325.42 KB | 5 月前3
共 17 条
- 1
- 2