CFS: A Distributed File System for Large Scale Container Platforms——论文泛读

SIGMOD 2019 Paper 分布式元数据论文阅读笔记整理

问题

随着容器化和微服务的出现,越来越多的应用程序转移到容器化环境中。在每组容器上运行的微服务通常独立于本地磁盘存储,虽然将计算与存储脱钩允许更有效的扩展容器资源,但也带来了对单独存储的需求:(1)容器需要保存应用程序数据,即使在它们关闭之后,(2)不同的容器可能需要同时访问同一文件,(3)存储资源需要由不同的服务和应用程序共享。

挑战

为了实现容器的需求,通常通过容器存储接口(CSI)将现有的分布式文件系统带到云原生环境中,或者通过一些存储协调器(例如Rook)。但性能和可扩展性不足。

  • 由于组合工作负载中文件大小不同,并且按随机或顺序的方式访问,现有文件系统很少同时支持大文件和小文件的存储。

  • 现有文件系统采用相同的复制协议,无法为不同写入场景提供优化的复制性能。

  • 大量客户端可能同时对文件进行大量访问,大多数文件操作需要更新文件元数据。因此,存储所有文件元数据的单个节点很容易成为性能或存储瓶颈[23,24]。可以通过使用单独的集群来存储元数据来解决这个问题,但需要在容量扩展期间重新平衡存储节点,这可能会显著降低读/写性能。

  • 符合POSIX的文件系统接口可以极大地简化上层应用的开发,但POSIX I/O标准中定义的强一致语义会极大地影响性能。大多数文件系统通过提供宽松的POSIX语义来缓解这个问题,但同一文件的inode和dentry之间的原子性要求仍然会限制它们在元数据操作上的性能。

本文方法

本文提出了Chubao文件系统(CFS),用于大型容器平台的分布式文件系统。

  • 通用和高性能存储引擎。在不同的文件访问模式下以优化的性能高效地存储大小文件。利用Linux[22]中的punch hole接口异步释放被删除的小文件占用的磁盘空间,大大简化了处理小文件删除的工程工作。

  • 场景感知复制。基于不同的写入场景(即附加和覆盖)采用了两种强一致的复制协议来提高复制性能。

  • 基于利用率的元数据放置。使用一个单独的集群来根据内存使用情况在不同的存储节点上存储和分发文件元数据,在容量扩展过程中不需要任何元数据再平衡。每次扩展都根据内存和磁盘利用率,创建一个新的元分区存储后续的元数据,因此扩展过程中没有再平衡。

  • 宽松的POSIX语义和元数据原子性。提供符合POSIX的API,放松POSIX一致性语义以及同一文件的inode和dentry之间的原子性要求,为了更好地满足应用程序的需求并提高系统性能。

开源代码:https://github.com/cubefs/cubefs

与Ceph进行了全面的比较,实验结果表明,在测试7种常用的元数据操作时,CFS的性能平均提高了约3倍。此外,CFS在具有多个客户端和进程的高度并发环境中表现出更好的随机读/写性能。

元数据存储

元数据子系统由一组元数据节点组成,每个元数据节点可以有数百个元分区。每个元分区将来自同一卷的文件的inode和dentry存储在内存中,并使用两个名为inodeTree和dentryTree的b树进行快速查找。inodeTree由inode id索引,dentryTree由父inode id和dentry名称索引。

基于利用率的放置

在创建卷之后,客户端向资源管理器请求一定数量的可用元分区和数据分区,这些分区通常位于内存/磁盘利用率最低的节点上。在写入文件时,客户端以随机的方式从资源管理器分配的分区中选择元分区和数据分区。客户端不采用基于利用率的方法是为了避免与资源管理器通信,无需获得每个分配节点的最新利用率信息。

当资源管理器发现卷中的所有分区都将满时,它会自动向该卷添加一组新分区。这些分区通常位于内存/磁盘利用率最低的节点上。当分区已满,或者达到阈值(即,元分区上的文件数或数据分区上的扩展数据块数)时,尽管仍然可以修改或删除新数据,但无法在该分区上存储新数据。

元数据拆分

如果元分区即将达到其存储的inode和dentry数量的上限,则需要执行拆分,以确保存储在新分区中的inode id与存储在原分区中的索引节点id是唯一的。

资源管理器首先在上界end预先切断元分区的inode范围,该值大于使用的最大inode id(表示为maxInodeID),然后向元节点发送拆分请求,以(1)更新原始元分区的从1到结束的inode id范围,(2)创建一个新的元分区,其inode范围从结束+1到∞。结果,这两个元分区的inode范围分别变为[1,end]和[end+1,∞]。如果需要创建另一个文件,那么它的inode id将在原始元分区中被选择为maxInodeID+1,在新创建的元分区中选择为end+1。

实验

数据集:mdtest,fio(直接IO模式)

实验对比:IOPS

实验参数:元数据操作、进程数、客户端数、顺序/随机读/写、文件大小

总结

介绍为京东电子商务服务的分布式文件系统CFS。包括4个技术:(1)在不同的文件访问模式下高效地存储大小文件,利用Linux punch hole接口异步释放被删除的小文件占用的磁盘空间,简化了处理小文件删除的工程工作。(2)采用了两种基于不同写入场景的强一致复制协议(即附加和覆盖)来提高复制性能。(3)基于利用率的元数据放置。每次扩展都根据内存和磁盘利用率,创建一个新的元分区存储后续的元数据,因此扩展过程中没有再平衡。(4)放松POSIX语义和同一文件的inode和dentry之间的原子性,从而更好地满足应用程序的需求并提高系统性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/531309.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(四)- 配置和设置指令(vsetvli/vsetivli/vsetvl)

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容: 这是一份关于向量扩展的详细技术文档,内容覆盖了向量指令集的多个关键方面,如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…

【Spring进阶系列丨第八篇】Spring整合junit 面向切面编程(AOP)详解

文章目录 一、Spring整合junit1.1、导入spring整合junit的jar1.2、在测试类上添加注解1.3、说明 二、面向切面编程(AOP)2.1、问题引出2.2、AOP2.2.1、概念2.2.2、作用2.2.3、优势2.2.4、实现方式2.2.5、专业术语2.2.5.1、连接点2.2.5.2、切入点2.2.5.3、通知/增强2.2.5.4、织入…

梯度下降小结

1.梯度下降法(Batch Gradient Desent,BGD): 总体m个样本,损失函数: 计算损失函数梯度: 参数更新: 2.随机梯度下降法(Stochastic Gradient Desent,SGD&#x…

GEE图表案例——不同区域各地类面积直方图分布图表(矢量面积叠加直方图图)

简介 在GEE中对不同区域面积统计的直方图绘制具体流程如下: 数据准备: 首先,需要准备用于面积统计的地理数据,可以是矢量数据,如行政边界、土地使用类型等。也可以是栅格数据,如分类结果、土地覆盖数据等。 区域划分: 根据需要统计的区域,将数据进行区域划分。可以使用…

微软卡内基梅隆大学:无外部干预,GPT4等大语言模型难以自主探索

目录 引言:LLMs在强化学习中的探索能力探究 研究背景:LLMs的在情境中学习能力及其重要性 实验设计:多臂老虎机环境中的LLMs探索行为 实验结果概览:LLMs在探索任务中的普遍失败 成功案例分析:Gpt-4在特定配置下的探…

基于Java+SpringBoot+Vue幼儿园管理系统(源码+文档+部署+讲解)

一.系统概述 随着信息时代的来临,过去的传统管理方式缺点逐渐暴露,对过去的传统管理方式的缺点进行分析,采取计算机方式构建幼儿园管理系统。本文通过课题背景、课题目的及意义相关技术,提出了一种教 学生信息、学生考勤、健康记录…

智慧粮仓监测系统解决方案

一、概述 粮食储备是每个国家战略物资中最为重要的一项储备;而随着现代化农业的快速发展以及国家经济发展的需要,我国粮食产量和储备量长期处于世界前列。传统的粮仓由于修建年代久远,可能存在着设施落后,实时监控不到位的现象&am…

谷粒商城实战(011 业务-异步多线程)

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第193p-第p202的内容 介绍 继承Thread 继承Runnable接口 继承callable FutureTask继承的就是runnable 线程池 代表有10个线程来等待接收我们的…

高并发秒杀系统

六种手段: 1.页面静态化 商品秒杀页面做静态化处理,常规请求不会到服务端。 2.cdn内容分发 将前端资源缓存到cdn上,就近分发给不同区域的客户端; 秒杀开始后将新的js文件同步到cdn上; 前端加一个控制器&#xff…

看看《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制山鸢尾萼片长度和萼片宽度的小提琴图

使用MATLAB绘制鸢尾花数据集( fisheriris)中山鸢尾( Iris Setosa)的萼片长度和 萼片宽度的小提琴图。这将帮助我们更好地了解山鸢尾的这两个特征的数据分布情况,包括它们的 中位数、四分位范围及密度估计。这种可视化工…

老杜spring6自己笔记

精讲 【Spring视频零基础入门到高级,spring全套视频教程详解】 https://www.bilibili.com/video/BV1Ft4y1g7Fb/?p12&share_sourcecopy_web&vd_source833390c85450e4ff7747a5f16c02cc1e 老杜spring6网盘资料: 链接:https://pan.bai…

cesium 添加动态波纹效果 圆形扩散效果 波纹材质

一、扩展材质 /*** 水波纹扩散材质* param {*} options* param {String} options.color 颜色* param {Number} options.duration 持续时间 毫秒* param {Number} options.count 波浪数量* param {Number} options.gradient 渐变曲率*/function CircleWaveMaterialProperty(opt…

CF938Div3(A-F)

A: 买n个酸奶&#xff0c;一次一瓶a元,一次买两瓶可以优惠价b元,也可以a元,问恰好买n瓶需要多少钱. void solve() {int n, a, b;cin >> n >> a >> b;int ans min(a * n, n / 2 * b n % 2 * a);cout << ans << endl; } B: 给你一个数组,问能…

pdfjs-4.0.379-dist直接打开viewer.html报错

下载了pdfjs-4.0.379-dist&#xff0c;但是直接打开viewer.html报错。解决方法&#xff1a;安装live Sever&#xff0c;并用live Server打开 打开浏览器截图 错误提示如下&#xff1a; Access to image at file:///D:/work/web-common/car-knowledge-base-web/static/pdfjs-4…

OJ 栓奶牛【C】【Python】【二分算法】

题目 算法思路 要求的距离在最近木桩与最远木桩相隔距离到零之间&#xff0c;所以是二分法 先取一个中间值&#xff0c;看按照这个中间值可以栓多少奶牛&#xff0c;再与输入奶牛数比较&#xff0c;如果大于等于&#xff0c;则增大距离&#xff0c;注意这里等于也是增大距离…

AcWing1262.鱼塘钓鱼

【题目链接】1262. 鱼塘钓鱼 - AcWing题库 输入样例&#xff1a; 5 10 14 20 16 9 2 4 6 5 3 3 5 4 4 14输出样例&#xff1a; 76 【代码及详细注释】 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N110; int a[N],b[N],sp[N],d[N]…

Unity Pro 2019 for Mac:专业级游戏引擎,助力创意无限延伸!

Unity Pro 2019是一款功能强大的游戏开发引擎&#xff0c;其特点主要体现在以下几个方面&#xff1a; 强大的渲染技术&#xff1a;Unity Pro 2019采用了新的渲染技术&#xff0c;包括脚本化渲染流水线&#xff0c;能够轻松自定义渲染管线&#xff0c;通过C#代码和材料材质&…

Day36:LeedCode 435. 无重叠区间 763.划分字母区间 56. 合并区间 蓝桥杯 管道

435. 无重叠区间 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 示例 1: 输入: intervals [[1,2],[2,3],[3,4],[1,3]] 输出: 1 解释: 移除 [1,3] 后&#xff0c;剩下的区间…

Python 编程 深入了解内存管理机制、深拷贝与浅拷贝

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、对象和引用、内存管理机制 Python 中的一切都是对象&#xff0c;包括数字、字符串、列表和函数等。为了简化内存管理并提高效率&#xff0c;Python 采用了统一的对象模型。在这个模型中&#xff0c…

c++——sort()函数

一、代码和效果 #include<bits/stdc.h> using namespace std;int main() {int a[6]{1,45,2,5,456,7};sort(a,a6);for(int i0; i<6; i){cout<<a[i]<<" "<<endl;}return 0; } 二、sort函数解析 &#xff08;从小到大&#xff09; std::so…