curvefs client删除文件和目录功能设计© XXX Page 1 of 15 curvefs client 删除文件和目录功能设计© XXX Page 2 of 15 背景 相关调研 moosefs chubaofs 方案设计思考 1.Trash机制是实现1个(类似chubaofs),还是2个(类似moosefs)? 2. Trash放在哪里? 3. 是否需要做session机制(在metaserver打开),来维护inode的打开情况? 打开情况? 方案设计 Trash机制: Session机制: 遗留问题 工作量评估 背景 目前curvefs client版本对删除unlink和rmdir的设计只有简单的删除inode和dentry结构,遗留了nlink和lookup count相关的内容还未实现,是不完备的。本文首先调研moosefs,chubaofs等分布式系统,参考并设计解决上述遗留问题。 当前删除接口代码如下:© 一是删除时nlink字段未考虑: 文件的nlink用于实现hard link。 hard link使用nlink字段表示文件的link的引用计数,第一次创建文件是nlink字段为1。每创建一个新的指向该文件的hard link时,nlink字段+1, 每删除一个hard link或指向的原文件时,nlink字段-1。© XXX Page 4 of 15 当nlink字段减到0时,才真正删除i0 码力 | 15 页 | 325.42 KB | 6 月前3
Curve核心组件之snapshotclone04 快照和克隆的特点 快照克隆服务器架构 快照的实现 05 克隆的实现CURVE基本架构 • 元数据节点 MDS • 管理和存储元数据信息 • 感知集群状态,合理调度 • 数据节点 Chunkserver • 数据存储 • 副本一致性,raft • 客户端 Client • 对元数据增删改查 • 对数据增删改查 • 快照克隆服务器 • 快照 • 克隆快照和克隆的特点 增量转储,第一次全量转储s3之后,后续只需转储增量部分 • 高可用,快照任务中断自动拉起继续转储快照和克隆的特点 • 克隆的定义 • 克隆是指从卷复制出卷的功能,提供快速的复制卷的能力。 • 这里的克隆还包括从快照回滚的功能 • 克隆的特点 • 支持Lazy和非Lazy两种模式克隆 • 支持从快照克隆和从镜像(卷)克隆 • 支持从快照回滚 • 高可用,克隆任务中断自动拉起继续克隆快照克隆服务器架构 CloneService: • 任务管理层负责调度SnapshotTask和CloneTask,并向上提供如 cancel task等功能。 SnapshotTaskManager & CloneTaskManager: • 快照克隆核心模块,负责向下调用DataStore,MetaStore等底层 模块,实现快照和克隆的具体功能。 SnapshotCore & CloneCore:快照克隆服务器架构0 码力 | 23 页 | 1.32 MB | 6 月前3
Curve文件系统元数据管理2、其他文件系统的调研总结 3、各内存结构体 4、curve文件系统的元数据内存组织 4.1 inode定义: 4.2 dentry的定义: 4.3 内存组织 5 元数据分片 5.1 分片方式一:inode和dentry都按照parentid分片 5.1.1 场景分析 查找:查找/A/C。 创建:/A/C不在,创建/A/C 删除文件:删除/A/C 删除目录:删除/A rename:rename /A/C到/B/E 这个在inode的ExtentsTree字段 meta partition(raft group) Btree、B+ tree 好 有 tiny extent,多个文件共用 normal extent,属于一个文件 partition append→ master slave协议 overwrite → raft 更适合大文件顺序写 fastcfs 有元数据服务器 inode和dentry放一个结构体。 无中心化服务器 dht算法 hash 扩展时大量迁移 client缓存 inode→ hashtable(gfid) dentry→ hashtable(name) inode扩展属性字段 和写数据一样 好 写多份 overwirte有数据不一致风险 curve 有元数据服务器 lru cache缓存 kv → hashtable(key parent inode + name)0 码力 | 24 页 | 204.67 KB | 6 月前3
BRPC与UCX集成指南接口服务,例如上面的EchoService6 BRPC SERVER7 BRPC SERVER8 BRPC client9 BRPC EndPoint EndPoint是一个代表通讯地址的数据结构, 是一个C++类。 字段: ip,port ●在Socket创建时需要提供EndPoint ●Socket::Connect时需要Remote EndPoint ●Accept的Socket可以获得Remote EndPoint10 ●往SocketMap里调用Insert,要么返回已经存在的Socket对象(引用计数加一),要么创建一 个新的12 BRPC EventDispatcher ●是socket事件分发的中心 ●使用epoll和边沿触发 ●提供监视一个fd是否可读写,并调用对应socket对象的成员函数1314 Socket 输入事件处理15 Socket options ●是创建socket的参数 ●主要成员: Socket对象17 Socket Listener::OnNewConnections Listener 获得一个socket fd后,创建通讯Socket。 SocketOptions关键字段: fd, on_edge_triggered_events18 例子:Request输入处理19 Channel创建Socket20 Channel远程调用的发起21 UCX ●NVIDIA0 码力 | 66 页 | 16.29 MB | 6 月前3
Curve文件系统元数据持久化方案设计-----+----------------+---------+----------+ 字段 字节数 说明 type 1 操作类型,共有以下 2 类: SET (0X01):ADD 和 UPDATE 都可以转换成 SET 操作 DEL (0X02):当为 DEL 操作时,value_length 和 value 则为空 key_length 4 key 长度 key $key_length $key_length 编码后的 key [value_length] 4 value 长度 [value] $value_length 编码后的 value checksum 8 前面 5 部分的校验和© XXX Page 4 of 12 Raft Snapshot +---------+---------+------+-----------------+-----+-----------+ | CURVEFS -+ 持久化文件 字段 字节数 说明 CURVEFS 7 magic number(常量字符 "CURVEFS"),用于标识该文件为 curvefs 元数据持久化文件 version 4 文件版本号(当文件格式变化时,可以 100% 向后兼容加载旧版持久化文件) size 8 键值对数量 key_value_pairs / 键值对(当 size 为 0 时,该字段为空) EOF 1 特殊标记常量0 码力 | 12 页 | 384.47 KB | 6 月前3
CurveFS Client 概要设计(*init) (void *userdata, struct fuse_conn_info *conn); 根据挂载信息,从mds获取文件系统信息(或superblock),块分配器(bitmap)和root inode所在的copyset、 metaserver ip等信息 去metaserver获取文件系统信息(super block),缓存到client端。 destroy void (*destroy) 清理init缓存的文件系统信息。 lookup void (*lookup) (fuse_req_t req, fuse_ino_t parent, const char *name); 根据parent inode id和name从denty缓存中找到对应的denty结构; 如果dentry缓存中不存在对应的inode,则从mds根据parent inode id获取parent inode 所在copyset,metaserver ,则会出错,用此测试文件是否存在,如果不存在则创建此文件。 O_TRUNC 如果文件存在,且为只写或只读打开,则将其文件长度截短为0 O_DSYNC sync数据和必要元数据(不影响读取刚写入的数据) O_SYNC sync数据和所有元数据 O_DIRECTORY 目录 O_DIRECT 直接IO open的主要逻辑: 根据inode id,从mds获取inode所在copyset,metaserver0 码力 | 11 页 | 487.92 KB | 6 月前3
CurveFS Copyset与FS对应关系partition的管理 2.3、meta partition和inode以及dentry的对应关系? 3、curvefs的copyset和fs的对应关系 3.1 如何获取inodeid 3.2 copyset fs共用吗? 3.3 copyset个数是否可以动态调整? 4、curvefs的topo信息 5、curvefs mds和metaserver的心跳 6、详细设计 6.1 创建fs 6 metaserver 子模块拆分 8、inode和dentry的内存估算 8.1 一台机器上能存放多少个inode和dentry 8.2 一台机器上建议的copyset数量 8.3 每个copyset建议管理存储容量的大小 1、背景 curvefs使用raft作为元数据一致性的保证。为了提高元数据的可扩展性和并发处理能力,采用元数据分片的方式管理inode和dentry的元数据。inode的分片依据是fsid 这里需要重新考虑curvefs的copyset和fs的元数据分片的对应关系。© XXX Page 3 of 19 2、chubaofs的元数据管理 chubaofs(补充链接)的元数据也是采用的raft的方式进行管理,可以借鉴一下chubaofs的元数据的分片策略。 通过分析chubaofs的源代码。chubaofs的用volume管理一个文件系统,每个volume有若干meta partition和data partition。meta0 码力 | 19 页 | 383.29 KB | 6 月前3
Curve支持S3 数据缓存方案整个dataCache的设计思路,在写场景下能将数据尽可能的合并后flush到s3上,在读场景上,能够预读1个block大小,减少顺序读对于底层s3的访问频次。从这个思路上该缓存方案主要针对的场景是顺序写和顺序 读,而对于随机写和随机读来说也会有一定性能提升,但效果可能不会太好。 元数据采用2层索引 由于chunk大小是固定的(默认64M),所以Inode中采用maps3 Write流程 1.加锁,根据inode和fsid找到对应的fileCacheManager,如果没有则生成新的fileCacheManager,解锁,调用fileCacheManager的Write函数。 2.考虑到同一个client同一个文件同时只能一个线程进行文件写,所以在Write函数中加写锁。 3.根据请求offset,计算出对应的chunk index和chunkPos。将请求拆分成多个chunk的WriteChunk调用。 在WriteChunk内,根据index找到对应的ChunkCacheManager,根据请求的chunkPos和len从dataCacheMap中找到一个可写的DataCache: 4.1 chunkPos~len的区间和当前DataCache有交集(包括刚好是边界的情况)即可写。 4.2 同时计算后续的多个DataCache是否和chunkPos~len有交集,如果有则一并获取 5. 如果有可写的DataCache, 0 码力 | 9 页 | 179.72 KB | 6 月前3
Open Flags 调研2)、lseek(2)、fcntl(2) etc.)中指向这个打开的文件。打开的文件描述符记录中保存着文件的offset 和 文件status。 每个进程都有个 task_struct 描述符用来描述进程相关的信息,其中有个 files_struct 类型的 files 字段,里面有个保存了当前进程所有已打开文件 描述符的数组,而通过 fd 就可以找到具体的文件描述符:© XXX Page 3 of 文件长度截断为0。 O_TRUNC : 追加写,每次write都会将file offset 指向文件尾(file offset的修改和write操作在一个原子操作中完成)。 O_APPEND O_NONBLOCK O_NDELAY: O_NONBLOCK和O_NDELAY所产生的结果都是使I/O变成非阻塞模式(non-blocking),在读取不到数据或是写入缓冲区已满会马上return, strace ./main open("in.txt", O_RDONLY|O_PATH) = 3 open flags 实现方式 cephfs处理方式是用Fh的结构体保存文件打开的状态和上下文信息,并不该Fh保存在Inode中,在后续读写等操作中依据该状态进行处理。 // cephfs Inode Fh.flags(cephfsFh struct Inode : RefCountedObject0 码力 | 23 页 | 524.47 KB | 6 月前3
CurveFS S3数据整理(合并碎片、清理冗余)为了解决的问题: 客户端在对一个文件的某个部分多次写入后, 同一个chunk会产生很多版本数据; 而客户端在读的时候, 会需要对这些chunk进行筛选和构建, 得到有效的部分, 越是散乱的状态, 就越需要发送更多次读请求至s3. 最后导致无效旧数据的堆积和读请求性能的下降, 所以需要在合适的时候进行重叠元数据和数据的合并 原则是尽力而为, 并不能做到完美 方案 基于一下3个基础的数据结构, 2层索引 paction+1,chunkid为上一步获取的chunkid,为需要新增的obj - 老的obj为全部需要删除的部分 应用变更 - 先读写新增的s3 objects列表, 由于新增了version字段, 不会涉及到覆盖老的对象 - 加锁, 增量的更新inode的s3chunkinfolist, 保证原子更新, 更新失败回退新增数据 - 等待N秒, 保证mds已经告知client缓存失效, 需要更新为新的s3chunkinfolist 在执行变更时, 在bcd步挂掉时, 会造成s3数据的残留 当同时有多个变更inode元数据(s3chunkinfolist)的动作时, 目前的updateinode的实现是直接的覆盖, 如果数据整理和client写同时进行了同一个inode的变更, 总有一个变更会丢失,© XXX Page 3 of 3 2. 1. 2. 1. 2. 需要进行一个merge的步骤 在做变更时如果有其他op可能会产生的冲突:0 码力 | 3 页 | 101.58 KB | 6 月前3
共 30 条
- 1
- 2
- 3













