阅读更多

27顶
0踩

互联网

转载新闻 Facebook如何管理150亿张照片

2009-05-01 18:31 by 副主编 ouspec 评论(12) 有17609人浏览

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 官方网站

来自: comsharp.com
27
0
评论 共 12 条 请登录后发表评论
12 楼 xieruilin 2010-11-27 10:59
高。。确实高。。
11 楼 恋曲2000 2010-09-15 12:11
只有国外有这么好的架构师呀!!!!
10 楼 jilan666 2010-04-01 15:11
[i][/i][img][/img]
9 楼 jilan666 2010-04-01 15:10
引用
存在代用key 中。接着上传服务器通知照片存储服
[i][/i][b][/b][u][/u]
引用
8 楼 guichenguang 2009-05-04 15:51
1.5PB  赞!
7 楼 zhengyutong 2009-05-02 23:02
感叹啊。这么大的数据量.....
6 楼 wxq594808632 2009-05-02 22:49
。长见识了。。
5 楼 asin 2009-05-02 20:16
学习了...
4 楼 elan1986 2009-05-02 19:20
有所感悟!!!
3 楼 chinakite 2009-05-02 15:10
Facebook的开放态度让人赞赏
2 楼 wcily123 2009-05-02 10:06
很强大!
1 楼 whaosoft 2009-05-02 01:08
呵呵 不错呀这个

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • @Transient、@Entity/@Table

    @Transient、@Entity/@Table

  • mysql SQLNonTransientConnectionException 异常分析处理

    这里写自定义目录标欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mark

  • 【数据库连接异常】MySQLNonTransientConnectionException: Could not create connection to database server.

    在JDBC连接数据库时,代码没有错,运行却出现报错信息:我出现这个问题后,找到的原因是:Maven添加管理的mysql-connector-java依赖版本与下载使用的MySQL版本不一致导致的无法获取数据库连接对象。 …: 测试: 成功获取连接对象,问题解决:

  • java.sql.SQLNonTransientConnectionException: Could not create connection to database server

    **使用JdbcTemplate连接数据库时发生错误:**java.sql.SQLNonTransientConnectionException: Could not create connection to ????报错有这么长 ????????一脸懵逼之一脸懵逼 ????诶,两血健康,一血不慌,咋一个一个报错的看 报错中很明显地提示,是数据库连接的问题 网上能找到的可能导致数据库连接错误的原因: 1.数据库链接地址、账户、密码错误 2.MySQL服务运行不正常 3.数据库版本和MySQL驱动版本不一致

  • 项目报错:java.sql.SQLNonTransientConnectionException: Could not create connection to database server

    1.启动导入项目(黑马品达权限控制)时报错java.sql.SQLNonTransientConnectionException: Could not create connection to database server 2.解决方案:将mysql的maven依赖版本改为mysql版本,并记得刷新maven配置哦。 3.其他可能的原因:mysql版本与mysql驱动,mysql8.x需要在url加入时区 spring: datasource: druid: username:

  • 关于java.sql.SQLNonTransientConnectionException: No operations allowed after connection closed.的解决方案

    关于java.sql.SQLNonTransientConnectionException: No operations allowed after connection closed.

  • 解决: Cause: java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed

    在使用 Mybatis 操作数据库时,在单元测试时出现了这个问题这个报错的意思是:不允许公开密钥检索这是 Mysql 连接超时的错误,根据异常信息提示,可能是由于连接字符串URL中缺少"allowPublicKeyRetrieval=true"参数导致的。

  • 【Java异常体系】(一)异常体系之SQLException解析...

    Java异常体系详解之SQLException

  • java.sql.SQLNonTransientConnectionException

    java.sql.SQLNonTransientConnectionException: Cannot load connection class because of underlying exception: com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the main URL sections. java web应用搭建中,创建数据库连接问题时出现以上报错。 解决.

  • MySQLNonTransientConnectionException: Can't call rollback when autocommit=true

    原因及解决方法

  • SpringBoot注解最全详解(整合超详细版本)

    使用注解的优势: 1.采用纯java代码,不在需要配置繁杂的xml文件 2.在配置中也可享受面向对象带来的好处 3.类型安全对重构可以提供良好的支持 4.减少复杂配置文件的同时亦能享受到springIoC容器提供的功能 一、注解详解(配备了完善的释义)------(可采用ctrl+F 来进行搜索哦~~~~) @SpringBootApplic...

  • java.sql.SQLNonTransientConnectionException:Public key Retrieval is not allowed(mysql 8.0+以上版本)

    一般遇到:java.sql.SQLNonTransientConnectionException:Public key Retrieval is not allowed… 此类的错误多半是数据库连接驱动的8.0+版本。 【注意】 如果MYSQL数据库8.0以上连接需要做以下配置: driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/kiki_test?useSSL=false&allowP

  • 反序列化失败although at least one Creator existsno delegate- or property-based Creator 异常

    标题所指问题也可能是 @Builder @NoArgsConstructor 冲突 以上问题出现的原因是 Entity上加上 @Builder ,会默认为类加上全参构造函数,且提供以建造器模式构造对象的方法。而 @NoArgsConstructor 注解生成无参构造函数以便使用new Obj()方式创建对象,很多框架中都需要反射调用无参构造函数。但是如果显式声明了 @NoArgsConstructor ,lombok就不会生成全参构造函数,而@Builder中会用到全参构造函数,所以冲突。 以上问题的解决

  • Java学习笔记之transient关键字

    看LinkedList源码看到transient关键字,于是乎很好奇,从来没见过哦 首先transient关键字的作用:当类使用Serializable序列化的时候,使用transient修饰的变量将只会放在内存里,而不会写在磁盘上,下面做一个测试: 被序列化的类: public class TestTransientEntity implements Serializable { privat...

  • 在@Entity类中使用@Transient标识非mapping属性

    背景: 有时候@Entity类中已有的属性无法满足页面的展示,所以需要在@Entity中添加一些额外的属性,但这些属性是不需要和表字段进行关联映射的,所以需要用@Transient注解进行标注,否则会把额外添加的这些属性当做字段看待,导致不必要的错误产生。 注意事项: 1、必须在属性前面添加@Transient注解,而不是get方法前,例如: @Transient private

  • @Transient Entity不持久化

    @Transient Entity不持久化

  • JPA中有关实体类中相关注解的说明

      /** * @Table 标注类对应的表 * 若表名和类型相同时,省略@Table,比如类Users 和表 users; * 若不相同时,必须有@Table,并设置name,为该类对应的表名。@Table(name="users") * * @Entity 标注实体 * * @Id 标注id * * @Transient 标注该属性不做与表的映射(原因:可能表中没有该属性对应...

  • not-null property references a null or transient value: 等关于cinema项目bug

    今天改一个项目,遇到好多bug。以下一一说主要bug。 1.not-null property references a null or transient value: entity.Film.name 很明显,意思是不能有一个空的属性引用。 解决:检查数据库,允许为空,发现还是报错。 在xml文件中,去掉属性中not-null即可。2.Could not execute JDBC batc

  • The given object has a null identifier解决办法

    这个错误常出现在SSH整合的时候,修改时候主键没有传递 或者name属性指定错误。因为你操作的对象的主键不存在,所以hibernate 不知道更新的是谁。 解决方案:你要把你的更新的对象的主键传过去,...

Global site tag (gtag.js) - Google Analytics