Curve支持S3 数据缓存方案因此需要通过Cache模块解决以上2个问题。 整体设计 整个dataCache的设计思路,在写场景下能将数据尽可能的合并后flush到s3上,在读场景上,能够预读1个block大小,减少顺序读对于底层s3的访问频次。从这个思路上该缓存方案主要针对的场景是顺序写和顺序 读,而对于随机写和随机读来说也会有一定性能提升,但效果可能不会太好。 元数据采用2层索引 由于chunk大小是固定的(默认64M),所以Inode中采用map读缓存采用可设置的策略进行淘汰(默认LRU),对于小io进行block级别的预读。 即读写缓存相互没影响不相关, 缓存层级 缓存层级分为fs->file->chunk->datacache 4层,通过inodeId找到file,通过in aCacheMap中找到一个可读的DataCache,由于DataCache都是最小粒度为blockSIze的缓存,所以存在3种情况:要读的 chunkPos~len的区间全部被缓存,部分被缓存,以及无缓存。将缓存部分buf直接copy到接口的buf指针对应的偏移位置,无缓存部分生成requestVer。 3.遍历requestVer,根据每个request的offset找到inode中对应ind 0 码力 | 9 页 | 179.72 KB | 6 月前3
CurveFS S3数据整理(合并碎片、清理冗余)客户端在对一个文件的某个部分多次写入后, 同一个chunk会产生很多版本数据; 而客户端在读的时候, 会需要对这些chunk进行筛选和构建, 得到有效的部分, 越是散乱的状态, 就越需要发送更多次读请求至s3. 最后导致无效旧数据的堆积和读请求性能的下降, 所以需要在合适的时候进行重叠元数据和数据的合并 原则是尽力而为, 并不能做到完美 方案 基于一下3个基础的数据结构, 2层索引 s3chuninfolist[index] 1. 2. 需要进行一个merge的步骤 在做变更时如果有其他op可能会产生的冲突: 读: 在执行变更删除原来的s3 object时, 执行读的客户端的缓存可能还是原有的chunkinfolist, 可能会去读已经删除的object, 这种时候读会失败 可以使用双重保证 读失败的时候retry, 或许可以重拉metadata 整理后, mds在一个时间间隔内主动告知client这个inode元数据缓存失效0 码力 | 3 页 | 101.58 KB | 6 月前3
Curve核心组件之snapshotclone无snap file产生,直接读取chunk file b) 打快照后写过,触发了cow, 有snap file, 合并读取 c) 卷从未写过, 两者都没有,返回NOTEXIST 转储内部快照,即读内部快照的三种情况:克隆总体流程 • 1. 用户发起克隆,生成克隆任务,并持 久化任务元数据到etcd,开始执行克隆 任务。 • 2. 调用mds接口创建clone卷信息,该 clone卷是个临时卷,位于/clone目录下。 fileName:offset@cs,例如: /test1:0@csCHUNKSERVER端克隆实现-读时复制原理 • 使用chunkfile的bitmap来标记写过的Page, 一个Page大小为4KB • 读请求到来时,根据bitmap中的信息, • 对于已写过的区域,从本地chunk file读 • 对于未写过的区域,从远端源chunk file读 • 之后,将两者合并返回。 • 同时把源chunk读到的数据异步写入到本地 同时把源chunk读到的数据异步写入到本地 chunk,并标记bitmap,这个过程称之为 PasteChunk 读时复制原理:CHUNKSERVER端克隆实现-读时复制实现 • 判断是非clone chunk 或者读取的区域已经被拷贝过 (根据bitmap) • 那么,直接读取 需要从源chunk读取: • 判断是Clone Chunk且需要读取的区域还未被拷贝过 • 那么,生成CloneTask,交给CloneManager0 码力 | 23 页 | 1.32 MB | 6 月前3
CurveFS S3本地缓存盘方案盘写缓存目录。 写本地硬盘缓存目录之前先判断缓存目录容量是否已达到阈值,如果已经达到阈值,那么则直接写入到远端对象存储;否则,则写入到本地硬盘写缓存目录中。文件写入本地硬盘写缓存目录后,从本地硬盘读目录© XXX Page 4 of 9 做一个硬链接链接到该文件。 本次io在本地硬盘写入好之后,异步上传模块会适时把本地硬盘写缓存目录中的文件上传到远端对象存储集群,上传成功后,删除本地写缓存目录中的对应文件。 本身了)。 本地缓存盘的文件内容表示 本地缓存盘存放的文件即是存储到对象存储中的对象。 写缓存如何作为读缓存利用 除了写缓存目录,另外引入读缓存目录;当写缓存目录中有新文件加入时,则对该文件做硬链接到读缓存目录。 这样,写缓存目录中的文件上传完之后就可以直接删除了,那么该文件的读缓存还是存在的。 缓存盘空间管理 当缓存文件内容达到阈值时,停止向本地缓存盘写入。 同时,缓存清理模块会0 码力 | 9 页 | 150.46 KB | 6 月前3
Curve设计要点系统特性 近期规划单卷4K随机读写IOPS 102k 39.7k 41.7k 127k 4K随机写 4K随机读 Ceph(L/N) Curve 151.89% 204.56% 单卷4K随机读写平均延迟(ms) 1.244 3.2 3.1 0.998 4K随机写 4K随机读 61.12 % 67.8% 测试环境:6台服务器*20块SATA SSD,E5-2660 v4,256G,3副本场景 filepool落盘零放大 • 轻量级线性一致性读 • io路径上用户空间零拷贝 10卷4K随机读写IOPS 294k 185k 330k 565k 4K随机写 4K随机读 Ceph(L/N) Curve 58.92% 71.21% 10卷4K随机读写平均延迟(ms) 4.34 7 3.7 2.423 4K随机写 4K随机读 38% 34.5% 测试环境:6台服务器*20块SATA0 码力 | 35 页 | 2.03 MB | 6 月前3
副本如何用CLup管理PolarDB数据可用性 提供读写VIP 读写高可用 读写分离 多个读库之间负载均衡 负载均衡 读线性扩展 支持分库分表 高扩展性 写 VIP 读 VIP PG (Primary) PG (Standby1) PG (Standby2) PG (Standby3) 数据同步复制 写请求 读请求 应用层 负载均衡器 CLup高可用及读写分离功能http://www0 码力 | 34 页 | 3.59 MB | 6 月前3
PFS SPDK: Storage Performance Development KitBRPC IOBuf DMA ●修改BRPC,允许使用dpdk内存作为IOBuf的内存分配器 ●BRPC接收到的数据在IOBuf中,IOBuf直接使用于NVME DMA传输 ●使用IOBuf内存读nvme,避免自己写PRP页面对齐内存分配代码10/17/22 11 pfs_pwrite_zero ●在初始化curvebs时,需要创建chunk pool, 每一个chunk都要填零 ●ch 。 PRP是第一个版本, SGL是后面才发展起来的 ●PRP要求内存按PAGE对齐 ●SGL要求字节/或4字节对齐(double word), 相对宽松10/17/22 13 PFS NVME读对齐实现 ●内存分配页面对齐,实现基于PRP严格的规定,这样SGL也可以用 ●第一个页面可以从非0的页内位置开始直到页面结束位置,必须是512字节倍数。 第 二个页面必须是整页,内存位置必须在页内位置0处。 [page0+3584, page0+4096),[page1, page1+4096), [page2, page2+4096), [page3, page3+512)10/17/22 14 IOPortal实现读对齐支持 ●ssize_t IOPortal::pappend_from_dev_descriptor(int fd, off_t offset, size_t max_count)0 码力 | 23 页 | 4.21 MB | 6 月前3
BRPC与UCX集成指南●Socket::Connect时需要Remote EndPoint ●Accept的Socket可以获得Remote EndPoint10 BRPC Socket对象 ●brpc最终的网络通讯都集中在socket对象里面 ●读socket通过EventDispatcher触发 ●上层发送网络数据通过写socket完成,不能立刻完成的,则去启动后台bthread去完成。11 BRPC SocketMap ●根据EndP ●UcpCm从来不会写入pipe,如果pipe有可读字节,会打印错误,说明有地方遗漏了修 改。 ●Socket通过关闭UcpCm返回的句柄来关闭连接。此举和Socket原来代码一样,减少了修 改。UcpCm检测到pipe读端可读,关闭UcpConnection。 ●以上修改实际上绕过了BRPC的Event dispatcher触发读写机制,UCX自己完成发送接收45 连接管理器UcpCm ●连接管理类 –全局唯一对象 ●UcpConnection的Read函数发现了错误状态,于是返回读错误,进而导致Brpc关闭 socket,而我们的socket里的fd是pipe的写端,当比关闭时,UcpCm检测到pipe读端fd可 读并且EOF,进而检测到UcpConnection需要关闭。61 修改Socket::StartWrite ucp_conn的写总是提交给ucp worker的,不会阻塞,所以不会用到 brpc0 码力 | 66 页 | 16.29 MB | 6 月前3
NJSD eBPF 技术文档 - 0924版本set_initial_rtoCurve的Cache模块 • 底层ext4⽂件系统作为cache • cache分为写cache与读cache,读/ 写cache独⽴配置 • 与底层⽂件关系 (filename, offset, len) = func (inodeid, offset, len) • 读cache流程 • 写cache流程基于inode cache优化 • bpf程序类型 BPF_PROG_TYPE_EXTFUSE0 码力 | 20 页 | 7.40 MB | 6 月前3
新一代云原生分布式存储地址空间的每段数据会分布在不同机器的磁盘上,如 何找到这些数据? 可靠性 & 可用性 —— 多副本/EC 服务不可用时 间 数据一致性 —— 一致性协议 如何保证数据不丢?如何保证各种硬件故障的时候读 写都正常? 可扩展性 —— 和数据分布的方式相关 所用容量都用完后,可以新增机器扩展容量分布式存储的要素 — 数据分布 无中心节点:哈希算法 INPUT (Offset, Len) HASH 16MB) 50分布式存储的要素 — 一致性协议 多副本: 写三次? 一致性协议 一致性:WARO(Write-all-read-one)、Quorum WARO • 所有副本写成功 • 读可用性高:可以读任一副本 • 写可用性较低,任一副本异常写失败 Quorum • 大多数副本写成功 • 读写服务可用性做一个折中 • 写性能提升,速度取决于写的较快的大多数 W R client0 码力 | 29 页 | 2.46 MB | 6 月前3
共 15 条
- 1
- 2













