存储数十亿照片,Facebook如何做到?

  分享照片已经是Facebook上最流行的的功能之一。而截至到目前,用户已经上传了超过15亿张照片,因此这就使得Facebook成为了最大的照片共享网站。而对于每一个上传的照片,Facebook都会生成并存储四个大小不同的图像,于是就转化成为了共60亿张的照片,而总容量已经超过1.5PB。在目前,以每周220万新照片的速度增长,这就相当于每周要额外增加25TB的存储。而在高峰期每秒需要传输55万照片。这些数字对于Facebook的照片存储基础设施来说,是一个重大的挑战。

  旧的NFS 照片架构

  老的照片系统架构分为了以下几个层:

  上传层接收用户上传的照片并会保存在 NFS 存储层。

  照片服务层接收 HTTP 请求并从 NFS 存储层输出照片。

  NFS存储层建立在商业存储系统之上。

  因为每张照片都以文件形式单独存储,这样庞大的照片量导致非常庞大的元数据规模,超过了 NFS 存储层的缓存上限,导致每次请求上传都包含多次I/O操作。庞大的元数据成为整个照片架构的瓶颈。这就是为什么 Facebook主要依赖 CDN 的原因。为了解决这些问题,他们做了两项优化:

  因为每张照片都以文件形式单独存储,大量为目录及文件在NFS 存储层上产生了大量的元数据, 这个规模的元数据量远远超过了超过了NFS 存储层的缓存上限,导致每次招聘请求会上传都包含多次I/O操作。庞大的元数据成为整个照片架构的瓶颈。这就是为什么 Facebook主要依赖 CDN 的原因。为了解决这些问题,他们做了两项优化:

  Cachr: 一个缓存服务器,缓存 Facebook 的小尺寸用户资料照片。

  NFS文件句柄缓存:部署在照片输出层,以降低 NFS 存储层的元数据开销。

  新的 Haystack 照片架构

  新的照片架构将输出层和存储层合并为一个物理层,建立在一个基于HTTP 的照片服务器上,照片存储在一个叫做haystack 的对象库,以消除照片读取操作中不必要的元数据开销。新架构中,I/O 操作只针对真正的照片数据(而不是文件系统元数据)。haystack 可以细分为以下几个功能层:

  HTTP 服务器

  照片存储

  Haystack 对象存储

  文件系统

  存储空间

  在下面的介绍中,我们会对于上述的每个功能层做详细的讲述。

  存储空间

  Haystack 部署在商业存储刀片服务器上,典型配置为一个2U的服务器,包含:

  两个4核CPU

  16GB – 32GB 内存

  硬件 RAID,含256-512M NVRAM 高速缓存

  超过12个1TB SATA 硬盘

  每个刀片服务器提供大约10TB的存储能力,使用了硬件 RAID-6, RAID 6在保持低成本的基础上实现了很好的性能和冗余。不佳的写性能可以通过RAID控制器和NVRAM缓存回写解决,写由于读取大多是随机的,NVRAM缓存是完全用于写入的。

  文件系统

  Haystack 对象库是建立在10TB容量的单一文件系统之上。

  图片读取请求需要在读取系统调用这些文件的位置偏移,但是为了执行读取操作,文件系统必须先找到实际物理卷上的数据。文件系统中的每个文件都被一个叫做inode结构标识。inode包含了一个磁盘上逻辑文件偏移和物理区块偏移的映射。在使用的特殊类型文件系统时大文件块映射可能相当大。

  基于文件系统的区块为给个逻辑区块和大文件保存映射。这些信息通常不适合保存在inode的缓存中,而是存储在在间接地址块。所以在读取文件的时候必须按照特定的流程。这里可以多个是间接地址块,所以一个读取会产生多个I/O取决于是否间接地址块被缓存。

  该系统只为连续范围的区块保持映射。一个连续的大文件的块映射可以只由一个范围的标识,这样是适应inode的系统需求的。但是,如果该文件是一个被切割的不连续的块的话,他的块地图可能非常的大。以上可以通过文件系统主动为大的物理文件分配大块的空间来减少碎片。

  目前使用的文件系统为XFS,一个很大程度提供高效的文件预分配系统。

  Haystack 对象存储

  Haystack 是一个简单的日志结构(只能追加),存储着其内部数据对象的指针。一个 Haystack 包括两个文件,包括指针和索引。

  haystack最前面的8K存储是被超级块占用。紧随超级块是针,每针组成的一个头部,数据和尾部:

  一个针被他的元组标识,其中的偏移量为其在haystack存储的偏移。Haystack不在任何健值上做限制,即允许可以有重复键针。下图显示了索引文件的布局:

  在haystack存储文件中有每针相应的的索引记录,并且包含针索引记录的顺序必须和haystack存储文件相关的针的顺序相匹配。按照规定索引文件的最低需求是找到一个特定的针在haystack存储文件的元数据。载入和组织索引记录到一个有效的查找数据结构是Haystack程序的责任。索引文件是不是很关键,因为如果需要它可以从haystack存储文件重建。索引的主要职责是让针元数据无需通过较大的Haystack存储文件,快速加载到内存中。原因是其可以让索引编程原来存储的1%。

  Haystack 写操作

  Haystack 写操作同步将指针追加到 haystack 存储文件,当指针积累到一定程度,就会生成索引写到索引文件。由于索引文件是不是很关键,为了能有更快的性能所以采用异步的方式进行写入。

  为了降低硬件故障带来的损失,索引文件还会定期写到存储空间中。在崩溃或突然断电的情况下,将haystack恢复处理器存储中任何残缺的针和截断haystack存储中最后一个有效的针。接下来,它会把丢失的针的索引记录 写到haystack文件的最后。

  Haystack不允许重写现有的针偏移,如果一个针数据需要被重写,那么新版本必须使用相同的元组。应用程序会自动分辨出这两个相同的键,有最大偏移的便是最新的那一个。

  Haystack 读操作

  传到 haystack 读操作的参数包括指针的偏移量,健,备用键,Cookie 以及数据大小。Haystack为数据大小添加头部和尾部的长度,然后根据数据尺寸从文件中读取整个指针。读取操作成功的关键就是作为参数传递的健,备用键,Cookie是否匹配,数据是否通过了校验,并且针没有被删除掉。(见下文)

  Haystack 删除操作

  删除操作比较简单 – 只需要在 Haystack 存储的指针字段中的“删除”位标记一下即可。并且,相关的索引记录不会做任何的修改。是最终的应用程序引用到的是一个删除的针。像这样一个读取删除针的操作将会返回一个相应的错误给应用程序。空间对已删除的针不做任何的回收,只有这样,才能使 haystack 的空间非常的紧凑。(见下文)

  照片存储服务器

  照片存储服务器负责接受 HTTP 请求,并转换成相应的 Haystack 操作。为了尽量减少服务器检索照片时的I/O操作,该服务器维护着全部 Haystack 中文件索引的缓存。服务器启动时,系统就会将这些索引读到缓存中。由于每个节点都有数百万张照片,必须保证索引的容量不会超过服务器的物理内存。在内存中仅需要保存查找照片所需的少量元数据即可。

  对于用户上传的图片,系统分配一个64位的独立ID,照片接着被缩放成4种不同尺寸,每种尺寸的图像拥有相同的随机 Cookie 和64位的密钥,图片尺寸描述(大,中,小,缩略图)被存在代用key 中。接着上传服务器通知照片存储服务器将这些资料连同图片存储到 haystack 中。

  每张图片的索引缓存包含以下数据:

  由于Google的开源 sparse hash data 结构对于每个条目只有2bit的开销,所以Haystack使用它来保证内存中的索引缓存尽可能小。

  照片存 储的写/修改操作

  写操作将照片数据写到 Haystack 存储并更新内存中的索引。如果该索引记录中包含了相同的键,那么这是一次对现有的照片进行修改的操作。并且只要修改索引记录中的偏移来反应新图像在haystack存储文件的位置。照片存储始终假定,如果有重复的图像(图像具有相同的键),有较大的偏移量的那个存储是有效的。

  照片存储的读操作

  传递给一个读操作的参包括Haystack ID,照片的 Key, 尺寸以及 Cookie。服务器事先在缓存中按照照片的Key和所需文件的偏移进行查找。如果找到了它,并向haystack发出读取词图像的请求。按照上面说的,haystack的删除操作并不更新它的索引记录,因此添加到内存中的索引可以包含以前删除的照片的内容。当阅读以前的删除的照片失败后,系统将在内存的索引中色绘制词图片的偏移量为0.

  照片存储的删除操作

  通知 Haystack 执行删除操作之后,内存中的索引缓存会被更新,将偏移量设置为0,表示照片已被删除。

  重新整理(压缩)

  重新整理(压缩)是一种回收删除和重复的针(针使用相同的Key)的在线操作。它会通过复制针跳过任何重复或删除的条目创建一个新的 haystack。一旦此操作完成它就回去替换掉内存中的文件和结构。

  HTTP 服务器

  Http 框架使用的是简单的基于开源的libevent库的 evhttp 服务器。使用多线程,每个线程都可以单独处理一个 HTTP 请求。因为我们的系统消耗大多是I/O操作,HTTP服务器的性能并不很重要。

  结束语

  Haystack 是一个基于 HTTP 的对象存储,包含指向实体数据的指针,该架构消除了文件系统元数据的开销,并实现将全部索引直接存储到缓存,以最小的 I/O 操作实现对照片的存储和读取。

  本文作者为Facebook的工程师Peter Vajgel, Doug Beaver 和 Jason Sobel, 由标点符进行翻译。

  原文链接(E文):http://www.facebook.com/note.php?note_id=76191543919&ref=mf

时间: 2024-08-01 11:43:57

存储数十亿照片,Facebook如何做到?的相关文章

Facebook是如何存储数十亿照片的

分享照片是Facebook上最流行的的功能之一.截至目前,用户已经上传超过15亿张照片,这使得Facebook成为最大的照片共享网站.对于每一个上传的照片,Facebook都生成并存储四个大小不同的图像,从而转化为共60亿张照片,总容量超过1.5PB.目前以每周220万新照片的速度增长,相当于每周要额外增加25TB存储.在高峰期每秒需要传输55万照片.这些数字对Facebook的照片存储基础设施的一个重大的挑战. 旧的 NFS 照片架构 老的照片系统架构分以下几个层: 上传层接收用户上传的照片并

如何做到“恰好一次”地传递数十亿条消息

在分布式领域中存在着三种类型的消息投递语义,分别是:最多一次(at-most-once).至少一次(at-least-once)和恰好一次(exactly-once).本文作者介绍了一个利用Kafka和RocksDB来构建的"恰好一次"消息去重系统的实现原理. 对任何一个数据流水线的唯一要求就是不能丢失数据.数据通常可以被延迟或重新排序,但不能丢失. 为了满足这一要求,大多数的分布式系统都能够保证"至少一次"的投递消息技术.实现"至少一次"的投递

权威详解 | 阿里新一代实时计算引擎 Blink,每秒支持数十亿次计算

作者介绍 王峰,淘宝花名"莫问",2006年毕业后即加入阿里巴巴集团,长期从事搜索和大数据基础技术研发工作,目前在计算平台事业部,负责实时计算北京研发团队. 在阿里巴巴的11年工作期间,持续专注大数据计算与存储技术领域,基于Hadoop开源生态打造的数据基础设施一直服务于搜索.推荐等阿里核心电商业务场景,最近一年带领团队对Apache Flink进行了大量架构改进.功能完善和性能提升,打造出了阿里新一代实时计算引擎: Blink.目前数千台规模的Blink生产集群已经开始在线支持搜索.

维基解密再爆猛料:CIA利用漏洞入侵全球数十亿个人电子设备

美国当地时间本周二,维基解密称他们获取到了8761份来自美国中央情报局(下称CIA)的文件.这些文件透露了美国政府的强大黑客工具可以通过监控数十亿人的日常电子设备来窥探大家的隐私,电视.智能手机甚至杀毒软件都有可能受到CIA的黑客入侵.一旦入侵后,他们能够获取你的声音.图像和短信信息,甚至是经过加密软件处理的聊天内容. 据维基解密所说,这些数据代号为Vault 7,文件日期介于2013年和2016年之间,据说是已公布的相关CIA最大规模的机密文档,文件细数了CIA所用的网络入侵工具及其拥有的入侵

互联网公司如何使用数十亿人的个人数据?

被推送.被记录.被打标签.被索引.被简报.被盘问.被编号--所有这一切都是互联网公司的日常行为. 数据收集产业,这个靠着从社交媒体和移动设备上搜集信息片段获利的行业,影响每个人的生活,却不受任何有意义的监管审查.     上周,位于奥地利维也纳的文化倡导组织 "破解实验室( Cracked Labs)",发布了一份长篇报告,称"数字环境下,个人频繁被调查评估,被分类编组,排名排位,编号量化,包含/排除,并由此被区别对待." 该报告题为<日常生活中的大规模监视:

谷歌的数十亿代码就放在这个地方......

谷歌作为世界上最大的科技巨头之一,拥有数十亿行的代码存储,这些代码存放在不断增大的共享共享源码库之中,这一数据库拥有一个控制系统进行管理. 该代码库包含了86TB数据,约10亿个文件(包括重复文件)和3500万行注解,其中有900万个唯一的源文件,这其中包含约20亿行代码.谷歌每个工作日都要向这个数据库递交4万次命令,其中1.6万次为程序员完成,2.4万次由自动系统完成.这个代码库在高峰时的查询速度达到了80万次/秒,在平时的工作日也达到了50万次每秒的查询量. 系统支持方面,建立伊始,这个数据

利用SS7漏洞可追踪全球数十亿部手机 黑客千里之外窃听澳洲议员

本文讲的是 利用SS7漏洞可追踪全球数十亿部手机 黑客千里之外窃听澳洲议员,澳大利亚版电视节目<60分钟时事>(60 Minutes)展示了黑客如何在数千公里外的德国窃听并追踪澳洲参议员 存在于现代通讯技术中的一个大型安全漏洞使得全球数十亿手机用户的数据可能遭到秘密窃取,黑客可以窃听电话并追踪受害者地理位置. 手机信令系统System Signalling Number 7(SS7)存在漏洞,黑客.骗子.流氓政府和肆无忌惮的商业运营商得以使用数以百计的在线端口进行入侵. "六十分钟时

中信资本数十亿日元收购特耐王集团多数股权

ChinaVenture北京时间8月13日下午消息,据路透社消息,中信集团旗下的私人直接投资公司中信资本收购了位于东京的纸箱制造商Tri-Wall KK(特耐王集团)的多数股权. 中信资本在此次收购中共支付了数十亿日元,同时计划支持Tri-Wall KK的扩张并助其在数年内在香港上市. 据称,Tri-Wall KK重型纸板的大部分亚洲业务来源于日本之外,该部分销售额占比高达75%.Tri-Wall KK方面表示欢迎中信资本成为其主要投资人,部分原因是公司希望在香港上市. 中信资本于2004年开始

广西甘肃科博会签数十亿元大单

本报讯(记者古晓宇)昨天,组团参加本届科博会的广西.甘肃两省份分别在科博会上与相关企业签署了价值数十亿元的合作协议. 在科博会上,广西代表团重点发布了"千亿元产业重大科技攻关工程"需求的项目35个,其中有22个项目昨天与相关企业进行了集中签约,签约金额达38.67亿元. 甘肃代表团此次组织了102项科研成果和专利技术参加科博会,其中有8个项目进行了集中签约,签约金额达33.92亿元.