Raft在Curve存储中的工程实践raft 是一种新型易于理解的分布式一致性复制协议,由斯坦福大学的Diego Ongaro和John Ousterhout提出,《In Search of an Understandable Consensus Algorithm(Extended Version)》 • raft 是一种Leader-Based的Multi-Paxos变种,提供了更完整更清晰的协议描述,更容易理解和实现。 • r erver的 处理能力,对磁盘造成很大压力,影响正常IO。 解决思路: chunk支持覆盖写,覆盖写天然是幂等的,写一次和写多次结果一致。 打快照只记录chunk文件的列表,不拷贝chunk的内容。从快照+日志加载数据时,下载的chunk文 件不是打快照的状态,而是最新的状态,回放日志时,把数据重写一遍。Curve对RAFT的优化 优化点二: chunkfile pool 问题背景:0 码力 | 29 页 | 2.20 MB | 6 月前3
Curve核心组件之mds – 网易数帆。在大规模的存储容量下,会产生大量的Chunk,如此众多的 Chunk,会对元数据的存储、管理产生一定压力。因此引入CopySet的概念,CopySet类似于ceph的pg。CopySet 可以理解为一组复制组,这组复制组的成员关系完全一样。CopySet的概念在文献「Copysets: Reducing the Frequency of Data Loss in Cloud Storage」提出。0 码力 | 23 页 | 1.74 MB | 6 月前3
CurveFS S3本地缓存盘方案9 }; 方案设计思考 本地硬盘如何管理 借用linux本地文件系统进行管理,存储进本地硬盘的内容以文件的形式来表现。 配置一个目录用于本地硬盘的文件管理,对作为缓存盘的本地硬盘进行格式化并挂载到该目录(如果没有缓存盘,那一般而言就是系统盘本身了)。 本地缓存盘的文件内容表示 本地缓存盘存放的文件即是存储到对象存储中的对象。 写缓存如何作为读缓存利用 除了写缓存目录,另外引 文件的读缓存还是存在的。 缓存盘空间管理 当缓存文件内容达到阈值时,停止向本地缓存盘写入。 同时,缓存清理模块会定时检查本地硬盘缓存目录容量情况,如果容量已经达到阈值了,则进行文件的清理工作。 本地缓存盘的异步上传 工作队列: 该队列中保存缓存盘中的待上传文件名 工作线程: 遍历工作队列(队列swap),从缓存盘目录读取到文件内容并上传到对象存储。文件上传到对象存储后,直接删除。 工作队列做好互斥管理0 码力 | 9 页 | 150.46 KB | 6 月前3
Curve文件系统元数据持久化方案设计muliraft 存在的问题? redis 改造 vs 自己实现? redis 中哈希表实现的优点? 参考 前言 根据之前讨论的结果,元数据节点的架构如下图所示,这里涉及到两部分需要持久化/编码的内容: Raft Log:记录 operator log Raft Snapshot:将内存中的数据结构以特定格式 dump 到文件进行持久化© XXX Page 3 of 12 Raft Log 向后兼容加载旧版持久化文件) size 8 键值对数量 key_value_pairs / 键值对(当 size 为 0 时,该字段为空) EOF 1 特殊标记常量 (0XFF),表示内容已结束 check_sum 8 保存校验和 (根据前 5 个部分内容计算得出) key_value_pairs 字段 字节数 说明 key_length 4 key 的长度 key $key_length 保存编码后的 key // ``` (1) 命令追加: 将写命令追加到 AOF 缓冲区 server.aof_buf (详见: aof.c/feedAppendOnlyFile) (2) 文件写入: 将 AOF 缓冲区的内容以 append 方式写入文件 (详见: aof.c/flushAppendOnlyFile) (3) 文件同步: 根据 appendfsync 配置选项决定文件同步频率, 该步骤与步骤 2 紧密关联0 码力 | 12 页 | 384.47 KB | 6 月前3
curvefs client删除文件和目录功能设计遗留问题 工作量评估 背景 目前curvefs client版本对删除unlink和rmdir的设计只有简单的删除inode和dentry结构,遗留了nlink和lookup count相关的内容还未实现,是不完备的。本文首先调研moosefs,chubaofs等分布式系统,参考并设计解决上述遗留问题。 当前删除接口代码如下:© XXX Page 3 of 15 CURVEFS_ERROR 指的是文件的访问计数。当文件/目录被打开时, ,该文件/目录仍然可以被打开的进程访问,不会造成崩溃或报错,我们的curvefs也需要实现 即使文件/目录已经被另一个进程删除了(nlink==0) 这样的语义。 这部分内容在fuse的相关接口中也有描述如下: /** * Forget about an inode * * This function is called when the kernel 3. 1. */ void (*rmdir) (fuse_req_t req, fuse_ino_t parent, const char *name); 其中的注释内容总结如下: 当lookup count在fuse_reply_entry和fuse_reply_create时增加1 当内核移除其inode cache时,会调用forget,此时lookup c0 码力 | 15 页 | 325.42 KB | 6 月前3
CurveFS Copyset与FS对应关系© XXX Page 1 of 19 curvefs copyset与fs对应关系© XXX Page 2 of 19 版本 时间 修改者 修改内容 1.0 2021/7/23 陈威 初稿 1.1 2021/8/4 陈威 根据评审意见修改 1.2 2021/8/9 陈威 增加详细设计 1、背景 2、chubaofs的元数据管理 2.1、meta partition的创建 2.2、meta curve块存储的topo信息由PhysicalPool、LogicalPool、Zone、Server、ChunkServer、CopySetInfo组成。curvefs可以照搬curve块存储的topo设计,只是保存的内容从数据变成了元数据。 curvefs的topo信息设计可以由PhysicalPool、LogicalPool、Zone、Server、MetaServer、CopySetInfo组成。 curv 需要定期通过心跳向mds上报自己的状态。mds一方面根据metaserver上报的状态,进行相应的调度;另一方面根据心跳确认metasever 的存活状态。 这块内容参考的curve。metaserver定时向mds上报心跳,心跳内容参考curve。调度上,如果采用类似chubaofs的方案,那么copyset就会一直处于一个不均衡的状态中。如果copyset是可readwrite状态,新创建的0 码力 | 19 页 | 383.29 KB | 6 月前3
Open Flags 调研flags; int mod; uint64_t pos; Inode *inode; } 具体flag的实现方案 O_TRUNC 需要实现file_truncate接口,接口中对目标文件进行内容删除,length置0。© XXX Page 16 of 23 # root@pubbeta1-nostest2:/tmp/fsmount# echo "1111111111111111" > f open() 系统调用打开文件时,如果不指定 O_DIRECT 标志,那么就是使用缓存I/O来对文件进行读写操作。系统缓存位于VFS和真实文件系统之间,当虚拟文件系统读文件时,首先从缓存中查找要读取的文件内容是否存在缓存中,如果存在就直接从缓存中读取。对文 件进行写操作时也一样,首先写入到缓存中,然后由操作系统同步到块设备(如磁盘)中。对于通用块设备层来说要求io请求是块设备blocksize对齐的,对应buffered 同步I/O:强制刷新内核缓冲区到输出文件© XXX Page 21 of 23 对chubaofs和cephfs代码调研中发现在write中判断如果是直接IO则调用flush操作,但是对具体flush内容主要是对文件系统自己缓存的内容进行刷盘,没有发现对应内核缓冲区flush的相关设置或调用等。© XXX Page 22 of 23 // chubaofs writeflush func cfs_write(id0 码力 | 23 页 | 524.47 KB | 6 月前3
NJSD eBPF 技术文档 - 0924版本GETATTR 返回fstat • READ inode 读取的内容不等从16KB到128KB • 关闭⽂件时会发送FLUSH请求和RELEASE请求 • 场景2 解压压缩包场景 • LOOKUP inode 没有该inode • CREATE创建⽂件句柄并返回fstat + timeout设置 • WRITE 写⼊内容从0~16KB不等 • SETATTR inode 根据U0 码力 | 20 页 | 7.40 MB | 6 月前3
Curve质量监控与运维 - 网易数帆功能或 性能影响较大的功能,还需要进行POC验证;评审和验证通过后才能启动开发 工作。 小需求 实现思路 开发 大需求 设计文档 POC 开发 7/33设计文档规范 设计文档需要具备以下内容: 修订记录 审批记录 系统介绍 相关调研 架构 重要流程 关键算法 接口 数据库设计 非功能特性设计 参考文献 8/33代码编写规范 单元测试是软件开发的过程中最基本的测试,它用来对一个模块、一个函数或者一个类来进行 正确性检验的测试工作。 curve通过lcov统计代码覆盖率,衡量单元测试的完备程度,如下图所示: 13/33集成测试 测试目的 测试内容 单元测试后,有必要进行集成测试,发现 并排除在模块连接中可能发生的上述问题, 最终构成要求的软件子系统或系统。集成 测试需要关注的主要是各模块连接起来后 的问题: 穿越模块接口的数据是否会丢失;0 码力 | 33 页 | 2.64 MB | 6 月前3
CurveFs 用户权限系统调研... } 如何存储和获取ACL信息 ACL 是物理文件系统的一个属性,需要永久保存。如何将 ACL 保存在外存中,包括 ACL 在外存中具体存放的位置,以及如何从外存中读取和写入原始 ACL 内容。涉及到 VFS 和具体的物理文件系统,这里以Ext4文件系统为例说明。© XXX Page 28 of 33 在 Linux 操作系统中,如果libattr 功能在内核设置中被打开, ext2 、 的数据所表示。其中名字必须为一个 字符串 ,并且必须有一个 命名空间 前缀标识符与一个点字符。目前存在有四种命名空间:用户命名空间、信任命名空间、安全命名空间以及系统命名空间。用户命名空间在命名或者内容上没有任何限制。系统命名空间主要被内核用于访问控制表上 。目前Linux 的 ACL 存储实现就是基于这种扩展属性的。 Inode Table中保存有若干个 Ext4_inode ,每个 Inode0 码力 | 33 页 | 732.13 KB | 6 月前3
共 16 条
- 1
- 2













