CurveFS Copyset与FS对应关系string int bool string [] , peers []proto.Peer, err ) string error metanode是否能够创建copyset,由这个函数判断。有这些判断条件: 1、metaNode的存活状态 2、metaNode的内存使用情况 3、metaNode的磁盘使用情况© XXX Page 4 of 19 4、metaNode上的partition的个数0 码力 | 19 页 | 383.29 KB | 6 月前3
Curve元数据节点高可用期后key会被自动删掉。这在很多分布式锁的实现上都会用到,可以保证锁的实时性和有效性。CAS(Atomic Compare-and-Swap)指的是在对key进行赋值的时候,客户端需要提供一些条件,当这些条件满足后才能赋值成功。 3. etcd clientv3的concurrency介绍 3.1 etcd clientV3的concurrency模块构成© XXX Page 3 of 30 除的通知,Campagin都返回成功 : 这种情况下自身的key已经不在了,三个MDS都不应该成为leader。 在使用Campagin做选举的时候应该要注意,Campagin返回nil后要再次判断自身的key值是否还存在,如果存在才能认为竞选成功。 3.3 Observe的流程© XXX Page 15 of 30 1. 2. observe的功能在上面说过,主要用于监听leader的变化。0 码力 | 30 页 | 2.42 MB | 6 月前3
CurveFS S3本地缓存盘方案方案设计© XXX Page 3 of 9 S3模块接收到写入后先写入写内存缓存页,如果满足持久化的条件后,那么则准备持久化。 如果未配置本地硬盘作为写缓存,那么直接持久化到远端的对象存储;如果配置了本地硬盘作为写缓存,那么则尝试先写入本地硬盘写缓存目录。 写本地硬盘缓存目录之前先判断缓存目录容量是否已达到阈值,如果已经达到阈值,那么则直接写入到远端对象存储;否则,则写入到本地硬盘写缓存目0 码力 | 9 页 | 150.46 KB | 6 月前3
curvefs client删除文件和目录功能设计每删除一个hard link或指向的原文件时,nlink字段-1。© XXX Page 4 of 15 当nlink字段减到0时,才真正删除inode。所以在实现unlink接口或rmdir接口时,需要判断unlink字段的当前值,当nlink字段大于1时,只减nlink字段就可以了,当nlink字段减到0时,才真正的执行删除inode。 目录的nlink字段与文件的nlink字段不同, , 并且在目录下, e的移除,因为forget接口可能不会被内核调用(例如client崩溃) 相关调研 moosefs moosefs 未对接forget moosefs 实现了在mds上open,因此删除时可以判断文件是否被打开 moosefs使用了两种机制,来实现上述功能,分别是trash机制和reserve机制(最新版本叫sustained),两种机制如下: trash机制: 对于所有TYPE_FILE类型的文件在删除时, 到trash链表中表示该文件已经进入回收 若其trashtime大于0 站。 通过META文件系统来访问trash 通过trash机制,可实现文件的恢复UNDEL 回收站实现了一个timer,定期判断trashtime,执行定期清理回收站 清理时,当文件仍处于打开状态,则还需要进入下sustained/reserve中。 sustained机制/reserve机制 当一个trashti0 码力 | 15 页 | 325.42 KB | 6 月前3
Curve核心组件之snapshotclone保存完整的chunk数据,大小为一个 Chunk的大小,即16MB DataObject: • 打快照时读取当前目标卷的所有快照的全 部metaObject • 根据本快照的chunk映射表,判断当前的 快照chunk是否需要转储 增量转储原理:快照在CHUNKSERVER上的数据组织 快照chunk和普通chunk,都是 ChunkServer上的ext4文件系统中 的文件,称 chunk,并标记bitmap,这个过程称之为 PasteChunk 读时复制原理:CHUNKSERVER端克隆实现-读时复制实现 • 判断是非clone chunk 或者读取的区域已经被拷贝过 (根据bitmap) • 那么,直接读取 需要从源chunk读取: • 判断是Clone Chunk且需要读取的区域还未被拷贝过 • 那么,生成CloneTask,交给CloneManager • Read0 码力 | 23 页 | 1.32 MB | 6 月前3
Open Flags 调研整体flags支持方案 目前倾向于使用类似fastcfs的方式,自定义结构FileHandle,在create()、open()、opendir()时将上下文信息保存到fuse_file_info中,在后续文件操作时判断相关flags进行具体操作。简单的FileHandle如下 : struct FileHandle { int flags; int mod; uint64_t pos; Inode 齐的校 验在VFS do_blockdev_direct_IO中实现,各文件系统根据自己direct_io的实现调用该函数,例如ext4就进行了调用,如果需要做对齐处理可能需要在用户态文件系统中做判断。© XXX Page 20 of 23 // root@pubbeta1-nostest2:/tmp# strace ./main ... open("in.txt", O_RDWR|O_CREAT|O_DIRECT fi->direct_io = 0 O_SYNC, O_DSYNC 同步I/O:强制刷新内核缓冲区到输出文件© XXX Page 21 of 23 对chubaofs和cephfs代码调研中发现在write中判断如果是直接IO则调用flush操作,但是对具体flush内容主要是对文件系统自己缓存的内容进行刷盘,没有发现对应内核缓冲区flush的相关设置或调用等。© XXX Page 22 of 23 //0 码力 | 23 页 | 524.47 KB | 6 月前3
CurveFS Client 概要设计从缓存中查找到对应inode结构; 如果inode缓存中不存在对应的inode,则从mds获取inode所在copyset,metaserver ip等信息,然后从metaserver获取inode结构,缓存之; 判断inode结构中,对应请求[off, size]位置的空间是否有分配:如果未分配或只有部分分配空间,则调用空间分配器分配空间,并根据空间分配器返回结果,修改inode结构(包括file length); O_DIRECT 直接IO open的主要逻辑: 根据inode id,从mds获取inode所在copyset,metaserver ip等信息,然后从metaserver获取inode结构,缓存之; 判断上述各种oflag,执行相应的操作。( ) 对于目前阶段来说,open可以什么都不做 create & mknod void (*create) (fuse_req_t req, fuse_ino_t0 码力 | 11 页 | 487.92 KB | 6 月前3
CurveFS ChunkID持久化bundle 内最后一个可分配的chunkID bundleSize_;// chunkId池子的大小 };© XXX Page 3 of 3 1. 2. 问题与风险 构造函数内判断 storeKey_ 不存在时,会从0开始分配,可能会出现覆盖chunkid的情况; chunkID用完情况没有考虑;0 码力 | 3 页 | 79.38 KB | 6 月前3
BRPC与UCX集成指南●UcpCm返回的文件句柄实际上是pipe的写端句柄 ●记得brpc的event dispatcher是边沿触发 ●写端句柄永远不会触发可读事件 ●写端句柄第一次epoll会返回可写,可写是brpc判断连接成功的措施 ●UcpCm从来不会写入pipe,如果pipe有可读字节,会打印错误,说明有地方遗漏了修 改。 ●Socket通过关闭UcpCm返回的句柄来关闭连接。此举和Socket原来代码一样,减少了修0 码力 | 66 页 | 16.29 MB | 6 月前3
Curve核心组件之mds – 网易数帆HEDULE Schdedule的具体实现 Coordinator: 调度模块的对外接口。心跳会将 chunkserver上报上来的copyset信息提交给 Coordinator,内部根据该信息判断当前copyset是否 有配置变更任务执行,如果有任务则下发。 任务计算: 任务计算模块包含了多个定时任务 和 触 发任务。 • 定时任务由调度模块定时触发。 • 触发任务由外部触发,管理员通过工具触发。0 码力 | 23 页 | 1.74 MB | 6 月前3
共 11 条
- 1
- 2













