CurveFS Copyset与FS对应关系
一台机器上能存放多少个inode和dentry 8.2 一台机器上建议的copyset数量 8.3 每个copyset建议管理存储容量的大小 1、背景 curvefs使用raft作为元数据一致性的保证。为了提高元数据的可扩展性和并发处理能力,采用元数据分片的方式管理inode和dentry的元数据。inode的分片依据是fsid + inodeid,dentry的分片依据是fsid + parentinodeid。借鉴curve块 创建dentry,去parent inodeid所在的meta partition进行创建就好了。 查找inode和partition的时候,通过inodeid去查询应该由哪个partition进行处理。inode是拿着inodeid查询,dentry是拿着parent的inode id去查询。© XXX Page 6 of 19 一个fs的meta partition使用第一个叫做MetaWrapper的结构体组织起来© 3、curvefs的copyset和fs的对应关系 curvefs的元数据的分片,需要考虑到在创建inode的时候,其实是不知道inodeid的,在创建完成之后,才有inodeid。inodeid的分配最好下放到各个分片去进行处理。否则整个集群的inode都去一个地方获取id会 造成巨大的锁开销,这个是不能接受的。 curve块设备的元数据管理,在分配数据的时候,offset一开始就是知道的,这是和curvefs分配很大的一个不同点。0 码力 | 19 页 | 383.29 KB | 5 月前3Curve核心组件之Client - 网易数帆
CLIENT主要功能 提供接口 数据面:AioWrite/AioRead、Write/Read 控制面:Create/Delete、Open/Close、Rename等 IO处理:转换、拆分、合并 元数据获取及缓存 逻辑chunk与物理chunk映射关系 物理chunk所属的复制组(copyset) 复制组所在的chunkserver列表 复制组的leader信息 请求会被拆分成两个子请求: ChunkIdx 1, off: 8M len 8M ChunkIdx 2, off: 0 len 8MCLIENT IO流程 子请求由哪个chunkserver处理,依赖以 下信息: 逻辑chunk与物理chunk映射关系 物理chunk所属的复制组(copyset) 复制组所在的chunkserver列表 复制组的leader信息CLIENT 复制组的leader信息 复制组之间通过raft维护 通过CliClient向Chunkserver获取 这两种信息client也会进行缓存 上报心跳CLIENT IO流程 子请求处理步骤: 1. 从MDS获取逻辑chunk与物理chunk的 对应关系(包含逻辑池以及复制组信息) 2. 从MDS获取复制组所在的机器列表 3. 从Chunkserver获取复制组leader信息0 码力 | 27 页 | 1.57 MB | 5 月前3Curve元数据节点高可用
Curve中MDS的选举过程 4.2 图示说明选举流程 4.2.1 正常流程 4.2.2 异常情况1:MDS1退出,可以正常处理 4.2.3 异常情况2:Etcd集群的leader发生重新选举,MDS1未受影响,可以正常处理 4.2.4 异常情况3:Etcd的leader发生重新选举,MDS1受到影响退出,不一定可以正常处理。 4.2.4.1 LeaseTIme < ElectionTime的情况 4.2.4.2 GetTimeout ElectionTime etcd集群leader失效,到重新选举出leader的耗时 ElectionTime > ElectionTimeout 4.2.2 异常情况1:MDS1退出,可以正常处理 MDS2收到leader/MDS1被删除的消息,Campaign成功,成为leader© XXX Page 20 of 30 2. mds2当选leader之后,同样与etcd server有三类交互: XXX Page 21 of 30 1. 2. 3. 1. 2. 1. 4.2.3 异常情况2:Etcd集群的leader发生重新选举,MDS1未受影响,可以正常处理 etcd集群异常,重新选举leader 但LeaseTime > ElectionTime 且 GetTimeout > ElectionTime 这种情况是常态,大概率情况ElectionT0 码力 | 30 页 | 2.42 MB | 5 月前3Curve文件系统空间分配方案
11 背景 本地文件系统空间分配相关特性 局部性 延迟分配/Allocate-on-flush Inline file/data 空间分配 整体设计 空间分配流程 特殊情况 空间回收 小文件处理 并发问题 文件系统扩容 接口设计 RPC接口 空间分配器接口 背景 根据 ,文件系统基于当前的块进行实现,所以需要设计基于块的空间分配器,用于分配并存储文件数据。 CurveFS方案设计(总体设计,只实现了部分) ,需要从level2中,随机或者选择可用空间 最大的extent分配出去。 文件申请空间时,之前预分配块的剩余空间被其他文件占用。此时,首先从level1查找一个可用的块,不满足要求时,按情况1进行处理。 file1再次追加写入数据时,会附带32MiB来申请空间。此时,从level1中查找32MiB对应的块标记是否为0,如果为0,则将这个块继续分配给file1。否则,可以从level1中随机选择一个可用的块进行分配© 文件释放了一小段空间,则尝试与level2中的extent进行合并。 如果合并之后是一个完整的块,则重新将level1中对应的bit置为0,同时删除该extent。 如果不能合并,则向level2中插入一个新的extent。 小文件处理 大量小文件的情况下,按照上述的分配策略,会导致level1的bitmap标记全为1,同时level2中也会有很多extent。 所以可以参考chubaofs,对大小文件区分不同的分配逻辑。同时0 码力 | 11 页 | 159.17 KB | 5 月前3Curve文件系统元数据管理
string name; }; 4.3 内存组织 inode和dentry的关系需要在内存中通过某种方式组织起来。 还需要额外考虑一下的hard link, symlink,rename的处理。 fastcfs的inode和dentry没有分开,两者在同一个结构体里面。这种方式如何应对硬链接? 看了下fastcfs的实现,在硬链接这里是有问题的。 考虑inode和dentry 久化的记录加载到内存里。实现把string转化为inode结构体,再插入内存结构中。 场景二:业务运行过程中,元数据的增删改查。 如果采用raft的方式对元数据持久化进行保证,所有元数据的处理都是先写WAL,再修改内存结构。那么任何对元数据的增删改查,对应着一条记录,根据记录去修改内存数据。 按照之前的讨论,curve文件系统的元数据管理采取先写log的方式。这里先不考虑log的组成形式。 的时候对元数据持久化。 对业务逻辑进行进一步抽象,忽略业务细节,会发现,元数据的内存管理需要提供这些功能。收到一条record,解析record,然后根据不同的opcode在内存对元数据进行处理。 伪码如下:© XXX Page 8 of 24 while (stop) { get and parse a record -> record switch (record->opcode)0 码力 | 24 页 | 204.67 KB | 5 月前3Open Flags 调研
/main open("in.txt", O_RDONLY|O_PATH) = 3 open flags 实现方式 cephfs处理方式是用Fh的结构体保存文件打开的状态和上下文信息,并不该Fh保存在Inode中,在后续读写等操作中依据该状态进行处理。 // cephfs Inode Fh.flags(cephfsFh struct Inode : RefCountedObject { &perms); ~Fh();© XXX Page 12 of 23 void get() { ++_ref; } int put() { return --_ref; } }; FastCFS处理方式是自定义FileInfo保存文件打开的状态信息,在create()、open()、opendir()操作时填充进 fuse_file_info结构中,在后续操作中直接使用: struct fuse_file_info 实现:direct_io功能实现由VFS层提供,fuse也进行了支持,用户态文件系统要支持该flag需要在open中对flag进行解析,填充进fuse_file_info→direct_io,通过 返回给内核处理。 fuse_reply_open(req, fi) // curvefs void curve_ll_open(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info0 码力 | 23 页 | 524.47 KB | 5 月前3CurveFS对接S3方案设计
个模块。该模块使用的AWS的sdk,并没有实现append接口 write流程 主要流程逻辑见上面的流程图,对流程补充有以下几点: 1.对于overlap的场景,会将inode中的versio+1,但是不会处理被overlap的相关数据,由后台进行处理。 2.如果是带了append flag则在writechunk的时候会调用s3的append接口追加写到同一个block object。 3.更新inode中s3元数据的时候, rlap的c hunks。 2.在将这些chunks按照offset进行大小进行排序,方便处理后面的read操作。 3.将read的offset,len和s3info可能交互的场景分别进行处理,分别获取要读取的每个S3ChunkInfo的offset len,封装到request中,具体可见代码的处理逻辑。 4.根据request进一步获取到s3 object去读取对象,将结果保存在response中。0 码力 | 11 页 | 145.77 KB | 5 月前3curvefs client删除文件和目录功能设计
sustained机制/reserve机制 当一个trashtime等于0的TYPE_FILE类型的文件被一个客户端正在打开,而同时有另一个客户端要删除它时,此时master对该文件节点的处理是并不立即删除该文件而是设置为TYPE_RESERVED类型并将该fsn ode连接到reserved链表中,使该文件虽然已经从文件树中删除掉,但因为另一个正在打开该文件的客户端因为持有该节点inodeid 以的。 我们的整个架构设计本身就类似chubao方式,这个方案本身是chubaofs的成熟方案,说明是已经被验证过是可行的方案。 缺点: 由于link、unlink等接口涉及跨服务器的两个请求的处理,可能会存在孤儿inode的问题,这一情况,chubaofs是通过运维手段去修复,见遗留问题。moosefs由于单mds,不存在这个问题。 方案设计思考 首先我们可以确定以下几个设计点: 但是缺点是DEL和UNDEL需 ,这部分处理会引入 。(这个过程其实类似于rename) 要在trash下创建和删除dentry 额外的复杂性 由于moose是单文件系统,对于我们实现多文件系统,这里还有两种方案: ,二是每个fs一个trash,并且trash不能放在fs的根目录下,因为存在跟用户的目录重名的问题。 一是使用全局唯一的trash 倾向于使用方案1,各方面实现上较为简单,异常处理不会很复杂,查询工具可以先实现一个简单的。0 码力 | 15 页 | 325.42 KB | 5 月前3CurveFS S3数据整理(合并碎片、清理冗余)
不是s3类型的inode退出 对于每一个s3类型的inode来说, 对每一个index内的chunkinfo按照chunkid升序排序. 对于一个chunk来说,chunkinfo数量大于20即进行处理 计算变更 - 记录整个chunk最大的chunkid - 读出一个chunk所有有效的部分(如果是最后一个chunk,需要注意不超出len),compaction+1,chunkid为上一步获取的chunkid,为需要新增的obj 可以在实际删除前检查当前整理的inode列表, 如果在列表里就暂时跳过(同步删除)/重新丢进删除队列(异步删除) 或者就不管, 处理一下报错, 让后续的应该会开发的数据清理工具来删除, 因为出现这个冲突的概率比较小 truncate: 只进行元数据里len的改变, 触发一下compact就行, shrink的部分compact会进行处理0 码力 | 3 页 | 101.58 KB | 5 月前3BRPC与UCX集成指南
EventDispatcher ●是socket事件分发的中心 ●使用epoll和边沿触发 ●提供监视一个fd是否可读写,并调用对应socket对象的成员函数1314 Socket 输入事件处理15 Socket options ●是创建socket的参数 ●主要成员: –fd 是socket文件句柄 –void (*on_edge_triggered_events)(Socket*) Listener 获得一个socket fd后,创建通讯Socket。 SocketOptions关键字段: fd, on_edge_triggered_events18 例子:Request输入处理19 Channel创建Socket20 Channel远程调用的发起21 UCX ●NVIDIA Mellanox 开源项目 ●支持RDMA,TCP,Shared memory等 ●能 ●连接以文件句柄表示46 UcpAcceptor ●连接接收器类 ●独占一个ucp_worker ●部分代码从brpc::Acceptor类拷贝 ●ucp部分重新设计47 UcpAcceptor ●处理收到的连接 SocketOptions options; –options.fd = get_or_create_ucp_cm()->Accept(conn_request);48 UcpConnection0 码力 | 66 页 | 16.29 MB | 5 月前3
共 19 条
- 1
- 2