Facebook 用户已经上传了150亿张照片,加上每张照片有四个不同尺寸的缩略图,就共有600多亿张图片,总容量超过1.5PB,而每周新增的照片为2亿2000万张,约25TB,高峰期,Facebook 每秒处理55万张照片,这些数字让如何管理这些数据成为一个巨大的挑战。
旧的 NFS 照片架构
老的照片系统架构分以下几个层存储在 Netapp NAS上:
上传层接收用户上传的照片并保存在 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 操作实现对照片的存储和读取。

【服务器】Facebook如何处理海量图片存储相关推荐

  1. HBase解决海量图片存储方案

    随着互联网.云计算及大数据等信息技术的发展,越来越多的应用依赖于对海量数据的存储和处理,如智能监控.电子商务.地理信息等,这些应用都需要对海量图片的存储和检索.由于图片大多是小文件(80%大小在数MB ...

  2. 详解如何处理海量定时任务

    一节课让你搞懂如何处理海量定时任务 1. 定时器设计 2. 如何高效检测连接? 3. 时间轮实现以及应用精讲 视频讲解如下,点击观看: 王者荣耀如何处理海量定时任务丨Linux服务器开发丨后端开发丨L ...

  3. 从 Server Timing Header 看服务器是如何处理请求的

    原文作者:Florian Hämmerle      译者:UC 国际研发 Jothy   写在最前:欢迎你来到"UC国际技术"公众号,我们将为大家提供与客户端.服务端.算法.测试 ...

  4. 揭秘淘宝286亿海量图片存储与处理架构,互联网营销

    [IT168 专稿]8月27日下午,在IT168系统架构师大会存储与系统架构分论坛上,淘宝网技术委员会主席,淘宝网核心工程师章文嵩向我们详细介绍了淘宝网图片处理与存储系统的架构.章文嵩博士的演讲日程包 ...

  5. 淘宝网 286亿海量图片存储与处理架构

    LVS创始人,淘宝网技术委员会主席,淘宝网核心工程师章文嵩先生 本文侧重介绍淘宝网后台的图片存储系统架构.包括TFS集群文件系统,以及前端处理服务器架构.该系统前端CDN架构,以及淘宝网在节能服务器应 ...

  6. 阿里再推内置锂电池服务器 Facebook等国际巨头也上马相关技术

    传统数据中心供电架构(采用了集中式UPS)下,从电网到服务器主板有高达21%到27%的能源被浪费,同时也为运维带来了不稳定因素,因此许多数据中心运营商试图实现新的突破. 阿里巴巴在服务器内部嵌入锂电池 ...

  7. 罗强:腾讯新闻如何处理海量商业化数据?

    导读: 随着信息化时代的来临,信息呈现出爆炸式的增长.尤其是在移动互联网的推动下,每天大量信息涌入让人们应接不暇,腾讯新闻客户端的出现,就是以帮助用户寻找有用信息而出现.这时,面对海量的数据.繁多的业 ...

  8. 海量服务 | 论服务器极致化海量运营交付的未来

    看标题一定会有些歧义, 总觉着是来讨论航运的, 其实是来和大家研讨我厂海量服务器的营运. 出厂诞生之后, 经过物流环节抵达指定数据中心, 移动上架构后通过检测和配置, 再交付应用部门使用,在数据中心恒 ...

  9. 面对大规模系统工程,看Facebook如何处理故障排查(一)

    作者介绍:Ben Maurer是Facebook的网络基础团队的技术领先者,主要负责整个Facebook面向用户产品的性能和可靠性.Ben于2010年正式加入Facebook,基础设施团队的成员.在加 ...

  10. 修改客户端 与服务器断开,如何处理服务器或客户端socket断开

    <如何处理服务器或客户端socket断开>由会员分享,可在线阅读,更多相关<如何处理服务器或客户端socket断开(10页珍藏版)>请在人人文库网上搜索. 1.编程经验谈 如何 ...

最新文章

  1. [知识库分享系列] 三、Web(高性能Web站点建设)
  2. 使用VAE、CNN encoder+孤立森林检测ssl加密异常流的初探——真是一个忧伤的故事!!!...
  3. LeetCode Single Number II(位操作)
  4. linux下如何查看程序写入内存数据_linux到底如何正确关机
  5. ios beta 下载_如何回滚到iOS 10(如果您使用的是iOS 11 Beta)
  6. 新手一小时就写出人工智能应用 - 看图识熊
  7. java用mysql存储图片_Java存储图片到Mysql
  8. Servlet转发forward和重定向response.sendRedirect()区别
  9. 【PostgreSQL-9.6.3】表空间
  10. [译]JS闭包:For循环中的setTimeout
  11. 卸载ruby on rails
  12. 48 页小米用户画像实战PPT
  13. 我的爷爷(知识渊博的下乡知青)
  14. BootStrap3 排版
  15. 收藏的博客 -- Qt有关的GitHub/Gitee开源项目
  16. 跨世代保留精英遗传(基因)算法(intergenerational reserved Elitism Genetic Algorithm)
  17. Colab运行沐神《动手学深度学习》:ImportError: cannot import name ‘_check_savefig_extra_args‘ from ‘matplotlib.back
  18. 电脑换固态装系统总结
  19. C语言散列法求英文字母字符串求余,c语言求余数
  20. 蓝桥杯-算法训练-跳马

热门文章

  1. 虚拟机使用主机摄像头 ” usb chicony lenovo easycamera 连接失败,驱动错误“
  2. 5分钟快速安装ASP.NET Core 网站运行环境
  3. 计算机网络及光纤通信实验教程,电子科技大学光纤通信视频教程
  4. MATLAB周期时域曲线,matlab时域采样定理
  5. 常见电容器图片_最强汇总:燃油锅炉常见故障分析与解决方法简单粗暴!编辑不易!...
  6. 交通信号灯规范国家标准出台
  7. Unity使用HDR做天空盒
  8. mb778cn 计算机故障或繁忙,松下 KX-MB778CN驱动
  9. AspUpload组件的方法中文说明
  10. 2021年武大计算机学院研究生,武汉大学