Facebook图片存储系统Haystack——存小文件,本质上是将多个小文件合并为一个大文件来降低io次数,meta data里存偏移量

转自:http://yanyiwu.com/work/2015/01/04/Haystack.html

一篇14页的论文Facebook-Haystack, 看完之后我的印象里就四句话:

  • 因为【传统文件系统的弊端】
  • 因为【缓存无法解决长尾问题】
  • 所以【多个图片信息(Needle)存在同一个文件(SuperBlock)中】
  • 所以【显著提高性能】

传统文件系统的弊端

传统的 POSIX 文件系统不适合高性能的图片存储, 主要原因是基于该文件系统来存储的话,是讲每个图片存储成某目录下的一个文件, 每次读取文件的时候需要有N次磁盘IO,当目录下文件数是K级别是, 读取一次文件需要超过10次的文件IO,即使目录下的文件数是0.1K级别时, 也需要3次的文件IO(1:读取目录元数据,2:读取inode,3:读取文件内容)。

缓存无法解决长尾问题

图片存储的应用场景如图:

在 PhotoStorage 之前还有一些 CDN 保驾护航, CDN 就是靠缓存吃饭的,对于那些热门的图片都能被 CDN 很好的缓存下来, 所以需要访问的 PhotoStorage 一般都是非热门图片, 所以在这样的场景之下, 在 PhotoStorage 改进缓存显然是无法解决问题的。 你懂的,缓存对于长尾问题基本上都是束手无策的。 因为如果缓存能解决的问题,就不叫长尾问题了。

多个图片信息存在同一个文件中

每次读取一个图片需要多次磁盘IO的原因是因为一个图片存成一个文件, 文件系统里面每次读取文件需要先读取文件的元信息等,导致多次磁盘IO, 而当我们将多个图片信息存在同一个文件中, 当然这个文件会很大, 然后在内存中存储该图片存储在文件中的偏移地址和图片大小, 所以每次读取图片的时候, 根据偏移地址直接读取读取, 大部分情况下能做到只需要一次磁盘IO即可。 从而显著提高性能。

转载请注明出处: Facebook图片存储系统Haystack

基于这个思想,haystack 设计者绕过了 POSIX 文件系统这块,把 haystack 变成了一个 KV FS,即 NOFS。每个图片对应一个 FID,不再单独存放文件系统中,而是同一个物理卷 Volume 图片全部写入一个文件中,由 Volume Server 内存维护 FID : <Volume Machine, Offset, Size> 映射关系,Volume Server 内存中维护打开的文件句柄,读取图片时只需一次 IO 顺序读操作。

haystack架构图

架构比较简单,分为三部份:Haystack Directory, Haystack Cache, Haystack Store

Directory: 即所谓的 Meta Server

1. 生成 FID,维护 logical volume 与 physical volume 映射关系,解决上传时的负载均衡问题。

2. 新加入的 Store Server 要在这里注册。

3. 维护 logical volume 的 read-only 属性,只读的 logical volume 不再接受 upload 请求。

4. 决定请求走 CDN 还是内部 Haystack Cache Server.

Cache: 所谓的内部 CDN

1. 对图片 FID 采用一致性 hash 算法保存。

2. 只缓存用户请求,而不是来自 CDN 的请求。

3. 只缓存 write-enabled store 图片,由于上传的时间序,相当于只缓存最新生成的图片。比如说用户刚上传的图片,可能就会存到 Cache 中预热。

Store: 最终落地存储服务

1. 图片顺序追加到一个大文件中,内存中维护图片在文件中的 Offset 和 Size 的索引信息。

2. 为了解决重启快速加载问题,索引信息会单独保存到一个 Index File 中。

时间: 2024-10-17 20:01:36

Facebook图片存储系统Haystack——存小文件,本质上是将多个小文件合并为一个大文件来降低io次数,meta data里存偏移量的相关文章

把多个Excel文件合并到一个Excel文件的多个工作表(Sheet)里

实现的功能是把多个Excel文件的第一个工作表(Sheet)合并到一个Excel文件的多个工作表里,并且新工作表的名称等于原Excel文件的文件名.开发环境Excel2007,但是Excel2003应该也能用,Excel2000似乎不能用.代码如下: '功能:把多个工作簿的第一个工作表合并到一个工作簿的多个工作表,新工作表的名称等于原工作簿的名称 新建的excel新表---书签sheet1--右击查看代码-复制代码进入---运行-选择需要合并的表--OKSub Books2Sheets()   

java实现把一个大文件切割成N个固定大小的文件

//java实现把一个大文件切割成N个固定大小的文件 package com.johnny.test; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; public class FenGeFile { p

面试官:请你实现一个大文件上传和断点续传

前言这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在面试的时候确实被问到了这个问题,而且是一道在线 coding 的编程题,当时虽然思路正确,可惜最终也并不算完全答对 结束后花了一段时间整理了下思路,那么究竟该如何实现一个大文件上传,以及在上传中如何实现断点续传的功能呢? 本文将从零搭建前端和服务端,实现一个大文件上传和断点续传的 demo 文章有误解的地方,欢迎指出,将在第一时间改正,有更好的实现方式希望留下你

python json及mysql——读取json文件存sql、数据库日期类型转换、终端操纵mysql及python codecs读取大文件问题

preface: 近期帮师兄处理json文件,须要读到数据库里面,以备其兴许从数据库读取数据.数据是关于yelp站点里面的: https://github.com/Yelp/dataset-examples,http://www.yelp.com/dataset_challenge/. 涉及到一些json和sql的问题,记录下. 一.python sql安装 python 自带轻型数据库sqlite,只是用不了.须要mysql才行.pip安装mysql失败.easy_install安装也失败.这

多张图片合并为一个PDF文件方法

我们手机里不仅有生活照.旅游照.估计很有很多工作资料吧,这些图片混合在一起每次使用的时候都很麻烦,其实我们可以用手机将图片进行合并为PDF文件,把不同类的图片进行分类管理,这样方便以后的使用,那该怎么操作呢?1.首先检查一下看图片是不是都存放在相册里,然后将手机连接上网络,在应用市场里找到如下的辅助工具. 2.找到工具后将其运行,在首页是一个文件存放的页面如下图,今天需要用到的是此页面下方的小功能. 3.在小功能的页面有七个选择,在此点击图片生成PDF. 4.这时会出现一个新的页面,先编辑好生成

推荐一个大文件查找工具---WizTree

DB备份.dump.电影等文件多了以后,经常遇到磁盘空间不够用的情况,日积月累本来清晰的目录结构找起来也很费劲,尤其是要查找删除无用的大文件.windows本身那差劲的搜索功能就不提了,从搜索引擎上查找工具,总是提示**零软件可以,比较反感. WizTree 是一个可以用来查找占用大量分区的无用文件和文件夹的查找大文件工具,界面中还会将搜索出来的文件夹从大到小排列,并且还会显示占用百分比.占用空间.文件数量.子文件夹数量等信息,可以直接进行删除等操作,非常方便.下载

实验mongodb使用gridfs存放一个大文件

1.启动mongoDB 2.使用gridfs存放大文件 3.观察fs.chunks和fs.files的情况 命令 db.fs.chunks.find()查到的是一些二进制文件:

?快速删除大文件的前几行或后几行及快速获取大文件的n到m行数据

快速删除大文件的前几行或后几行 http://stackoverflow.com/questions/17330188/remove-first-n-lines-of-a-file-in-place-in-unix-command-line 快速获取大文件的n到m行数据 http://unix.stackexchange.com/questions/47407/cat-line-x-to-line-y-on-a-huge-file

54一个大文件夹下所有文件的读取和检索!支持英文

package lld; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import java.io.BufferedInputStream;import jav