Curve支持S3 数据缓存方案
© XXX Page 1 of 9 Curve支持S3 数据缓存方案© XXX Page 2 of 9 版本 时间 修改者 修改内容 1.0 2021/8/18 胡遥 初稿 背景 整体设计 元数据采用2层索引 对象名设计 读写缓存分离 缓存层级 对外接口 后台刷数据线程 本地磁盘缓存 关键数据结构 详细设计 Write流程 Read流程 ReleaseCache流程 3操作过多 2.对于4k 小io每次都要和s3交互,导致性能非常差。 因此需要通过Cache模块解决以上2个问题。 整体设计 整个dataCache的设计思路,在写场景下能将数据尽可能的合并后flush到s3上,在读场景上,能够预读1个block大小,减少顺序读对于底层s3的访问频次。从这个思路上该缓存方案主要针对的场景是顺序写和顺序 读,而对于随机写和随机读来说也会有一定性能提升,但效果可能不会太好。 的目的是为了后续从对象存储上遍历,反查文件,这里就要求inodeId是永远不可重复。 读写缓存分离 读写缓存的设计采用的是读写缓存分离的方案。 写缓存一旦flush即释放,读缓存采用可设置的策略进行淘汰(默认LRU),对于小io进行block级别的预读。 即读写缓存相互没影响不相关, 缓存层级 缓存层级分为fs->file->chunk->datacache 4层,通过inodeId找到f0 码力 | 9 页 | 179.72 KB | 5 月前3CurveFS S3本地缓存盘方案
Page 1 of 9 Curvefs-S3 本地写缓存盘方案© XXX Page 2 of 9 背景 方案设计 主要数据结构定义 方案设计思考 POC验证 背景 当前,s3客户端在写底层存储的时候是直接写入远端对象存储,由于写远端时延相对会较高,所以为了提升性能,引入了写本地缓存盘方案。也即要写底层存储时,先把数据写到本地缓存硬盘,然后再把本地缓存 硬盘中的数据异步上传到远端对象存储。 方案设计© S3模块接收到写入后先写入写内存缓存页,如果满足持久化的条件后,那么则准备持久化。 如果未配置本地硬盘作为写缓存,那么直接持久化到远端的对象存储;如果配置了本地硬盘作为写缓存,那么则尝试先写入本地硬盘写缓存目录。 写本地硬盘缓存目录之前先判断缓存目录容量是否已达到阈值,如果已经达到阈值,那么则直接写入到远端对象存储;否则,则写入到本地硬盘写缓存目录中。文件写入本地硬盘写缓存目录后,从本地硬盘读目录© 4 of 9 做一个硬链接链接到该文件。 本次io在本地硬盘写入好之后,异步上传模块会适时把本地硬盘写缓存目录中的文件上传到远端对象存储集群,上传成功后,删除本地写缓存目录中的对应文件。 同时,缓存清理模块会定时检查本地硬盘缓存目录容量情况,如果容量已经达到阈值了,则进行文件的清理工作。 另外,异常管理模块处理客户端挂掉后的文件重新上传问题。 主要数据结构定义 class DiskCacheManagerImpl0 码力 | 9 页 | 150.46 KB | 5 月前3CurveFS Client 概要设计
rmdir opendir readdir getattr & setattr access rename symlink & readlink link flush & fsync 其他 功能分析 模块划分 接口设计 Cache设计 时间 作者 内容 2021-04-27 许超杰 初稿 背景 CurveFS初步设计见 , 目前需细化Client端设计 block),缓存到client端。 destroy void (*destroy) (void *userdata); 清理init缓存的文件系统信息。 lookup void (*lookup) (fuse_req_t req, fuse_ino_t parent, const char *name); 根据parent inode id和name从denty缓存中找到对应的denty结构; nty结构; 如果dentry缓存中不存在对应的inode,则从mds根据parent inode id获取parent inode 所在copyset,metaserver ip等信息 ,然后从metaserver获取denty(这里有两种方式,一种是只获取当前需要的 denty,一种是list整个目录的denty,这个需要考虑用哪个接口) 根据找到的denty结构,获取inodeid,设置0 码力 | 11 页 | 487.92 KB | 5 月前3CurveFS Copyset与FS对应关系
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数量 8.3 每个copyset建议管理存储容量的大小 思路二:client在创建inode的时候,自己选择一个分片,然后由这个分片自己分配一个inode。采用这种思路,在create fs的时候,就为fs准备好的几个copyset,然后client把copyset缓存在本地。每个copyset管理一段inode。选定copyset,就选定了服务的3个metaserver。至于均衡上,创建inode的时候,轮流在这个fs的copyset 上进行创建。这种方式肯定不 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 | 5 月前3Curve核心组件之Client - 网易数帆
FileInstance:对应一个已挂载的卷 LeaseExecutor:负责定期与MDS通信,获取卷的元数据信息 元数据信息在打快照时会进行变化 MetaCache:元数据缓存 IOTracker:跟踪一个上层IO请求 IOSplitor:IO转换拆分 ChunkClient、CliClient:与Chunkserver进行通信 前者负责IO请求 向cinder/glance提供了Python API https://github.com/opencurve/curve-qemu-block-driver NBD: 实现了Curve-NBD,与内核NBD模块进行交互 可以作为容器的数据存储 CSI插件也已经开源: https://github.com/opencurve/curve-csi CLIENT上层应用CLIENT虚拟块设备CLIENT主要功能 数据面:AioWrite/AioRead、Write/Read 控制面:Create/Delete、Open/Close、Rename等 IO处理:转换、拆分、合并 元数据获取及缓存 逻辑chunk与物理chunk映射关系 物理chunk所属的复制组(copyset) 复制组所在的chunkserver列表 复制组的leader信息 Failover支持0 码力 | 27 页 | 1.57 MB | 5 月前3TiDB中文技术文档
是无状态的,其本身并不存储数据,只负责计算,可以无限水平扩展,可以通过负载均衡组件(如 LVS、HAProxy 或 F5)对外提供统一的接入地址。 Placement Driver (简称 PD) 是整个集群的管理模块,其主要工作有三个: 一是存储集群的元信息(某个 Key 存储在哪个 TiKV 节点);二是对 TiKV 集群进行调度和负载均衡(如数据的迁移、Raft group leader 的迁 移等);三是分配全局唯一且递增的事务 是无状态的,其本身并不存储数据,只负责计算,可以无限水平扩展,可以通过负载均衡组件(如 LVS、HAProxy 或 F5)对外提供统一的接入地址。 Placement Driver (简称 PD) 是整个集群的管理模块,其主要工作有三个: 一是存储集群的元信息(某个 Key 存储在哪个 TiKV 节点);二是对 TiKV 集群进行调度和负载均衡(如数据的迁移、Raft group leader 的迁 移等);三是分配全局唯一且递增的事务 场景提供一站式的解决方案。 本指南为您介绍如何使用 TiDB-Ansible 快速部署一个 TiDB 集群,并了解 TiDB 的基本操作和管理。 本节具体介绍如何部署一个 TiDB 集群。一个 TiDB 集群由不同的模块组成,包括:TiDB 服务器、TiKV 服务 器、Placement Driver (PD) 服务器。 架构图如下所示: 参考 TiDB Ansible 部署方案。 本节具体介绍 TiDB 中基本的增删改查操作。0 码力 | 444 页 | 4.89 MB | 5 月前3大规模微服务架构下的Service Mesh探索之路
需要请求同步阻塞等待的功能都应该在 Sidecar中完成 • 远程调用带来的性能开销代价太高 • 其他尽量优化为异步或者批量Istio的解决方案:添加Mixer Cache ü 缓存的工作方式: • Sidecar 中包含本地缓存,一部分的前置 检查可以通过缓存来进行 • 另外,Sidecar 会把待发送的Report数据 进行缓冲,这样可能在多次请求之后才调 用一次 Mixer • 前置检查和配额是同步的 • 实现跨注册中心的服务调用 ü 支持异构 • 实现方式不同的注册中心 • 向Service Mesh的过渡 • 两个非Service Mesh的打通 ü 终极形态 • 跨集群 + 异构同时支持 • 配合其他模块实现更灵活的服务间通讯 增强版Pilot:梦幻级服务注册和治理中心 服务 治理 中心 服务注册中心 A P I 接 口 抽 象 模 型 Sofa Registry K8S实现 Consul实现 内部使用同样产品落地 ü 开源的动机 • 吸引社区,谋求合作,开源共建 ü 开源项目的维护 • 内部使用,保证持续投入 • 请放心Sofa Mesh的合作模式:多层次全方位开放 基础类库 功能模块 完整产品 解决方案 服务注册 熔断 RPC 路由规则 负载均衡 限流 加密 认证 Golang Sidecar 增强版本 Pilot Edge Sidecar 服务治理 中心0 码力 | 37 页 | 7.99 MB | 5 月前3Curve核心组件之mds – 网易数帆
元数据信息。 • Nameserver: 管理文件的元数据信息。 • Copyset: 副本放置策略。 • Heartbeat: 心跳模块。跟chunkserver进行交互,收集chunkserver上的负载信息、 copyset信息等。 • Scheduler: 调度模块。用于自动容错和负载均衡。TOPOLOGY topology用于管理和组织机器,利用底层机器的放置、网络的规划以面向业务提供如下功能和非功能需求。 user 3、查询leader节点 4、向leader cs发起请求 1. 用户发起请求(fd, offset, length) ; 2. Client 向 mds 查询请求的元数据, 并缓存到本地,请求转换为对 chunk 的请求 (CopysetId ,chunkId, offset in chunk, length in chunk); 3. Client 向 chunkserver offline) • 记录chunkserver定期上报的状态信息(磁盘容量,磁盘负载,copyset负载等),以提供运维工 具查看上述状态信息。 • 通过上述信息的定期更新,作为schedule 模块进行均衡及配置变更的依据 • 通过chunkserver定期上报copyset的copyset的epoch, 检测chunkserver的copyset与mds差异,同 步两者的copyset信息0 码力 | 23 页 | 1.74 MB | 5 月前3CurveFS方案设计
的元数据缓存使用的 lru cache,因此 list 只能依赖 etcd 的 range 获取方式。如果需要对 list 加速,需要新的缓存结构 c. 扩展性/可用性/可靠性 依赖于第三方kv存储,目前是etcd CurveFS 单机内存元数据设计 类似 fastcfs 和 moosefs 的元数据设计方式,采用通用的 dentry,inode 两层映射关系,所有的元数据都缓存在内存中,持久化在 master-slave 的方式,master 以同步方式调用 slave,slave 在内存中也缓存了全部元数据信息 master-slave 多副本数据 CurveFS 分布式元数据设计 类似 chubaofs 的元数据设计方式,同样是采用 dentry,inode 两层映射关系,所有的元数据都缓存在内存中。元数据是分片的,使用 multi-raft 持久化元数据以及保证多副本数据一致性。基于这种方式开发: apply的时候是以kv的方式写入到文件,因此可以复用这个逻辑。 客户端感知文件版本号。如果版本号变更,就触发raft的sanpshot,并且只apply小于版本号的部分 这种方式相当于每次都是全量缓存当前元数据,不做增量快照,考虑到转储逻辑,这也是可以接受的 对比这两种方案,第一种方案对于copy场景是友好的,但需要重新实现一套快照逻辑;第二种方案的改动和实现相对简单,并且对于需要备份的0 码力 | 14 页 | 619.32 KB | 5 月前3Rust 程序设计语言 简体中文版 1.85.0
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 7. 使用包、Crate 和模块管理不断增长的项目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 7.2. 定义模块来控制作用域与私有性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 7.3. 引用模块树中项的路径 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 7.5. 将模块拆分成多个文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .0 码力 | 562 页 | 3.23 MB | 9 天前3
共 56 条
- 1
- 2
- 3
- 4
- 5
- 6