最新文章 (全部类别)
.NETCore WebApi阻止接口重复调用(请求并发操作)
VS2022消除编译警告
“SymmetricAlgorithm.Create(string)”已过时:“Cryptographic factory methods accepting an algorithm name are obsolete. Use the parameterless Create factory method on the algorithm type instead
SHA256Managed/SHA512Managed已过时:Derived cryptographic types are obsolete. Use the Create method on the base type instead
MD5CryptoServiceProvider已过时:Derived cryptographic types are obsolete. Use the Create method on the base type instead
C#使用HttpClient获取IP地址位置和网络信息
判断IP是否是外网IP、内网IP
C#使用HttpClient获取公网IP
WebRequest.Create(string)已过时:WebRequest, HttpWebRequest, ServicePoint, and WebClient are obsolete. Use HttpClient instead
C#根据第三方提供的IP查询服务获取公网外网IP地址
html/dom/js/javascript开发记录
调试ASP.NETCore Web站点 - 清理IISExpress缓存数据(js,css)
EFCore+Oracle根据不同的Schema连接数据库
主程序集成CSFramework.EF 数据库框架(.NET7版本)
CSFramework.EF数据库框架简介(.NET8+EFCore)
迁移ECS服务器:导致ORACLE监听服务启动不了解决方案
SQLite数据库
VS2022编译报错:Visual Studio 容器工具需要 Docker Desktop
.NET 9 预览版+C#13新功能
EFCore禁用实体跟踪
WebApi开发框架V3.0 (.NETCore+EFCore) 增加AppSettings全局参数类
C#获取应用程序所有依赖的程序集
LINQ Expression 多条件复合条件组合(And/Or)
CSFrameworkV6客户案例 - MHR - 宁德时代制造人力资源系统
CS软件授权注册系统V3 - 发布证书
C/S软件授权注册系统V3.0(Winform+WebApi+.NET8+EFCore版本)
CS软件授权注册系统V3 - 购买方式
CS软件授权注册系统V3 - 试用版下载
CS软件授权注册系统-客户登记(制作证书)
C/S软件授权注册系统V3.0 - 管理员工具
CSFrameworkV6旗舰版开发框架 - 集成软件授权认证系统
CSFramework.Authentication 软件证书管理系统 - 制作软件客户授权证书
CSFramework.Authentication 软件证书管理系统 - MAC地址管理
CSFramework.Authentication 软件授权证书管理系统
Login/Logout接口调用dalUser的Login/Logout方法
C# Newtonsoft.Json.Linq.JObject 转对象
CSFramework.Authentication 软件授权认证系统 - 软件测试报告
C/S架构软件开发平台 - 旗舰版V6.0 - 底层框架迭代开发
C/S架构软件开发平台 - 旗舰版V6.1新功能 - 增加软件授权认证模块
C/S架构软件开发平台 - 旗舰版CSFrameworkV6 Bug修改记录
CS软件授权注册系统V3 - 开发手册 - 软件集成与用户注册
CS软件授权注册系统-模拟MES/ERP用户注册软件
CS软件授权注册系统-发布/部署WebApi服务器(IIS+.NET8+ASP.NETCore)
CS软件授权注册系统-VS2022调试WebApi接口
.NETCore Console控制台程序使用ILogger日志
CS软件授权注册系统-WebApi服务器介绍
ASP.NETCore集成Swagger添加Authorize按钮Bearer授权
CS软件授权注册系统-WebApi服务器配置
.NETCore WebApi发布到IIS服务器无法打开swagger
.NET8/ .NETCore /ASP.NETCore 部署WebApi到IIS服务器需要安装的运行环境
.net敏捷开发,创造卓越

Facebook图片存储架构技术全面解析


Facebook图片存储架构技术全面解析
摘要:Haystack提出了一种通用的基于HTTP的对象存储,它含有指针,映射到存储对象。在Haystack中以指针储存照片,把数以十万计的图像聚集到一个Haystack存储文件,从而消除了元数据负荷。这就使得元数据的开销非常小,并且使我们能够在存储文件和内存索引中存储每个指针的位置。这就使得能用少量的I/O操作来完成图像数据的检索,可以消除一切不必要的元数据开销。



照片应用程序是Facebook最流行的功能。直至目前为止,Facebook的用户已经上传了超过150万幅照片,这使得Facebook成为最大的照片共享网站。对于每一个上传的照片, Facebook生成并保存成4种不同大小的图像,即总共有60亿的图片占1.5PB的存储容量。目前的增长速度是每星期220万个新照片,即每周消耗 25TB的额外存储空间。在高峰期,平均每秒会上传550,000幅图像。这些数字给Facebook的照片存储基础架构带来了严重的挑战。

  NFS照片基础架构

  旧的照片基础架构包含几个层次:

  ◆上传层接收用户上传的照片,测量原始图像的大小并将其保存到NFS存储层。

  ◆照片服务层接收HTTP照片请求,并向用户提供保存于NFS存储层的照片。

  ◆NFS存储层建立于商业存储设备之上。

  由于每个图像存储在自己的文件内,所以根据命名空间目录和文件inode(内节点),在存储层产生了大量的元数据。这些元数据量远远超过了NFS存储层的缓存能力,导致了上传和读取每张照片时成倍的I/O操作。整个照片服务的基础架构由于NFS存储层的大量元数据负荷而成为了一个瓶颈,这就是Facebook严重依赖CDNs来提供照片服务的原因之一。以下两个附加的优化部署,用来在一定程度上减轻这个问题:

  Cachr :一个缓存服务层,用来缓存Facebook中较小的“个人资料”图像。

  NFS文件句柄缓存——部署在照片服务层,消除了一些NFS存储级元数据负荷

  Haystack照片基础架构

  新的照片基础架构将照片服务层和存储层合并为一个物理层。它实现了一个基于HTTP的照片服务器,把照片存储在名为Haystack的通用对象中。对于新层次的主要要求是消除任何照片读取操作的不必要的元数据开销,使每个读取I/O操作只是读取实际照片数据(而不是文件系统元数据)。Haystack可划分为以下一些功能层:

  ◆HTTP服务器

  ◆照片存储

  ◆Haystack对象存储

  ◆文件系统

  ◆存储设备

  以下各节中,我们会自底向上密切关注每一个功能层。

  存储设备

  Haystack部署于日常存储片之上。一个2U存储片的典型硬件配置的是-

  ◆2 x 4核CPUs

  ◆16GB – 32GB内存

  ◆具有256MB – 512MB NVRAM缓存的硬件RAID控制器

  ◆12+ 1TB SATA驱动器

  每个存储片提供大约10TB的可用空间,配置为一个RAID-6分区,由硬件RAID控制器进行管理。RAID 6提供了足够的冗余性和出色的读取性能,可以降低存储成本。RAID控制器NVRAM回写高速缓存可以部分缓解低劣的写性能。由于读取大多是随机的,所以 NVRAM缓存完全保留给写操作。磁盘高速缓存被禁用,以保证在系统崩溃或电源断电时数据的一致性。

  文件系统

  Haystack对象存储实现于一个文件之上,该文件存储在一个单一文件系统上,该文件系统建立于10TB volume(卷)大小的空间之上。

  照片读取请求导致read()系统调用请求读取文件中不同偏移量的信息,但为了执行读取操作,文件系统必须首先在实际物理卷上找到数据。在文件系统中,每个文件的是由一个名为inode的结构所描述,该结构包含一个块映射,可以把逻辑文件偏移量映射到物理卷中的物理块偏离量。对于大文件,根据所使用的文件系统类型的不同,块映射可能会相当庞大。

  基于块的文件系统为每个逻辑块维护其映射信息,对于大文件,这些映射信息将不会像通常那样存入缓存的inode,而是储存在间接地址块,读取文件数据时需要进行转换。间接转化可能存在好几个层次,因此,根据间接地址块是否被缓存,单一的读取可能会导致若干个I/O操作。

  基于范围的文件系统只为连续的块(区域)维护映射信息。对于一个连续大文件的块映射只由一个区域组成,此区域的大小正好可以装入inode之中。

但是,如果该文件是严重地分散和不连续的,其区块在卷中不连续,那么其块映射可以随之增长。有了基于范围的文件系统,就可以通过积极分配一大块空间来减少碎片。


目前,所选择的文件系统是的XFS,基于范围的文件系统提供有效文件预分配。

  Haystack对象存储

  Haystack是一个简单日志结构(只追加)的对象存储,包含描述存储对象的指针。一个Haystack包括两个文件——实际的包含指针的Haystack存储文件,以及一个索引文件。下图显示了Haystack存储文件的结构布局:

  第一个8KB的Haystack存储由超级块所占用。紧接着超级块的是指针,每个指针由页眉、数据、和页脚组成。

  一个指针是由其﹤Offset(偏移量), Key, Alternate Key(替换键),Cookie﹥元组唯一确定,其中偏移量是指在Haystack存储中的指针偏移量。

Haystack对于关键字的值没有任何限制,有的指针可以有多个关键字。下图显示的是索引文件的结构布局—

  在Haystack存储文件中,每个指针有一个相应的索引纪录,而且指针索引纪录的顺序必须与Haystack存储文件中相关的指针顺序相匹配。索引文件提供查找Haystack存储文件中某一特定指针所需的最小元数据。为了快速查找,把索引记录载入并组织到一个数据结构中,这是Haystack应用程序(在我们的情况下是照片存储)的职责。索引文件不是至关重要的,因为它可以根据所需从Haystack存储文件中重建。索引的主要目的是可以快速加载指针元数据到内存中,而无须遍历庞大的Haystack存储文件,这是因为索引的大小通常还不到存储文件的1%。

  Haystack写操作

  Haystack写操作同步添加新的指针到Haystack存储文件中。当指针成功添加到庞大的Haystack存储文件中之后,相应的索引记录也被写入索引文件。由于索引文件不是至关重要的,为了达到更快的性能,该索引记录是异步写。

  索引文件还会定期被刷新到下面的存储设备,以便限制由硬件故障所引起的恢复操作的程度。在系统崩溃或突然断电的情况下,Haystack恢复程序丢弃所有存储中的不完整的指针,同时截断Haystack存储文件直到最后一个有效的指针,然后,在Haystack存储文件最后为所有跟踪的孤立指针写入丢失的索引记录。


Haystack不允许覆盖已存在的指针偏移量,因此,如果某个指针的数据需要修改,其修改后的新版本必须使用相同的﹤Key, Alternate Key, Cookie﹥元组。然后应用程序就可以认为,在那些有着多个关键字的指针中,具有最大偏移量的指针就是最新添加的指针。

  Haystack读操作

  传递给Haystack读操作的参数包括指针偏移量、关键字、替换键、Cookie和数据大小。然后Haystack添加页眉和页脚的大小到数据大小中,并从文件中读取整个指针。只有当关键字、替换键和Cookie符合参数类型,所传递的数据通过校验,并且指针没有被之前的操作删除时,读操作才能成功(见下文)。

  Haystack删除操作

  删除操作很简单——通过设置指针的标记域中的一个“deleted(已删除)”标记位,标记Haystack存储中的指针为已删除。然而,相关的索引记录并不进行任何方式的修改,因此一个应用程序可能会结束于引用某个已删除的指针。对于这样的指针的读操作会注意到“deleted”标记,然后终止操作,提示操作错误,给出错误信息。已删除的指针的空间不会以任何方式回收。回收已删除指针的空间的唯一方法是压缩c(见下文) 。

  照片存储服务器

  照片存储服务器负责接收HTTP请求,并转化成相应的Haystack存储操作。为了尽量减少读取照片所需的I/ O操作次数,服务器在内存中保存一个Haystack存储文件中所有照片偏移量的索引。启动时,服务器读取Haystack索引文件并生成一个内存中的索引。由于每个节点数以亿计的照片(并且该数字只会随着更大容量的驱动器而增加),我们必须确保该索引能够装入可用的内存中。这是通过在内存中保留最少数量的元数据来实现,只保留查找照片所需的信息。


当用户上传一个照片,该照片就被分配一个唯一的64位编号。然后将照片转化为4个不同大小的图片。每个图片具有相同的随机Cookie和64位关键字,合理的图像大小(大,中,小,缩略图)是储存在替换键中。然后上传服务器调用照片存储服务器,把所有4个图像存储在Haystack中。

  内存中的索引为每张照片保存以下信息:

  Haystack使用开源Google稀疏散列数据结构来减小内存中的索引,因为使用它,每条记录只占2位。

  照片存储写/修改操作

  写操作写入照片到Haystack,并更新内存索引。如果该索引中已经包含了具有相同关键字的记录,那么这就是一个修改现有照片的操作,那么只修改索引记录偏移量,以反映新图像在Haystack存储文件中的位置。照片存储总是假设存在重复的照片(具有相同关键字的照片),只有存储在最大偏移量位置的照片是有效的。

  照片存储读操作

  传递到读操作的参数包括Haystack id 和照片关键字、大小和COOKIE 。服务器根据照片关键字,执行一个在内存索引上的查找操作,然后得到含有所需照片的指针偏移量。如果发现调用的是Haystack读操作来读取照片,那么如上所述,Haystack删除操作并不更新Haystack索引文件记录。因此,一个新的内存索引可能会包含之前删除的照片的旧记录。读取之前删除的照片将会导致操作失败,并且内存中的索引会自动更新,设置已经删除图像的偏移量为0。

  照片存储删除操作

  在调用Haystack删除操作之后,内存中的索引被更新,设置特定图像的偏移量为0来表示该图像已经被删除。

  压缩

  压缩是一个联机操作,可以回收已被删除的指针和重复指针(具有相同关键字的指针)所占用的空间。它通过复制指针创建一个新的Haystack,跳过所有重复和已删除的指针。每次这样做,就会交换文件和内存中文件的结构。

  HTTP服务器

  我们使用的HTTP框架是由开源lib event图书馆所提供的简单的evhttp服务器。我们使用多线程,同一时间内,每个线程能够处理一个HTTP请求。因为我们的工作量最主要是由I/O操作产生,因此HTTP服务器的性能并不是至关重要的。


来源:51CTO    作者:Alpha译    责任编辑:C/S框架网
本文来源:
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
上一篇:基于角色访问控制的权限系统设计
下一篇:实例讲解基于事件的银行营销系统架构
评论列表

发表评论

评论内容
昵称:
关联文章

Facebook图片存储架构技术全面
Vue+VsCode输出HelloWorld项目及项目结构
VS编译生成的DEBUG目录中所有文件格式
Winform快速开发框架之存储图片资源解决方案|C/S框架网
C/S结构的Winform系统图片存储策略
Winform+DevExpress框架之独立图片存储解决方案|C/S框架网
MiniFramework蝇量开发框架技术架构介绍
C#使用SharpCompress压缩文件(.rar.zip)
ExecuteSql 执行SQL存储过程
通用图片处理类CImageLibrary,预设存储JPG格式|C/S框架网
ExecuteSql 执行SQL脚本/存储过程
调用存储过程或LinkServer出错:拒绝了对对象 xxx架构 'sys')的EXECUTE权限
C# Image图片格式转换(gif/jpg/png/bmp)
C# ImageHelper 图片帮助类
ImageController – 图片资源控制器 - CSFramework.WebApi后端框架
FastReport.NET报表打印多张图片
拼接SQL查询条件传入SP存储过程
Oracle数据库元数据查询(数据库、表结构、存储过程)
GoF设计模式:命令模式(Command Pattern)—请求发送者与接收者
C#图片转换类支持按比例缩放图片

热门标签
软件著作权登记证书 .NET .NET Reactor .NET5 .NET6 .NET7 .NET8 .NET9 .NETFramework APP AspNetCore AuthV3 Auth-软件授权注册系统 Axios B/S B/S开发框架 B/S框架 BSFramework Bug Bug记录 C#加密解密 C#源码 C/S CHATGPT CMS系统 CodeGenerator CSFramework.DB CSFramework.EF CSFramework.License CSFrameworkV1学习版 CSFrameworkV2标准版 CSFrameworkV3高级版 CSFrameworkV4企业版 CSFrameworkV5旗舰版 CSFrameworkV6.0 CSFrameworkV6.1 CSFrameworkV6旗舰版 DAL数据访问层 Database datalock DbFramework Demo教学 Demo实例 Demo下载 DevExpress教程 Docker Desktop DOM ECS服务器 EFCore EF框架 Element-UI EntityFramework ERP ES6 Excel FastReport GIT HR IDatabase IIS JavaScript LINQ MES MiniFramework MIS MySql NavBarControl NETCore Node.JS NPM OMS Oracle资料 ORM PaaS POS Promise API PSD RedGet Redis RSA SAP Schema SEO SEO文章 SQL SQLConnector SQLite SqlServer Swagger TMS系统 Token令牌 VS2022 VSCode VS升级 VUE WCF WebApi WebApi NETCore WebApi框架 WEB开发框架 Windows服务 Winform 开发框架 Winform 开发平台 WinFramework Workflow工作流 Workflow流程引擎 XtraReport 安装环境 版本区别 报表 备份还原 踩坑日记 操作手册 达梦数据库 代码生成器 迭代开发记录 功能介绍 国际化 基础资料窗体 架构设计 角色权限 开发sce 开发工具 开发技巧 开发教程 开发框架 开发平台 开发指南 客户案例 快速搭站系统 快速开发平台 框架升级 毛衫行业ERP 秘钥 密钥 权限设计 软件报价 软件测试报告 软件加壳 软件简介 软件开发框架 软件开发平台 软件开发文档 软件授权 软件授权注册系统 软件体系架构 软件下载 软件著作权登记证书 软著证书 三层架构 设计模式 生成代码 实用小技巧 视频下载 收钱音箱 数据锁 数据同步 微信小程序 未解决问题 文档下载 喜鹊ERP 喜鹊软件 系统对接 详细设计说明书 新功能 信创 行政区域数据库 需求分析 疑难杂症 蝇量级框架 蝇量框架 用户管理 用户开发手册 用户控件 在线支付 纸箱ERP 智能语音收款机 自定义窗体 自定义组件 自动升级程序
联系我们
联系电话:13923396219(微信同号)
电子邮箱:23404761@qq.com
站长微信二维码
微信二维码