`

Facebook如何管理150亿张照片

阅读更多

Facebook 的照片分享很受欢迎,迄今,Facebook 用户已经上传了150亿张照片,加上缩略图,总容量超过1.5PB,而每周新增的照片为2亿2000万张,约25TB,高峰期,Facebook 每秒处理55万张照片,这些数字让如何管理这些数据成为一个巨大的挑战。本文由 Facebook 工程师撰写,讲述了他们是如何管理这些照片的。

旧的 NFS 照片架构

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

  • 上传层接收用户上传的照片并保存在 NFS 存储层。
  • 照片服务层接收 HTTP 请求并从  NFS 存储层输出照片。
  • 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在保持低成本的基础上实现了很好的性能和冗余。不佳的写性能可以通过高速缓存解决,硬盘缓存被禁用以防止断电损失。

文件系统

Haystack 对象库是建立在10TB容量的单一文件系统之上。文件系统中的每个文件都在一张区块表中对应具体的物理位置,目前使用的文件系统为 XFS。

Haystack 对象库

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

Haystack 对象存储结构

指针和索引文件结构

Haystack 写操作

Haystack 写操作同步将指针追加到 haystack 存储文件,当指针积累到一定程度,就会生成索引写到索引文件。为了降低硬件故障带来的损失,索引文件还会定期写道存储空间中。

Haystack 读操作

传到 haystack 读操作的参数包括指针的偏移量,key,代用Key,Cookie 以及数据尺寸。Haystack 于是根据数据尺寸从文件中读取整个指针。

Haystack 删除操作

删除比较简单,只是在 Haystack 存储的指针上设置一个已删除标志。已经删除的指针和索引的空间并不回收。

照片存储服务器

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

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

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

Haystack 使用 Google 的开源  sparse hash data 结构以保证内存中的索引缓存尽可能小。

照片存储的写/修改操作

写操作将照片数据写到 Haystack 存储并更新内存中的索引。如果索引中已经包含相同的 Key,说明是修改操作。

照片存储的读操作

传递到 Haystack 的参数包括 Haystack ID,照片的 Key, 尺寸以及 Cookie,服务器从缓存中查找并到 Haystack 中读取真正的数据。

照片存储的删除操作

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

重新捆扎

重新捆扎会复制并建立新的 Haystack,期间,略过那些已经删除的照片的数据,并重新建立内存中的索引缓存。

HTTP 服务器

Http 框架使用的是简单的 evhttp 服务器。使用多线程,每个线程都可以单独处理一个  HTTP 请求。 

结束语

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

本文国际来源:http://www.facebook.com/FacebookEngineering#/note.php?note_id=76191543919&ref=mf
中文翻译来源:COMSHARP CMS 官方网站

分享到:
评论
2 楼 yeuego 2011-03-28  
55W次,完全使用专用的服务器设备来执行

猜:
   分流设备
   分给http服务器服务群处理
   转向缓存服务器群
   最终数据服务器群
1 楼 restart1107 2011-03-28  
不知道有多少台机器来支撑这个一秒55w次的并发

相关推荐

    23-Facebook 代码管理.doc

    ### Facebook的代码管理机制 #### 一、概述 Facebook作为全球知名的社交网络平台,其背后的技术支持和代码管理体系一直是IT行业内研究的重点。本文基于“23-Facebook 代码管理.doc”文档的内容,深入探讨Facebook...

    适用于iOS的照片库, 与Facebook照片浏览器类似的功能.zip

    在iOS平台上,构建一个类似于Facebook照片浏览器的图片库是一项挑战性的任务,因为它需要结合用户友好的界面、高效的图片加载和流畅的滚动体验。这个开源项目,"EBPhotoPages",正是为了解决这一问题而设计的。下面...

    Flickr称照片上传数达60亿张 恐将沦为小众站点.docx

    Facebook作为一个强大的社交网络平台,其照片上传量在2021年10月就已经达到100亿张,而且每天新增1亿张照片,使得Flickr在短短两个月内的上传量就可能被Facebook超越。此外,Facebook将照片共享功能与其核心社交功能...

    facebook的项目开发流程和工程师的绩效管理机制(35页).pdf

    Facebook是全球知名的社交媒体巨头,其项目开发流程和工程师的绩效管理机制备受业界关注。这篇35页的PDF文档深入探讨了Facebook如何构建高效且创新的工作环境,以及如何通过独特的管理方式推动团队发展。 首先,...

    FaceBook客户端

    Facebook(脸书)是美国的一个社交网络服务网站 ,创立于2004年2月4日,总部位于美国...Facebook是世界排名领先的照片分享站点,截至2013年11月每天上传约3.5亿张照片。截至2012年5月,Facebook拥有约9亿用户。

    Facebook基础培训.pptx

    首先,Facebook作为一个全球性的社交媒体平台,其用户基数庞大,覆盖超过150个国家和地区,拥有超过12亿的活跃用户,超越了Google等其他知名网站,成为全球访问量最大的网站。Facebook的用户粘性非常高,每天有超过...

    Facebook效应

    每月有超过10亿张照片和1000万个视频被上传,每周有超过10亿条内容被分享,活跃着的用户小组超过4500万个,这一切构成了Facebook独特的“互联网基因工程”。 ### 扎克伯格的领导与愿景 马克·扎克伯格作为Facebook...

    facebook api和facebook_jar包

    Facebook API和Facebook_JAR包是开发者用来与Facebook平台进行交互的重要工具,它们使得开发者能够创建应用程序,集成到Facebook生态系统中,实现数据交换、用户登录验证、发布内容等功能。Facebook API通常指的是...

    如何创建Facebook商务管理平台(BM)

    "Facebook商务管理平台(BM)创建指南" Facebook商务管理平台(BM)是Facebook提供的一款功能强大且实用的工具,旨在帮助企业和个人用户更好地管理和组织业务。该平台允许用户在一个平台上运行和跟踪广告、管理资产、...

    facebook memcache

    每月上传到网站的照片超过30亿张,每秒上传照片的数量为23张。每周分享的内容(包括网页链接、新闻故事、博客文章、笔记、相册等)超过50亿件,平均每秒分享8千件。平均每个用户在网站上有130个好友,整个社交网络中...

    Facebook Twine集群管理系统

    Facebook Twine集群管理系统 Facebook Twine集群管理系统是Facebook开发的一种统一的集群管理系统,旨在管理共享基础设施中的机器和服务。该系统的设计目标是提供一种高效、灵活、可扩展的集群管理解决方案,以满足...

    facebook分享

    - 考虑权限管理,确保应用在分享前已经获得了必要的权限,如`INTERNET`和`READ_EXTERNAL_STORAGE`(如果涉及到读取本地图片)。 - 使用Facebook的Open Graph或App Links技术,以提高分享内容在Facebook上的呈现效果...

    Facebook公开的多线程管理方法

    Facebook作为全球知名的社交网络平台,其系统架构必然需要处理海量的用户请求和复杂的业务逻辑,因此对多线程管理有着深入的研究和实践。本篇文章将围绕Facebook公开的多线程管理方法进行详细解析,帮助读者理解和...

    Facebook-Android-sdk-4.8.2

    Facebook Android SDK 4.8.2 是Facebook提供的一款用于帮助Android开发者在其应用中集成Facebook功能的开发工具包。这个版本的SDK包含了实现Facebook登录、分享、邀请、广告以及分析等功能所需的库和资源。通过使用...

    预测facebook签到位置

    Facebook签到位置预测是一个涉及大数据分析、地理位置服务和社交网络行为学的复杂主题。在这个问题中,我们关注的是如何利用用户在Facebook上分享的签到信息来预测他们可能的未来签到位置。以下是对这个话题的详细...

    faceBook 数据库详细说明

    Facebook 数据库是一个复杂而庞大的系统,它支撑着全球最大的社交网络平台,每天处理数十亿用户的交互数据。在“facebook.jpg”这个文件中,很可能是Facebook数据库的某种结构或设计概念的示意图。虽然具体的内容...

    facebook的架构(PDF)

    Facebook是全球最大的社交媒体平台之一,其背后有着复杂的网络架构来支撑数亿用户的日常互动。这份“Facebook的架构”PDF文件详细介绍了这个庞然大物的技术基础。以下是对这份文档内容的概览: Facebook架构的核心...

    基于C#的Facebook开发包

    4. **事件和页面管理**:对于需要管理Facebook事件或页面的应用,SDK提供了相应的接口,可以创建、编辑和管理这些对象。 5. **分享和社交插件**:集成SDK后,开发者可以方便地添加Facebook分享功能,让用户能够将...

    wordpress WooCommerce Facebook 多像素插件

    "WordPress WooCommerce Facebook 多像素插件"就是这样一个工具,它允许用户在 WooCommerce 商店中轻松地添加和管理多个 Facebook 像素。 首先,我们来理解一下 Facebook Pixel。Facebook Pixel 是一个代码片段,当...

Global site tag (gtag.js) - Google Analytics