curvefs client删除文件和目录功能设计类型的文件被一个客户端正在打开,而同时有另一个客户端要删除它时,此时master对该文件节点的处理是并不立即删除该文件而是设置为TYPE_RESERVED类型并将该fsn ode连接到reserved链表中,使该文件虽然已经从文件树中删除掉,但因为另一个正在打开该文件的客户端因为持有该节点inodeid,所以不影响它对该文件的读写操作,当所有客户端都关闭该文件后,该文 件节点才会从 被清除。 reserve reserve 使用了session机制,记录client端的open状态 通过META文件系统访问reserve 使用CUTOMA_FUSE_RESERVED_INODES消息保持和释放inode 实现了Timer,定期判断是否还有session,如果没有client打开,则进行清理。 优点: 通过meta文件系统来管理trash,更为优雅。© XXX Page 8 of 15 1. freelist会被定期清理,清理时筛选出超过7天的inodeid,将其从inode tree和free list中移除。 chubaofs中实现了forget接口:首先client端,在删除inode时,如果判断到nlink减到0,则加入client端维护 。forget接口执行时,判断inode是否在 中,如果在Orpha 的OrphanInodeList OrphanInodeList nInodeList0 码力 | 15 页 | 325.42 KB | 6 月前3
BRPC与UCX集成指南socket代码不少地方需要文件句柄表示连接,使用句柄可以减少代码修改。例如 SocketOptions.fd为-1表示尚未连接。 ●UcpCm返回的文件句柄实际上是pipe的写端句柄 ●记得brpc的event dispatcher是边沿触发 ●写端句柄永远不会触发可读事件 ●写端句柄第一次epoll会返回可写,可写是brpc判断连接成功的措施 ●UcpCm从来不会写入pipe,如果pipe有可读字节,会打印错误,说明有地方遗漏了修 地方遗漏了修 改。 ●Socket通过关闭UcpCm返回的句柄来关闭连接。此举和Socket原来代码一样,减少了修 改。UcpCm检测到pipe读端可读,关闭UcpConnection。 ●以上修改实际上绕过了BRPC的Event dispatcher触发读写机制,UCX自己完成发送接收45 连接管理器UcpCm ●连接管理类 –全局唯一对象 –通过UcpCm * get_or_create_ucp_cm(void)获取 poll的时长 –--brpc_ucp_deliver_out_of_order为true,接收端乱序提交 –--brpc_ucp_close_flush,release connection时发送未未完成的报文,不是必须的,因为 brpc通常是需要接收应答的,服务器端一般不主动关闭连接,客户端主动关闭,自己负 责是否有未接收完的应答。56 修改BRPC的EndPoint ●原始的EndP0 码力 | 66 页 | 16.29 MB | 6 月前3
Curve核心组件之snapshotclone克隆的实现CURVE基本架构 • 元数据节点 MDS • 管理和存储元数据信息 • 感知集群状态,合理调度 • 数据节点 Chunkserver • 数据存储 • 副本一致性,raft • 客户端 Client • 对元数据增删改查 • 对数据增删改查 • 快照克隆服务器 • 快照 • 克隆快照和克隆的特点 • 快照的定义 快照是云盘数据在某个时刻完整的只读拷贝,是一种便捷高效的数据容灾手段, ChunkFile。CHUNKSERVER端快照实现-SNAPFILE 字段 类型 说明 version uint8_t 文件格式协议 版本号 demaged bool 损坏标记 sn uint64_t 快照版本号 bits uint32_t 位图的位数 bitmap char[] 位图 crc uint32_t 上述字段的crc 校验码 padding / 填0,以补足 4KBCHUNKSERVER端快照实现-写时复制原理 复制时仅复制元数据,并增加版本号 写入时,先复制要写入的数据块,然后再写入CHUNKSERVER端快照实现-写时复制 使用copy-on-write 当前写请求的sn > chunk的cur_sn时触发复制 拷贝的单位是一个Page,即4KB 使用snapfile中的bitmap标记复制过的PageCHUNKSERVER端快照实现-转储内部快照 a) 打快照后未写过,未触发cow, 无snap0 码力 | 23 页 | 1.32 MB | 6 月前3
CurveFS Copyset与FS对应关系6、详细设计 6.1 创建fs 6.2、挂载fs 6.3、创建文件/目录 6.4、open流程 6.5、读写流程 6.6、topology 7、工作评估 7.1 client端 7.2 mds端 7.3 metaserver端 metaserver 子模块拆分 8、inode和dentry的内存估算 8.1 一台机器上能存放多少个inode和dentry 8.2 一台机器上建议的copyset数量 分配copyset方式,并不适合curvefs的元数据。这种分配方式是提前分配了一批空间,即使用户只需要写4KB数据,也一次性分配1GB的空间。而curvefs的元数据,并不能一次申请一批在client端,而是每次都需 要去metaserver上去进行分配。 这里需要重新考虑curvefs的copyset和fs的元数据分片的对应关系。© XXX Page 3 of 19 2、chubaofs的元数据管理 Page 15 of 19 6.5、读写流程 读写流程和之前的读写流程大致保持不变。变化点在于之前inode修改是直接去metaserver上修改,现在变成了去copyset上修改。 client端缓存所有open的inode,读写的时候,根据inode的元数据,去对应的volume或者S3进行读写。如果涉及到inode的修改,根据inodeId查询对应的copyset,去对应的copyset进行inode的更新。0 码力 | 19 页 | 383.29 KB | 6 月前3
Curve核心组件之mds – 网易数帆02 03 MDS各组件详细介绍 Q&A基本架构 • 元数据节点 MDS 管理元数据信息 收集集群状态信息,自动调度 • 数据节点 Chunkserver 数据存储 副本一致性 • 客户端 Client 对元数据增删改查 对数据增删改查 • 快照克隆服务器MDS各个组件 MDS是中心节点,负责元数据管理、集群状态收集与调度。MDS包含以下几个部分: • Topology: 管理集群的 检测chunkserver的copyset与mds差异,同 步两者的copyset信息 • 支持配置变更功能,在心跳回复报文中下发mds发起的配置变更命令,并在后续心跳中获取配置 变更进度。HEARTBEAT MDS端:mds 端的心跳主要由三个部分组成: • TopoUpdater: 根据 chunkserver 上报的 copyset 信息更新拓扑 中的信息。 • ConfGenerator: 将当前上报的 copyset • HealthyChecker: 检查集群中的 chunkserver 在当前时间点距 离上一次心跳的时间,根据这个时间差更新chunkserver状态。 Chunkserver端:chunkserver 端的心跳由两个部分组成: • ChunkServerInfo/CopySetInfo: 获取当前 chunkserver 上的 copyset 信息上报给 MDS。 • Order ConfigChange:0 码力 | 23 页 | 1.74 MB | 6 月前3
CurveFS S3数据整理(合并碎片、清理冗余)2. 3. 1. 2. 3. 4. 5. 6. 1. 2. 背景 只考虑单客户端, 单metaserver 为了解决的问题: 客户端在对一个文件的某个部分多次写入后, 同一个chunk会产生很多版本数据; 而客户端在读的时候, 会需要对这些chunk进行筛选和构建, 得到有效的部分, 越是散乱的状态, 就越需要发送更多次读请求至s3. 最后导致无效旧数据的堆积和读请求性能的下降 2. 1. 2. 1. 2. 需要进行一个merge的步骤 在做变更时如果有其他op可能会产生的冲突: 读: 在执行变更删除原来的s3 object时, 执行读的客户端的缓存可能还是原有的chunkinfolist, 可能会去读已经删除的object, 这种时候读会失败 可以使用双重保证 读失败的时候retry, 或许可以重拉metadata 整理后, mds在0 码力 | 3 页 | 101.58 KB | 6 月前3
CurveFS S3本地缓存盘方案© XXX Page 1 of 9 Curvefs-S3 本地写缓存盘方案© XXX Page 2 of 9 背景 方案设计 主要数据结构定义 方案设计思考 POC验证 背景 当前,s3客户端在写底层存储的时候是直接写入远端对象存储,由于写远端时延相对会较高,所以为了提升性能,引入了写本地缓存盘方案。也即要写底层存储时,先把数据写到本地缓存硬盘,然后再把本地缓存 硬盘中的数据异步上传到远端对象存储。 到远端对象存储集群,上传成功后,删除本地写缓存目录中的对应文件。 同时,缓存清理模块会定时检查本地硬盘缓存目录容量情况,如果容量已经达到阈值了,则进行文件的清理工作。 另外,异常管理模块处理客户端挂掉后的文件重新上传问题。 主要数据结构定义 class DiskCacheManagerImpl : public DiskCacheManager{ public: DiskCacheManagerImpl(); 遍历工作队列(队列swap),从缓存盘目录读取到文件内容并上传到对象存储。文件上传到对象存储后,直接删除。 工作队列做好互斥管理 异常管理 如果客户端挂掉,那么写缓存盘中可能会有残留文件没有上传到对象存储;如果忘记处理,那么这些数据也就相当于是丢失了。 所以在客户端初始化建立的时候,可以先遍历写缓存目录,如果里面有文件,那么则上传到远端对象存储 POC验证© XXX Page 9 of 9 Cach0 码力 | 9 页 | 150.46 KB | 6 月前3
新一代云原生分布式存储主动拷贝、链式复制、splay复制 异常处理 • PG有23种状态:Peering,Degraded等 • 强一致性协议对异常的容忍较差 使用WARO一致性协议 • 所有副本写完成返回客户端 • 延迟取决于所有副本中最慢的那一个块存储场景 为云主机提供云盘,云盘提供随机读写、快照(数据备份,灾备使用)、镜像(模板,自定义)功能。块存储场景 为物理机提供块设备 Linux IO栈 主动拷贝,由 leader 向 follower 并发拷贝 异常处理 • 自动leader选举 • 2N+1 副本数可以容忍 N 副本数异常 Quorum一致性协议 • 大多数副本写完成返回客户端 • 延迟取决于所有副本中最快的大多数主要亮点 高性能 更稳定 跟各 更稳定 具备可视化的开发页面, 直观查看任务运行情况, 数据开发方便,系统运 维方便 易运维 具备可视化的开发页面, 块存储场景,Curve随机读写性能远优于Ceph 单卷 多卷主要亮点 — 易运维 运维场景 Curve Ceph 加盘 对IO无影响 秒级io影响 服务端升级 对IO无影响 重启管控面IO无影响,重启osd io秒级影响 客户端升级 热升级,秒级抖动 不支持热升级,需要业务停服 集群监控 丰富的metric metric类型较少主要亮点 — 更稳定 异常场景 Curve Ceph 坏盘0 码力 | 29 页 | 2.46 MB | 6 月前3
CurveFS Client 概要设计接口设计 Cache设计 时间 作者 内容 2021-04-27 许超杰 初稿 背景 CurveFS初步设计见 , 目前需细化Client端设计 CurveFS方案设计(总体设计,只实现了部分) 概述 CurveFS client 向上提供两层接口,分别是© XXX Page 3 of 11 对接fuse,提供通用文件系统接口。对于 ock),块分配器(bitmap)和root inode所在的copyset、 metaserver ip等信息 去metaserver获取文件系统信息(super block),缓存到client端。 destroy void (*destroy) (void *userdata); 清理init缓存的文件系统信息。 lookup void (*lookup) (fuse_req_t req xattr系列接口,chubaofs都没实现,目前先不考虑 fuse高版本新增的接口如lseek等,在低版本中没有,因此不是必须接口,也先不实现。 功能分析 根据上述接口的分析,可以把client端的功能进行汇总,client需实现的功能主要有: 缓存文件系统元数据(包括super block, bitmap & allocator等) 缓存文件和目录信息(包括inode struct,dentry0 码力 | 11 页 | 487.92 KB | 6 月前3
TGT服务器的优化修复损坏的副本,并且可扩容。无论在可靠性、稳定性还是性价比方面都很有优势, 使用廉价硬件搭建。iSCSI软件 • Client端: iscsi initiator,系统自带 • Linux open-iscsi • Windows iSCSI 发起者 • 服务器端 • 必须是CurveBS原生支持的平台,因为需要curve原生接口,目前是LinuxiSCSI target服务器 • LINUX 的性能问题 • 性能问题主要体现在不能有效使用多CPU • 对多个socket connection,在单线程里做event loop多路复用。 • 多个target时,如果挂的设备多,一旦客户端请求量大,就会忙不过来。 • 开源界有尝试修改 • 例如sheepdog的开发者提交过一个patch,但是测试效果不理想,分析 原因,event loop依然是瓶颈对TGT的性能优化 • IO是使用多个epoll0 码力 | 15 页 | 637.11 KB | 6 月前3
共 24 条
- 1
- 2
- 3













