Facebook存储65亿张照片的存储框架

2023-11-12

 

Facebook存储65亿张照片的存储框架

 

从未用过Facebook,但是还是对Facebook应对大容量的非结构化数据存储方案感兴趣。本文是通过在线网络广播(webcast)经本人翻译得来的,因此,本人并不能确保本文中叙述的内容与原文webcast不存在偏差。

 

本文严禁在未征得本人同意的情况下以任何形式进行转载。本人直接受在邮件中的转载申请,如需转载,请发送邮件至 betteryou@126.com
   
   

  
  
   
    
  
  
Facebook概况
   
   

  
  
   
   
  
  
·         Facebook目前拥有65亿张照片,每张照片分别会保存为4~5种尺寸的文件,所以大概会有300亿个文件,大约占据540TB的存储空间。
   
   

  
  
   
   
  
  
·         Facebook平均的请求流量是475,000张图片/秒;其中,关于概况(Profile)的照片请求量大约是200,000/秒。
   
   

  
  
   
   
  
  
·         Facebook每周大约会收到1亿次上载请求。
   
   

  
  
   
   
  
  

所以,Facebook需要在海量的数据存储中高效读取和存储数据。Facebook目前有25名开发工程师负责开发,他们大部分的工作都集中在如何让Facebook的数据库性能更优化,如何让Facebook的数据库可扩展性更好,等等方面的工作上。

 

目前,Facebook拥有数千台服务器(虽然webcast的片子上有一则新闻说已经达到10,000台服务器,但webcastJason还是说的是数千台——thousands of servers),这些服务器大部分都有明确的分工,各司其职;使用MySQL数据库;PHP运行在Apache上,并且用C开发了一些扩展和封装;在Facebook的应用层和数据库层之间,他们使用了Memcached技术,作为缓存。

 

小贴士:何谓Memcached

Memcached是首先由Danga InteractiveLive Journal开发的通用分布式内存缓存系统。它通常通过将对象和数据缓存至内存的方法来加快动态数据库驱动网站的速度,减少了数据库访问的次数。Memcached缺少安全认证特性,这就意味着它必须在正确配置的防火墙内运行。MemcachedAPI提供了分布在多台计算机上的巨大哈希表(Hash Table)。当哈希表满了之后,新插入的数据会使用LRU算法(最近最少使用算法)将较老的数据擦洗掉。YouTubeLiveJournalWikipediaSourceForgeFacebookNYTimes.com等知名网站都使用了Memcached

 

 

Facebook当前存储架构

 

注:我暂且称之为当前存储架构,原因有二:第一是webcastPPT当中出现的是”State of the World”字样,表明现在的状况;第二是新的存储架构Haystack并未在webcast中明确表示已经进入生产环境。如描述有错误,欢迎各位积极指正。

 

Facebook的存储架构需要应对两方面的问题:读和写。我们分开来观察。

 

写:

 

 

当用户需要上载照片,也就是对Facebook的存储进行写入操作的时候,Facebook会指定一台上载服务器来进行工作。上载服务器会对上载的照片进行处理,每张照片会按照4~5种不同的尺寸进行存储。

 

读:

 

当用户需要对照片进行读取时,架构会稍微复杂一些:

 

 

 

当用户点击某张照片后,请求将通过HTTP传到CDN (Content Delivery Network)CDN中已经缓存了一些照片,如果请求的照片在CDN中,就可以将照片返回给用户。如果照片未在CDN中,那么就有两种情况发生。

  • 如果请求的是普通照片,则请求会传递到不同的照片服务器(Photo Server),照片服务器去读取后台Netapp存储的数据。
  • 如果请求的是基本资料(Profile)上的照片,那么读取该照片的请求会到一个叫“Cachr”,Cachr是一个超轻量级的服务器,专门负责缓存基本资料相关的照片。如果在Cachr中依然没有找到照片,就需要通过照片服务器(Photo Server)去读取后台Netapp存储的数据了。

 

目前,FacebookCachr可扩展性和稳定性良好,对基本资料(Profile)上照片的请求大概在200,000/秒,占总请求数量的一半还强,Facebook大约有40Cachr节点,运行了4年多,并未出现大问题。照片服务器(Photo Server)采用文件处理缓存(File Handle Cache)技术,旨在提高照片的读取性能。

 

架构上的问题

 

刚才简单介绍了整个Facebook存储架构,但这个架构存在着一些问题:

  • 第一,无论是Netapp还是别的文件系统都会造成元数据(metadata)爆炸性增长。他们使用一个文件一个元数据(metadata)的方式,而且每个文件系统都强制使用目录等层次性结构,这样就势必增加了与真正所需数据无关的内容。所以,对于Facebook来说,大约需要进行3次磁盘IO才能成功读取一张图片(在刚刚设计之初,IO的次数需要达到15次,所以3次已经是非常优化的结果了)
  • 第二,正是由于对文件系统中图片读取的代价增大,所以Facebook不得不更加依赖于高效的数据缓存来解决磁盘IO造成的矛盾。目前,FacebookCDN中的基本资料访问命中率达99.8%,普通图片的访问命中率达92%,这样才降低了对文件系统的访问量

 

Haystack

 

Facebook引入Haystack的原因是为了减少元数据(metadata)的使用。对于Haystack来说,可以将一些图片捆绑在一起,然后这些文件统一使用一个单独的元数据(metadata)。那么这样的话,怎么能够保证真正从这些文件中读取到真正需要的数据呢?Haystack使用独立索引文件来对文件系统的数据建立索引。所以这样的话,就可以通过索引里的键(Key)指向所需要的图片文件了。通常,1GB的图片数据需要RAM中的1M元数据(metadata)内存缓存。因为Haystack能确保索引内容肯定驻留在RAM中,所以Facebook就能确保对每张图片的IO次数最多为1次。

 

Haystack的存储模式

 

Haystack在磁盘上表现为一系列重复的数据块,包含数据头(Header)和数据段(Segment)两个部分。下图是Facebook中使用Haystack的存储方式。

 

下图是Haystack中的索引情况:

其中,start代表了在Haystack文件系统中该文件的起始地址,length就是文件的长度。

 

新的存储架构

 

如果放弃使用Netapp,转而使用Haystack,那么Facebook的读取场景就会发生一定的变化。我们重新来观察一下:

 

写:

 

读取:

 

webcast观看:Facebook – Needle in a Haystack: Efficient Storage of Billions of Photos

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Facebook存储65亿张照片的存储框架 的相关文章

随机推荐

  • PL0语言出错编号表

    Notes 编译原理第 3 版的书貌似没有这个表 做实验和写课设的时候很不方便 把别人拍的第 2 版书上的这个表在这备份一份 Error Code Table 出错编号 出错原因 1 常数说明中的 写成 2 常数说明中的 后应是数字 3 常
  • 为什么JAVA文件中只能含有一个Public类

    1 一个 java 源文件中是否可以包括多个类 不是内部类 有什么限制 答 可以有多个类 但只能有一个public的类 并且public的类名必须与文件名相一致 2 为什么一个文件中只能有一个public的类 答 编译器在编译时 针对一个j
  • 编程中常用设计模式

    单例模式 单例模式的优点 1 在单例模式中 活动的单例只有一个实例 对单例类的所有实例化得到的都是相同的一个实例 这样就防止了其他对象对自己的实例化 确保所有的对象都访问同一个实例 2 单例模式具有一定的伸缩性 类自己来控制实例化进程 类就
  • 【云风skynet】详解skynet的多核高并发编程丨actor模型丨游戏开发丨游戏服务端开发丨多线程丨Linux服务器开发丨后端开发

    skynet中多核高并发编程给我们的启发 1 多核并发编程 2 actor模型详解 3 手撕一个万人同时在线游戏 视频讲解如下 点击观看 云风skynet 详解skynet的多核高并发编程丨actor模型丨游戏开发丨游戏服务端开发丨多线程丨
  • C++设计日志:读写定界符文件

    C 设计日志 读写定界符文件 荣耀 2003 我将撰写的 C 设计实践 系列文章 会讲到一些数据处理系统设计方法 我并不希望文章局限于特定数据库产品 我也不喜欢空对空地讲述太多抽象道理 我必须编写一些模拟数据库操作的代码 用于读写定界符文件
  • notepad linux,适用于Linux的11种最佳Notepad ++替代品

    Notepadd 是一个完全免费的源代码编辑器 作为Windows上的 Notepad的替代品而创建 基于Scintilla在C 中编写 并实现了Win32 API和STL 以确保程序大小小 执行速度快 这些功能使其成为一个家族开发者名字
  • 有哪些值得推荐的LoRa模块?

    随着物联网技术的发展 LoRa模块已经被应用到各行各业 其在市场上受欢迎程度非比一般 业内对于LoRa技术的发展前景有着非常乐观的看法 目前国内生产LoRa相关产业的企业数量已超过数千家 创新微MinewSemi在LoRa模块方面也积累了一
  • inux启动输入密码出现module is unknown

    当启动输入密码无法登录时 重启按下e键 在linux16这一行中找到ro 将ro改变为rw 并在结尾添加init bin sh 查看 var log secure日志文件中排查错误 最终发现是 lib security pam limits
  • 2021年全国职业院校技能大赛(中职组)网络安全竞赛试题(1)详细解析教程

    2021年全国职业院校技能大赛 中职组 比赛环境可以私信博主获得 网络安全竞赛讨论可以加扣群421865857 网络安全竞赛试题 1 总分100分 赛题说明 一 竞赛项目简介 网络安全 竞赛共分A 基础设施设置与安全加固 B 网络安全事件响
  • cpp: Abstract Factory Pattern

    Gold h 此文件包含 Gold 类 Abstract Factory Pattern C 14 2023年4月30日 涂聚文 Geovin Du Visual Studio 2022 edit pragma once ifndef GO
  • C++中vector使用方法

    目录 1 基本操作 2 算法 3 输出vector的中的元素 三种方法 在C 中 vector是一个十分有用的容器 是一个能够存放任意类型的动态数组 能够增加和压缩数据 vector的优点 1 可将容器中元素翻转 复制元素 找到元素值对应的
  • 信号与系统学习总结 第三章 傅里叶变换

    信号与系统学习总结 第三章 傅里叶变换 章节思路 傅里叶级数 傅里叶变换 周期信号傅里叶变换 抽样定理 傅里叶级数 满足狄利赫里条件的周期函数f t 可以分解为a0 直流分量 cos n 1t 和sin n 1t 的和 根据欧拉公式 还可以
  • C语言实现银行家算法

    问题描述 银行家算法描述 假设系统中有n个进程 m种资源 对于该道题目而言 n为5 m为4 定义一个5 4的allocation分配矩阵 用来表示对所有进程的资源分配情况 Allocation i j k 表示进程Pi已经获得j资源k个 同
  • 区块链节点和区块区别_区块链中主链和侧链的区别

    区块链尤其是公有链都有主网和测试网 主网是区块链社区公认的可信区块链网络 其交易信息被全体成员所认可 有效的区块在经过区块链网络的共识后会被追加到主网的区块账本中 按区块链网络的独立程度 分为两种 主链 侧链 两者的区别如下 1 主链指正式
  • Windows Terminal + wsl 之调整ls命令颜色、底色方法

    1 显示预设置 执行 cd dircolors p gt dircolors 2 接着修改 用vi 可预览效果 vi dircolors 找到如下条目 修改字体颜色和背景色如下 STICKY OTHER WRITABLE 30 46 dir
  • Matplotlib

    文章目录 1 什么是matplotlib 2 实现一个简单的matplotlib绘图 3 matplotlib图像结构 4 matplotlib基础绘图 多个坐标系显示 plt subplots 面向对象的画图方法 5 常见图形种类 1 什
  • 浏览器控制台反调试

    反反调试 常规方法 前文所提到的几个反调试方法 除debugger方式外 均判断是否打开开发者工具 破解的方式也很简单 基本只需两步就可以搞定 将开发者工具以独立窗口形式打开 打开开发者工具后再打开网址 反反调试 debugger方法 若使
  • Django框架的源码解析

    简述 从django admin startproject name 开始 小结 django core management init py 1 5个方法 2 ManagementUtility 类 小结 base py 1 2个方法 2
  • super.onCreate(savedInstanceState);

    super onCreate savedInstanceState 是调用父类的onCreate构造函数 savedInstanceState是保存当前Activity的状态信息 onCreate方法的参数是一个Bundle类型的参数 Bu
  • Facebook存储65亿张照片的存储框架

    Facebook存储65亿张照片的存储框架 从未用过Facebook 但是还是对Facebook应对大容量的非结构化数据存储方案感兴趣 本文是通过在线网络广播 webcast 经本人翻译得来的 因此 本人并不能确保本文中叙述的内容与原文we