CurveFS S3本地缓存盘方案
9 Curvefs-S3 本地写缓存盘方案© XXX Page 2 of 9 背景 方案设计 主要数据结构定义 方案设计思考 POC验证 背景 当前,s3客户端在写底层存储的时候是直接写入远端对象存储,由于写远端时延相对会较高,所以为了提升性能,引入了写本地缓存盘方案。也即要写底层存储时,先把数据写到本地缓存硬盘,然后再把本地缓存 硬盘中的数据异步上传到远端对象存储。 方案设计© XXX 足持久化的条件后,那么则准备持久化。 如果未配置本地硬盘作为写缓存,那么直接持久化到远端的对象存储;如果配置了本地硬盘作为写缓存,那么则尝试先写入本地硬盘写缓存目录。 写本地硬盘缓存目录之前先判断缓存目录容量是否已达到阈值,如果已经达到阈值,那么则直接写入到远端对象存储;否则,则写入到本地硬盘写缓存目录中。文件写入本地硬盘写缓存目录后,从本地硬盘读目录© XXX Page 4 of 9 做一个硬链接链接到该文件。 做一个硬链接链接到该文件。 本次io在本地硬盘写入好之后,异步上传模块会适时把本地硬盘写缓存目录中的文件上传到远端对象存储集群,上传成功后,删除本地写缓存目录中的对应文件。 同时,缓存清理模块会定时检查本地硬盘缓存目录容量情况,如果容量已经达到阈值了,则进行文件的清理工作。 另外,异常管理模块处理客户端挂掉后的文件重新上传问题。 主要数据结构定义 class DiskCacheManagerImpl0 码力 | 9 页 | 150.46 KB | 5 月前3Rust 程序设计语言 简体中文版 1.85.0
. . . . . . . 354 16.1. 使用线程同时地运行代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 16.2. 使用消息传递在线程间通信 . . . . . . . . . . . . . . . . 414 17.6. future、任务和线程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422 18. 面向对象编程特性 . . . . . . . . . . . . . . . 425 18.1. 面向对象语言的特征 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426 18.2. 顾及不同类型值的 trait 对象 . . . . . . . . . .0 码力 | 562 页 | 3.23 MB | 8 天前3Curve支持S3 数据缓存方案
数据缓存方案© XXX Page 2 of 9 版本 时间 修改者 修改内容 1.0 2021/8/18 胡遥 初稿 背景 整体设计 元数据采用2层索引 对象名设计 读写缓存分离 缓存层级 对外接口 后台刷数据线程 本地磁盘缓存 关键数据结构 详细设计 Write流程 Read流程 ReleaseCache流程 Flush流程 FsSync流程 后台流程 poc测试验证 背景 s3ChunkInfoMap用于保存对象存储的位置信息。采用2级索引的好处是,根据操作的offset可以快速定位到index,则只需要遍历index相关的S3ChunkInfoList,减少了遍历的范围。 对象名设计 对象名采用chunkId+blockindex+compaction(后台碎片整理才会使用,默认0)+inodeId。增加inodeId的目的是为了后续从对象存储上遍历,反查文件,这里就要求inodeId是永远不可重复。 理(马杰负责)模块进行truncate的无效数据清理 后台刷数据线程© XXX Page 4 of 9 启动后台线程,将写Cache定时刷到S3上,同时通过inodeManager更新inode缓存中的s3InfoList。具体细节见 本地磁盘缓存 如果有配置writeBack dev,则会调用diskStroage进行本地磁盘write,最终写到s3则由diskStroage模块决定。 关键数据结构0 码力 | 9 页 | 179.72 KB | 5 月前3TiDB中文技术文档
stall : RocksDB Stall 时间 大于 0,表明 RocksDB 忙不过来,需要注意 IO 和 CPU 了 channel full : channel 满了,表明线程太忙无法处理 如果大于 0,表明线程已经没法处理了 95% send_message_duration_seconds : 95% 发送消息的时间 小于 50ms leader/region : 每个 TiKV 的 leader/region 中也有系统表,用于存放数据库运行时所需信息。具体信息参考 TiDB 系统数据库文档。 TiDB 数据存放在存储引擎中,数据目录取决于使用的存储引擎,存储引擎的选择参见 TiDB 启动参数文档。 对于使用本地存储引擎的情况,数据存储在本机硬盘上,目录位置通过 path 参数控制。 对于使用 TiKV 引擎的情况,数据存储在 TiKV 节点上,目录位置通过 data-dir 参数控制。 TiDB 集群的三个组件( Gateway 的时间间隔 默认: 15s 设置为 0 表明不推送统计信息给 Push Gateway ,如: --metrics-interval=2 是每两秒推送到 Push Gataway 对于本地存储引擎 “goleveldb”, “BoltDB” 来说,path 指定的是实际的数据存放路径 对于 “memory” 存储引擎来说,path 不用设置 对于 “TiKV” 存储引擎来说,path0 码力 | 444 页 | 4.89 MB | 5 月前3BRPC与UCX集成指南
BRPC Socket对象 ●brpc最终的网络通讯都集中在socket对象里面 ●读socket通过EventDispatcher触发 ●上层发送网络数据通过写socket完成,不能立刻完成的,则去启动后台bthread去完成。11 BRPC SocketMap ●根据EndPoint作为一个map的Key,Value是Socket对象 ●Socket对象引用计数,多个Channel可以共享一个Socket对象 l可以共享一个Socket对象 ●往SocketMap里调用Insert,要么返回已经存在的Socket对象(引用计数加一),要么创建一 个新的12 BRPC EventDispatcher ●是socket事件分发的中心 ●使用epoll和边沿触发 ●提供监视一个fd是否可读写,并调用对应socket对象的成员函数1314 Socket 输入事件处理15 Socket options ocket*) ●可读事件的回调函数16 Server创建Socket Listener 把系统调用创建的listen socket fd传给Socket::Create,获得一个Socket对象17 Socket Listener::OnNewConnections Listener 获得一个socket fd后,创建通讯Socket。 SocketOptions关键字段: fd,0 码力 | 66 页 | 16.29 MB | 5 月前3Curve核心组件之chunkserver
Curve核心组件之ChunkServer 查日苏CURVE CURVE是高性能、高可用、高可靠的分布式存储系统 • 高性能、低延迟存储底座 • 可扩展存储场景:块存储、对象存储、云原生数据库、EC等 • 当前实现了高性能块存储,对接 openstack 和 k8s 网易内部线上无故障稳定运行500+天 • 已开源 • github主页: https://opencurve.github OpRequest,将上下文保存在里面,然 后发起Propose提交给raft,等raft apply后再执行后面的操作。 ChunkServer架构CloneManager主要负责克隆相关的功 能,内部是一个线程池,主要负责异 步完成克隆chunk的数据补全。关于克 隆相关的内容将会在快照克隆相关介 绍文档中详细介绍。 ChunkServer架构Metric统计模块使用brpc中的bvar计数 器 r核心模块-CopysetNode 写请求: 1. Client发送写请求给Leader ChunkServer 2. 请求封装,提交给Raft node 3. 本地持久化entry的同时发送给其他peer 4. 本地持久化log entry成功,并且有一个peer也落 盘成功,则commit 5. Commit后apply,此时把写请求写到chunkChunkServer核心模块-CopysetNode0 码力 | 29 页 | 1.61 MB | 5 月前3Service Mesh的实践分享
语言单一 • 升级困难 • 复杂代码嵌入对客户端进程影响大服务化体系2.0 - Service Mesh雏形 • 物理机、sidecar • Local & Remote,主与备 • 轻量级客户端、本地调用 • Local Proxy负责服务治理与 远程通信 • Remote Proxy负责备份和非 主流流量 JavaApp Local Proxy OSP Server Service Gateway 备用链路 服务发现 服务注册 配置下发 服务路由 网络传输 OSP client多语言客户端接入 • HTTP & TCP • Local & Remote • 根据接入对象的不同,制定 不同的接入策略,达到 • 接入简单 • 保证性能 • 节省资源 Java App Local Proxy OSP Server Remote Proxy Cluster Thrift server只带一个 服务注册agent • 服务端的一些治理、trace、鉴权功能通过代码插 件的方式实现 • 治理效果考虑 • 服务端嵌入治理功能可以让治理效果更好,如提 供主动GC、线程池隔离等 • 因为是内部项目,优雅性和治理效果之间,选择 了后者 App Local Proxy OSP OSP client App Envoy App EnvoyClient端不基于IPTable劫持0 码力 | 30 页 | 4.80 MB | 5 月前3分布式NewSQL数据库TiDB
“证书管理” ⾯板 添加证书⽀持 USSL导⼊,本地上传和⼿动输⼊三种⽅式 SSL 证书管理 分布式NewSQL数据库 TiDB Copyright © 2012-2021 UCloud 优刻得 95/120 证书格式 证书格式 UTiDB证书⽀持两种上传⽅式,第⼀种是本地上传证书⽂件,第⼆种是⼿动输⼊证书⽂本信息。 本地上传⽂件 本地上传⽂件 如果您选择本地上传证书⽂件,那么需要准备好以下⽂件: 必 证书管理 分布式NewSQL数据库 TiDB Copyright © 2012-2021 UCloud 优刻得 100/120 查看证书详情 查看证书详情 USSL导⼊证书查看详情会跳转USSL详情 本地上传和⼿动输⼊证书可直接查看证书内容 SSL 证书管理 分布式NewSQL数据库 TiDB Copyright © 2012-2021 UCloud 优刻得 101/120 SSL 证书管理 分布式NewSQL数据库 106/120 性能数据 性能数据 TiDB 可以通过⽔平扩容的⽅式提升性能(限制内存实例除外),以下为TiDB在默认配置(3PD3TiDB3TiKV)下的性能表现。 测试⼀ 测试⼀ 版本: v4.0.8 线程: 512 表: 32 * 1000万条数据 事务: 1000万 测试时间: 1⼩时 Sysbench: v1.0.13 同可⽤区实例 同可⽤区实例 操作 操作 Delete Insert Oltp0 码力 | 120 页 | 7.42 MB | 5 月前3TGT服务器的优化
iSCSI 发起者 • 服务器端 • 必须是CurveBS原生支持的平台,因为需要curve原生接口,目前是LinuxiSCSI target服务器 • LINUX LILO • 一般用于输出内核本地块设备 • TCMU • 作为LILO支持用户态的接口 • 如何评价LILO • 输出内核块设备I/O效率高 • 不利于把复杂的存储协议代码搬进内核,例如(curve, brpc, c++, protobuf FUA可以让某些文件系统在做写操作时,不需要提交一个SCSI FLUSH COMMAND,提高性能 • 已经修改TGT,让驱动可以声明自己是否支持DPO & FUA • 由于增加的Curve 驱动没有本地cache,所以DPO & FUA可以turn on. • sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't connection,在单线程里做event loop多路复用。 • 多个target时,如果挂的设备多,一旦客户端请求量大,就会忙不过来。 • 开源界有尝试修改 • 例如sheepdog的开发者提交过一个patch,但是测试效果不理想,分析 原因,event loop依然是瓶颈对TGT的性能优化 • IO是使用多个epoll 线程,充分发挥多CPU能力 • 当前策略是每个target一个epoll线程,负责Initiator发过来的I/O0 码力 | 15 页 | 637.11 KB | 5 月前3Curve核心组件之Client - 网易数帆
C u r v e 核 心 组 件 之 C l i e n t 吴汉卿CURVE CURVE是高性能、高可用、高可靠的分布式存储系统 • 高性能、低延迟存储底座 • 可扩展存储场景:块存储、对象存储、云原生数据库、EC等 • 当前实现了高性能块存储,对接 OpenStack 和 k8s • 网易内部线上无故障稳定运行400+天 • 已开源 • github主页: https://opencurve 将请求发往leader节点CLIENT IO线程模型 用户线程 1. 用户调用接口,发起IO请求 2. AioWrite将请求封装成io task并放入任务队列 3. 放入任务队列后,异步请求发起成功,返回用户 IO拆分线程 4. 从任务队列取出任务后进行拆分 5. 拆分过程依赖元数据,可能会通过MDSClient向 MDS获取 6. 拆分成的子请求放入队列CLIENT IO线程模型 IO分发线程 7. 从队列中取出子请求准备发送 Chunkserver查询复制组leader 9. 发送写请求给Chunkserver BRPC线程 10.Chunkserver处理完成后返回RPC Response 11.用户请求的所有子请求完成后,调用 IOTracker::Done 12.调用异步请求回调,返回用户CLIENT IO请求重试 IO分发线程将拆分后的子请求通过RPC请求发往指定的Chunkserver上,RPC有可能会失败,一般情况下0 码力 | 27 页 | 1.57 MB | 5 月前3
共 58 条
- 1
- 2
- 3
- 4
- 5
- 6