facebook

Google 搜索 “Finding a needle in Haystack: Facebook’s photo storage”   可以找到论文的pdf文件。

为了提搞响应速度,他的这个图片服务器关键技术就是把所有的图片文件保存到一个单独的大文件中。这个文件结构是自己设计的,里面保存所有的图片内容。应该是为了避免普通文件系统在大量文件中查找某个文件的性能问题,可以说在他这个设计里面就是完全去除文件系统干扰了,完全绕过了文件系统的功能了。普通文件系统管理大量文件时,查找一个大量图片的文件夹下面的文件时的性能不能应用的满足要求,往往需要多个磁盘操作来读取文件inode等信息(论文里面有说)。 facebook的这个设计,就是单独设置自己的文件结构,在一个大文件里面保存所有图片,然后自己搞index那些,然后把index数据保存到内存cache中。他自己设计了一个把图片路径比如/pic/data/cookie_369791834.jpg这样的文件映射到自己大文件里面的某个偏移的办法,这个计算全部可以在缓存完成,而不是像普通文件系统那要先要通过很慢的磁盘操作来先读出文件位置然后再读文件等等,他的办法可以快速定位到图片在那个单独大文件里面然后是磁盘所在位置。路经到文件位置的映射信息,数据量很少的,可以自己搞个hash或者什么样的map办法,全部把这信息保存在内存缓存里面,用于快速查找。总的来说就是可以减少磁盘操作的数量提高了性能。

删除图片那些处理,可以简单在index里面标记删除,并不同时更新文件内容。而是在适当的时候再调用 一个 整理 进程来整理那个保留所有图片的大文件,压缩已经被删除文件的空间(copy到一个新文件,把文件中间的空洞清理掉)。

上面就是主要技术原理,不过其他的图片cache服务器,冗余备份,多服务器的管理已经权限管理等文档都有说,可以去看一下。

--

Facebook图片管理架构


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


  旧的 NFS 照片架构

 

  [转载]Facebook图片管理架构


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


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


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


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


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


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


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


  新的 Haystack 照片架构

 

  [转载]Facebook图片管理架构


  新的照片架构将输出层和存储层合并为一个物理层,建立在一个 基于 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 包括两个文件,包括指针索引文件

 

[转载]Facebook图片管理架构
                Haystack 对象存储结构

 

  [转载]Facebook图片管理架构
                    指针和索引文件结构


  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's photo storage rewrite

http://www.niallkennedy.com/blog/2009/04/facebook-haystack.html

Needle in a haystack: efficient storage of billions of photos

http://www.facebook.com/note.php?note_id=

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值