Curve文件系统元数据管理Curve文件系统元数据管理(已实现)© XXX Page 2 of 24 1. 2. 3. 4. Inode 1、设计一个分布式文件系统需要考虑的点: 2、其他文件系统的调研总结 3、各内存结构体 4、curve文件系统的元数据内存组织 4.1 inode定义: 4.2 dentry的定义: 4.3 内存组织 5 元数据分片 5.1 分片方式一:inode和dentry都按照parentid分片 extent,属于一个文件 partition append→ master slave协议 overwrite → raft 更适合大文件顺序写 fastcfs 有元数据服务器 inode和dentry放一个结构体。 inode → hashtable(key是ino,全局) dentry → skip list (key是name,每个目录下一个) 计算出来的 binlog,随时间会越来越大 差 DG inode + offset) etcd 差 块设备,最小10GB segment + chunk raft 块设备的元数据管理 cephfs 3、各内存结构体 时间复杂度 空间复杂度 特点 可用实现 Btree 一个节点上保存多条数据,减少树的层次(4~5层),方便从盘上读取数据,减少去盘上读取次数。适合在盘上和内存组织目录树。 google,https://github0 码力 | 24 页 | 204.67 KB | 6 月前3
Open Flags 调研mount$ strace ./main open("in.txt", O_RDONLY|O_PATH) = 3 open flags 实现方式 cephfs处理方式是用Fh的结构体保存文件打开的状态和上下文信息,并不该Fh保存在Inode中,在后续读写等操作中依据该状态进行处理。 // cephfs Inode Fh.flags(cephfsFh struct Inode return --_ref; } }; FastCFS处理方式是自定义FileInfo保存文件打开的状态信息,在create()、open()、opendir()操作时填充进 fuse_file_info结构中,在后续操作中直接使用: struct fuse_file_info { /** Open flags. Available in open() and release() */ int flags; ..© XXX Page 15 of 23 fi->fh = (long)fh; return 0; } 整体flags支持方案 目前倾向于使用类似fastcfs的方式,自定义结构FileHandle,在create()、open()、opendir()时将上下文信息保存到fuse_file_info中,在后续文件操作时判断相关flags进行具体操作。简单的FileHandle如下0 码力 | 23 页 | 524.47 KB | 6 月前3
CurveFS Copyset与FS对应关系拿着inodeid查询,dentry是拿着parent的inode id去查询。© XXX Page 6 of 19 一个fs的meta partition使用第一个叫做MetaWrapper的结构体组织起来© XXX Page 7 of 19 type MetaWrapper struct { sync.RWMutex cluster string localIP 选partition partition:负责元数据的一段分片,每个元数据一定有对应的partition进行处理 inode manange/ dentry manager:负责管理元数据的内存结构 heartbeat:定期获取copyset的信息 模块 估算工作量(开发 + ci完成) client 10d mds 15d metaserver 10d 考虑到partition和0 码力 | 19 页 | 383.29 KB | 6 月前3
MySQL 兼容性可以做到什么程度中间件只是起点,PolarDB-X 可能是离终点最近的那个 对近十年的探索以及五年的上云 经验进行重新思考,面向未来设 从运维视角实现计算存储一体化 计新架构 产品形态 基于MySQL XA实现分布式事务 基于外部组件进行扩容 支持扩容 分布式事务 一体化尝试 Review 2.0 开源 2016 2017 2018 2019 2020 2021 2021年10月20日,云栖大会宣 布开源0 码力 | 18 页 | 3.02 MB | 6 月前3
CurveFS Client 概要设计id和name从denty缓存中找到对应的denty结构; 如果dentry缓存中不存在对应的inode,则从mds根据parent inode id获取parent inode 所在copyset,metaserver ip等信息 ,然后从metaserver获取denty(这里有两种方式,一种是只获取当前需要的 denty,一种是list整个目录的denty,这个需要考虑用哪个接口) 根据找到的denty结构,获取inodeid,设置 从缓存中查找到对应inode结构; 如果inode缓存中不存在对应的inode,则从mds获取inode所在copyset,metaserver ip等信息,然后从metaserver获取inode结构,缓存之; 判断inode结构中,对应请求[off, size]位置的空间是否有分配:如果未分配或只有部分分配空间,则调用空间分配器分配空间,并根据空间分配器返回结果,修改inode结构(包括file length); 要修改为read merge write,即读出未对齐缺少的部分,然后整个[offset,len] 调用curve client写); 修改inode结构,如果上述区域存在先前未写过的区域,则需要去掉unwritten,具体方式根据inode结构而定;inode修改需要持久化到底层并修改本地cache;© XXX Page 6 of 11 read void (*read) (fuse_req_t0 码力 | 11 页 | 487.92 KB | 6 月前3
CurveFS方案设计2021-04-13 李小翠、陈威 补充元数据数据结构 2021-04-19 李小翠、吴汉卿、许超杰等 补充文件空间分配,讨论与确认 背景 调研 开源fs 性能对比 可行性分析 方案对比 对比结论 架构设计 卷和文件系统 元数据架构 文件系统快照 方案一:文件/目录级别快照 方案二:文件系统快照 关键点 元数据设计 数据结构 索引设计 文件空间管理 开发计划及安排 背景 块存储,向上提供块设备服务,CurveFS会基于此实现。第一阶段的目标是实现 满足数据库场景的文件接口。 调研 开源fs 当前对已有的开源分布式文件系统进行了调研,主要包括系统架构,元数据内存结构,元数据持久化,调研文档如下: chubaofs: ChubaoFS© XXX Page 3 of 14 1. 2. 3. moosefs: https://kms.netease list:list在通用文件系统中是很常见的操作,目前 curve 的元数据缓存使用的 lru cache,因此 list 只能依赖 etcd 的 range 获取方式。如果需要对 list 加速,需要新的缓存结构 c. 扩展性/可用性/可靠性 依赖于第三方kv存储,目前是etcd CurveFS 单机内存元数据设计 类似 fastcfs 和 moosefs 的元数据设计方式,采用通用的 dentry,inode0 码力 | 14 页 | 619.32 KB | 6 月前3
CurveFS对接S3方案设计修订人 修订内容 2021-05-20 胡遥 初稿 2021-07-20 胡遥 细化write和read流程 整体架构 整体思路 接口和关键数据结构 mds.proto client端数据结构 metaserver.proto space相关数据结构和proto 关键流程 init流程 write流程 read流程 整体架构 S3ClientAdaptor模块:负责将文件数据进行chu 每个block最大4M,每个block对应s3上一个object。 s3上对象已chunkid_indexblock_version进行命名,元数据则已S3ChunkInfo(见数据结构)的方式存储在inode中。对于文件顺序写场景,文件0~4M的s3对象必然为chunkid_0_0,4M~8M为chunkid_1_0,以此类推, 还有一种情况是文件先写了0~2M,然后在写2M~4 version进 行++,比如覆盖写了0~4M,则数据会写到chunkid_0_1的对象,则元数据包含了2个S3Chunkinfo{2,0,0,8M}和{2,1,0,4M}。 接口和关键数据结构 common.proto enum FSType { TYPE_VOLUME = 1; TYPE_S3 = 2; } message S3Info { required0 码力 | 11 页 | 145.77 KB | 6 月前3
Curve文件系统元数据持久化方案设计参考 前言 根据之前讨论的结果,元数据节点的架构如下图所示,这里涉及到两部分需要持久化/编码的内容: Raft Log:记录 operator log Raft Snapshot:将内存中的数据结构以特定格式 dump 到文件进行持久化© XXX Page 3 of 12 Raft Log +------+------------+-----+----------------+---------+----------+ vs 自己实现? 结论:从目前元数据持久化的需要来看,更倾向于自己实现,理由如下: redis 目前不支持单独持久化 redis 中的某个 DB (一个 redis 实例可包含多个 DB) 或数据结构,这对于在要使用 multiraft 的场景下,每个 raft 实例需要独立的快照并不合适 如果改造 redis,初步评估了下,其工作量要比自己实现持久化的逻辑要大一些,改造主要是为了让 redis 如果自己实现,只是一个简单的 sava/load 逻辑,比较清晰 redis 中有许多数据结构可供使用,如 (哈希、列表、set、sort_set),但对于目前的需求来说,我们内存数据结构使用的是 C++ STL 中的哈希表(unsorted_map),之后有可能根据需求换成 B+ 树或跳表,但是 redis 中的这些数据结构我们是不需要的 另外,如果 C++ 中的哈希表在后期使用中发现性能不达标的话(特别是在0 码力 | 12 页 | 384.47 KB | 6 月前3
curvefs client删除文件和目录功能设计方案设计 Trash机制: Session机制: 遗留问题 工作量评估 背景 目前curvefs client版本对删除unlink和rmdir的设计只有简单的删除inode和dentry结构,遗留了nlink和lookup count相关的内容还未实现,是不完备的。本文首先调研moosefs,chubaofs等分布式系统,参考并设计解决上述遗留问题。 当前删除接口代码如下:© XXX 就难以区分两者。© XXX Page 9 of 15 2. Trash放在哪里? Trash放在哪里的问题可能有以下几种方案: 第一种方案: Trash中只存放inode id, inode结构仍然在原地。由于inode放在原地, ,以便于扫描进程清理到期的inode。 那么需要实现类似freelist一样的东西来保存当前已经"被删"的inode id 由于inode放在原地,那么由于d 第二种方案: 将inode移动到隐藏的trash目录,这个trash目录可以是实际的目录结构,有dentry和inode,并遵循当前inode和dentry的放置方式(inode按照inodeid分布,dentry按照parentid分布) 这种方案的优点是便于工具对trash进行查询,毕竟是实际的目录结构,完全遵循文件系统,可能可以复用client的当前设计,甚至可以参考moosefs实现一个meta文件系统来管理,更为优雅。0 码力 | 15 页 | 325.42 KB | 6 月前3
Curve文件系统空间分配方案xtent数量可以大大减少,能够降低整个文件系统的元数据量。 对于延迟分配和Inline file这两个特性,需要fuse client端配合完成。 空间分配 整体设计 分配器包括两层结构: 第一层用bitmap进行表示,每个bit标识其所对应的一块空间(以4MiB为例,具体大小可配置)是否分配出去。 第二层为free extent list,表示每个已分配的块,哪些仍然是空闲的(offset (offset, length),以offset为key进行排序(这里可以用map或者btree对所有的free extent进行管理)。 当前设计不考虑持久化问题,空间分配器只作为内存结构,负责空间的分配与回收。在初始化时,扫描文件系统所有inode中已使用的空间。 空间分配流程 在新文件进行空间分配时,随机选择level1中标记为0的块,先预分配给这个文件,但是并不表示这个块被该文件独占。© DeallocateSpace(DeallocateSpaceRequest) returns (DeallocateSpaceResponse); } 空间分配器接口 空间分配器相关接口及部分数据结构定义如下: #include#include enum class AllocateType { NONE = 0, SMALL = 1, 0 码力 | 11 页 | 159.17 KB | 6 月前3
共 20 条
- 1
- 2













