Finding a needle in Haystack: Facebook’s photo storage

2023-11-06

Finding a needle in Haystack: Facebook’s photo storage

原始论文地址 Finding a needle in Haystack: Facebook’s photo storage

简介

该论文主要介绍了一个对象存储系统Haystack,该存储系统主要针对大规模的图片存储进行优化。传统的存储系统设计基于NFS,由于涉及到大量的文件元数据的查找操作,因此会有大量的磁盘I/O增加了总的操作的时间。该论文中采取减少图片元数据的方法,将所有的元数据放入到内存当中操作来提升性能。这样,仅需要读取图片的时候才需要磁盘操作。

存储在云端的图片有一个特点,就是只会写一次、会被经常读取、不会被修改以及很少被删除。不会被修改这个特点是由于FB采取将修改后的图片存储在新位置的策略导致的。

目前,文件系统普遍基于POSIX标准,文件存放在目录下,并且文件有对应的元数据。下面是一个图片的元数据。虽然元数据数据量比较小,但是对于大型的数据中心来说,成百万的图片的元数据会是一个比较大的数据量。

$ exiftool IMG_20151104_102543.jpg 
ExifTool Version Number         : 9.46
File Name                       : IMG_20151104_102543.jpg
Directory                       : .
File Size                       : 2.8 MB
File Modification Date/Time     : 2015:11:04 10:25:44+05:30
File Access Date/Time           : 2015:11:17 18:56:49+05:30
File Inode Change Date/Time     : 2015:11:11 14:55:43+05:30
File Permissions                : rwxrwxrwx
File Type                       : JPEG
MIME Type                       : image/jpeg
Exif Byte Order                 : Big-endian (Motorola, MM)
GPS Img Direction               : 0
GPS Date Stamp                  : 2015:11:04
GPS Img Direction Ref           : Magnetic North
GPS Time Stamp                  : 04:55:43
Camera Model Name               : Micromax A121
Aperture Value                  : 2.1
Interoperability Index          : R98 - DCF basic file (sRGB)
Interoperability Version        : 0100
Create Date                     : 2002:12:08 12:00:00
Shutter Speed Value             : 1/808
Color Space                     : sRGB
Date/Time Original              : 2015:11:04 10:25:44
Flashpix Version                : 0100
Exif Image Height               : 2400
Exif Version                    : 0220
Exif Image Width                : 3200
Focal Length                    : 3.5 mm
Flash                           : Auto, Did not fire
Exposure Time                   : 1/809
ISO                             : 100
Components Configuration        : Y, Cb, Cr, -
Y Cb Cr Positioning             : Centered
Y Resolution                    : 72
Resolution Unit                 : inches
X Resolution                    : 72
Make                            : Micromax
Compression                     : JPEG (old-style)
Thumbnail Offset                : 640
Thumbnail Length                : 12029
Image Width                     : 3200
Image Height                    : 2400
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Aperture                        : 2.1
GPS Date/Time                   : 2015:11:04 04:55:43Z
Image Size                      : 3200x2400
Shutter Speed                   : 1/809
Thumbnail Image                 : (Binary data 12029 bytes, use -b option to extract)
Focal Length                    : 3.5 mm
Light Value                     : 11.9

对于上传到云端的图片来说,有些元数据字段,比如上面的FilePermissons是不会被用到的。

论文中介绍了Haystack的三个优势:

  • 高吞吐量与低延迟,Haystack 通过使得读取操作最多进行一次磁盘操作来达到高吞吐量与低延迟
  • 容错性,Haystack将每张图片在多个地方的保存副本
  • 低成本,相比于之前采用的基于NFS的方式,Haystack 在每TB图片使用的存储空间以及每TB的读取速率上要更优。

背景

论文在该部分介绍了FB在使用Haystack之前采用的架构以及得到的经验。
在这里插入图片描述
上图是浏览器、CDN以及存储系统之间如何交互的简易结构图。在使用Haystack之前,FB使用基于NFS的存储系统,CDN缓存了经常被访问的图片数据。但是社交软件上虽然有很多流量请求访问了那些热门的图片,但是还有大量的请求访问的是比较冷门,时间较为久远的图片。

在这里插入图片描述
基于NFS的存储系统中,每个图片是单独的一个文件。上图是图片存储系统,基于NFS处理HTTP请求的过程。

由于当目录下有大量的文件的时候 ,数据块映像(blockmap)不能有效地被缓存,因此一般目录下最多只有几百个文件。但是即使这样,访问某个图片依然需要进行三次磁盘操作:首先将目录的元数据读取内存,之后读取inode最后读取图片。为了进一步减少磁盘操作,使用服务器缓存从设备访问的图片的文件句柄。当某个请求的文件的文件句柄已被缓存,通过使用系统调用 open_by_filehandle来打开文件,该系统调用是FB自己加上去的。但是,前面提到过很多访问并不是针对热门图片的,因此,这些请求很难命中缓存。论文中总结,依靠存储设备或者一些外部缓存,比如memcache,对性能提升有限。因此,基于这些经验,设计定制化的存储系统,减少每张图片的元数据,以及足够大的内存使得文件元数据能够全部放在内存中操作。

设计细节

FB使用CDN去缓存那些热门的图片,并使用Haystack处理那些请求中的长尾数据。Haystack的目标是尽量减少对于磁盘的操作,通过采取减少图片元数据的大小,将元数据放在主存中来达到目标。前面提到,在基于NFS的方式中,每个图片保存为一个文件。为了减少平均每个图片的元数据大小,Haystack采取将多张图片保存在一个文件中的方法。在这里插入图片描述
Haystack主要包含三个部分,分别是Haystack Store, Haystack Directory 以及Haystack Cache。其中Haystack Store包含了存储系统,并且管理图片的元数据。Haystack Store按照物理卷(volume)管理,并将多个物理卷构成的组抽象为一个逻辑卷。当Haystack 将图片存储在逻辑卷中时,图片被写入到所有相关的物理卷中,这些冗余数据用作备份。

用户端使用类似如下的URL访问图片数据

http://<CDN>/<Cache>/<Machine id>/<Logical volumn, Photo>

首先,CDN接收到请求,CDN首先根据URL最后的逻辑卷以及图片的id查找,如果没有,则请求转到Cache,Cache进行类似的操作,如果依然没有找到该图片,则最终由Haystack Store处理。

Haystack Directory

在上图中,Haystack Directory与Web Server 直接交互。Haystack Directory主要有四个功能:

  • Haystack Directory 提供了从逻辑卷到物理卷的映射,Web Server 使用这种映射关系上传图片以及在请求时构造URL;
  • Haystack Directory 确保逻辑卷写以及物理卷的读操作的负载均衡;
  • Haystack Directory 决定了图片的请求应该被CDN还是Cache处理;
  • Haystack Directory 标记了哪些逻辑卷是只读的,这些只读的逻辑卷通常是由于空间不足

Haystack Cache

Cache 从CDN或者是直接从客户端接收到请求。Cache 被设计为一个分布式的哈希表,使用图片的id定位cache缓存的数据。如果Cache中没有该图片的数据,则会到存储设备上读取数据,并返回给CDN或者是浏览器端。

Cache 对满足下面两个条件的图片进行缓存:

  • 请求直接来自客户端而不是CDN;
  • 数据是从允许写的设备上读取的

其中第一个条件是因为,如果是来自CDN的请求,则CDN上没有的数据,Cache上也很难有。第二个条件的目的是为了减少对允许写设备的读取操作。比如当某个相册上传到服务器上之后,一般都会进行查看操作,缓存这些数据可以减少读取操作。

Haystack Store

Haystack Store中的每个机器管理多个物理卷,每个逻辑卷包含多个物理卷。图片的读取通过逻辑卷号以及文件的偏移(offset)来获取。
在这里插入图片描述
如上图所示,每个物理卷包含一个超级块以及保存在该物理卷上的图片(上图中的Needle)。为了加快检索的过程,每个物理卷在内存当中都有对应的数据结构,该数据结构将图片的id映射到对应的needle上,包括设备的标记、文件的大小、偏移等。当出现故障时,该映射关系会根据存储的情况重建。
在这里插入图片描述
当Cache向存储设备请求图片的时候,需要使用到逻辑卷号,key, alternate key和cookie。其中cookie 是保存在URL中的一串数字,是在图片上传的时候随机分配并保存在Directory中的,这可以避免猜测图片的URL进行的攻击。

对于图片的写操作,相关的物理卷将图片数据添加,并更新内存中的映射关系。Haystack不允许对图片的修改操作,只能将对图片的修改另外保存,但是key和alternative key是相同的。如果新版本的图片文件与原始版本保存在不同的逻辑卷中,Directory 更新元数据,之后的数据请求不会去获取旧版本的图片文件。如果新版本的图片与原始版本的图片保存在相同的逻辑卷中,Haystack会根据文件的地址偏移值来区分文件的版本。

对于文件的删除,Haystack Store设置内存中映射关系中的flag以及设备上对应的flag。 被标记为删除的空间的收回操作在后面介绍。
在这里插入图片描述
在这里插入图片描述

前面提到,HayStack Store重建内存中的映射关系表,可以通过读取所有的物理卷来构建。但是读取所有的磁盘是很费时的,所以可以通过索引文件来加快这个过程。

索引文件的结构如上图所示,与物理卷的结构相似,首先是超级块,之后是一系列的索引文件。索引文件中这些Needle的顺序需要和物理卷中的顺序相同。基于索引文件重构内存中的映射关系表相比于读取物理卷来重构需要面临一个问题。因为索引文件是异步更新的,所以重建时不一定是最新的。这可能导致某个文件标记为删除,但是由于还未更新到索引文件,或者是某个图片文件已保存但是索引文件中没有记录。针对第一个问题,可以在Haystack Store读取图片数据之后检查一下标志位,如果标记为已删除,则更新内存中的映射关系表,并通知Cache该图片已删除;针对第二个问题,由于Haystack Store添加记录是在最后append,所以可以从最后一个记录开始,就可以判断哪些记录是没有对应索引的。

Haystack Store使用XFS文件系统,XFS有两个优势,一是针对连续的大文件的blockmap 足够小,可以放入到内存当中;二是XFS有高效的空间预分配(preallocation)机制,可以消除存储碎片以及控制blockmap 增长的大小。

针对故障检测与恢复,Haystack运行一个后台进程,称为pitch-fork,定期地检测设备。pitch-fork 尝试连接存储设备并测试读取,如果操作失败,则将该设备上涉及的逻辑卷全部标记为只读,之后是人工维修。

优化

Haystack 主要使用下面这三种方式来优化性能。

  • 压缩,压缩是在线进行的操作,回收标记为删除的文件以及副本的空间。对于Haystack的一个卷文件,将其中的每一个文件needle复制到新的卷文件中,其中跳过标记为删除以及旧版本的文件,当该步骤完成之后,阻塞之后针对卷文件的修改操作来保证完成替换之前的卷文件以及更新内存中的映射结构的过程。
  • 节约内存空间,Haystack 在内存中维护一个映射关系的数据结构,包含一些标志位。由于目前该系统只使用到了标记删除的标记位。因此,在内存中不再保存标记位。此外也不在内存中保存cookie的值,而是在读取到文件之后检查一下cookie。
  • 批量上传, 由于对磁盘进行连续的写比随机写有更高的性能,并且许多用户也是一次上传一个相册,因此可以通过批量上传的方式提升性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Finding a needle in Haystack: Facebook’s photo storage 的相关文章

  • 区块链基本概念(一)

    区块链的基本概念 其概念为 区块链是一个去中心化的分布式数据库 改数据库有一串使用密码学方法产生的数据区块有序连接而成 区块中包含有一定时间内产生的无法被篡改的数据记录信息 区块中包含数据记录 当前区块根哈希 Hash 前一区块根哈希 时间
  • 分布式存储Ceph中的逻辑结构Pool和PG

    Ceph中的逻辑对象有Object Pool PG 本文简单介绍相关的概念以及之间的关系 PG状态变化过程等 1 Ceph集群中的逻辑结构 1 1 Object Object是Ceph的最小存储单元 大小可以自己定义通常为2M或4M 每个O
  • OpenMP和MPI比较

    OpenMP和MPI是并行编程的两个手段 对比如下 OpenMP 线程级 并行粒度 共享存储 隐式 数据分配方式 可扩展性差 MPI 进程级 分布式存储 显式 可扩展性好 OpenMP采用共享存储 意味着它只适应于SMP DSM机器 不适合
  • 星际无限CTO张超:IPFS分布式存储将成为新一代存储方式

    8月9日 IPFS分布式存储技术圆桌峰会在昆明盛大启幕 本次峰会汇集了包括大数据 分布式存储 人工智能 云计算 数字资产管理等各路行业大咖 论坛启智慧 共享创价值为目的 得到今日头条 腾讯新闻 火星财经 金色财经 春城晚报 都市时报等诸多媒
  • 腾讯云:MySQL数据库的高可用性分析

    作者介绍 易固武 腾讯高级工程师 参与腾讯账号安全建设 腾讯数据仓库 TDW 优化改造 腾讯云数据库等项目 对大规模分布式存储和计算系统有浓厚的兴趣和经历 MySQL数据库是目前开源应用最大的关系型数据库 有海量的应用将数据存储在MySQL
  • Messari:21年第二季度Web3及NFT报告

    注 原文来自Messari 以下为全文编译 如果今年年初 有人走到我面前说 NFT的销售额将轻松超过10亿美元 GaryVee将推出NFT项目 Axie Infinity将成为五大NFT市场之一 我会回答 我会相信其中之一 但是 过去的一个
  • 五种方法创建 Java 对象,你知道几种呢?

    点击上方 Java基基 选择 设为星标 做积极的人 而不是积极废人 源码精品专栏 原创 Java 2020 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 Rock
  • Ceph运维存储 命令管理操作

    分布式存储运维操作 集群服务管理常用命令 统一节点上的ceph conf文件 将admin节点上修改的ceph conf 推送给所有其他节点 overwrite conf强制覆盖 ceph deploy overwrite conf con
  • 双非计算机学硕报录比竟然有28:1?深圳大学20考研居然如此爆炸!

    深圳大学是一所双非大学 计算机学科评估B 软件工程学科评估没有 由于计算机实力在双非中很强 而且地处广东深圳 是信息行业和互联网行业比较发达的地区 因此深圳大学很受考生欢迎 但是深圳大学也很难考 深圳大学基本所有计算机相关专业都考408 这
  • Paxos与2PC

    Paxos与2PC Paxos协议和2PC协议在分布式系统中所起的作用并不相同 Paxos协议用于保证同一个数据分片的多个副本之间的数据一致性 当这些副本分布到不同的数据中心时 这个需求尤其强烈 2PC协议用于保证属于多个数据分片上的操作的
  • 管理conda environments

    欢迎关注 生信修炼手册 environments作为conda的核心组件 用于封装相互独立的软件环境 通过在不同的environment中安装packages 来实现不同软件的相互独立 通过在不同的environments之间进行切换 从而
  • Finding a needle in Haystack: Facebook’s photo storage

    文章目录 Finding a needle in Haystack Facebook s photo storage 简介 背景 设计细节 Haystack Directory Haystack Cache Haystack Store 优
  • 分布式事务管理(Seata)

    文章目录 1 概述 分布式事务问题 什么是Seata Seata术语 怎么用 Windows安装 Docker安装 MySQL nacos seata 2 配置官网案例 分析业务逻辑 创建数据库 订单模块 建Module POM YML f
  • 开源主流分布式文件系统简单介绍

    文章目录 一 分布式文件系统简介 1 特点 2 主要指标及分类对比 3 AFS与NFS 二 开源分布式文件系统 1 GFS 1 GFS与NFS AFS的区别 2 BigTable 3 Chubby 4 特点1 2 HDFS 1 HDFS与C
  • SpringBoot在K8s下实现优雅停机

    在K8s中 当我们实现滚动升级之前 务必要实现应用级别的优雅停机 否则滚动升级时 还是会影响到业务 本文介绍SpringBoot应用实现优雅停机 此次教程基于SpringBoot 2 5 0 1 加入必要依赖
  • 分布式存储基础知识

    2018 4 26 分布式存储的数据类型有以下三类 非结构化的数据 主要是数据之间的关联系不大 像文本图片之类的数据 结构化的数据 数据之间关联系很大 关系型数据库这种 可以用表进行表示的 半结构化的数据 介于上述两种数据类型之间 数据之间
  • GFS chunk块大小为什么选择64M

    GFS chunk块大小为什么选择64M 优点 减少master存储的元数据信息 因为元数据要放到内存以提供快速访问 如果太小元数据就会太多 减少客户端与master的交互次数 客户端可以与master保持较长的连接 不足 chunk si
  • Windows11 中 Vmware Workstations16 安装CentOS 7

    目录导航 准备 镜像导入安装及配置 CenOS7安装 准备 Windows版本是 Windows 11 专业版 版本 22H2 安装日期 2022 6 25 操作系统版本 22623 730 体验 Windows Feature Exper
  • Filebench 使用手册

    Filebench 使用手册 介绍 Filebench 是一个文件系统和存储基准 可以生成各种各样的工作负载 与典型的基准测试不同 它非常灵活 允许使用其广泛的工作负载模型语言 WML 指定应用程序的 I O 行为 用户可以从头开始描述所需
  • Ceph bluestore中的缓存管理

    从15年3月接触Ceph分布式存储系统 至今已经5年了 因为工作的需要 对Ceph的主要模块进行了较深入的学习 也在Ceph代码层面做了些许改进 以满足业务需要 我们主要使用M版本 最近得闲 将过往的一些学习心得 改进以及优化思路记录下了

随机推荐

  • 谷歌地图旋转图片marker(图片旋转转base64)

    custom rotate icon method for Google map var RotateIcon function options this options options this rImg options img new
  • QT中使用winsock创建Tcp连接传文件

    第一步链接库 qmake LIBS lws2 32 cmake target link libraries send send是项目名称替换自己的 PUBLIC lt
  • 小程序动画 animation 的常规使用

    公司小程序项目比较多 最近正好有时间看一下小程序的动画 同时记录一下我的学习过程 看到这个文章的 我建议你直接去小程序后台 https developers weixin qq com miniprogram dev api ui anim
  • 从零开始教你如何完成一个基于Vite+Vue3+TS的后台管理系统

    项目大致效果 心动了吗 没错 没错 你没看错 在学习了前端也有一年多的时间了 先后学习了 html css html5 css3 js 微信小程序 nodejs vue react ts等 现在也是时候来对之前学的知识进行一个综合的练习了
  • c语言文件操作

    目录 一 什么是文件 1 1 程序文件 1 2 数据文件 1 3 文件名 二 文件的打开和关闭 2 1 文件指针 2 2 文件的打开和关闭 2 3 文件的顺序读写 编辑 三 文件的随机读写 3 1 fseek ftell rewind 四
  • Android WebView加载本地统一HTML界面样式文件并填充内容

    前言 之前加载HTMl图文都是使用TextView 但是现在需要统一三个端的样式 给出了一个HTML文件 我想反正都是HTML格式的 TextView应该也没问题 我就将文本直接填充进去 一运行 发现Html fromHtml 无法解析 l
  • ARM芯片开发(S5PV210芯片)——SD卡启动

    1 SD卡启动 顾名思义就是启动代码存放在SD卡中 设备从SD卡中启动 用SD卡启动有一些好处 譬如可以在不借用专用烧录工具 类似Jlink 的情况下对SD卡进行刷机 然后刷机后的SD卡插入卡槽 SoC既可启动 譬如可以用SD卡启动进行量产
  • 边缘云计算简介

    去年底 中国电子技术标准化研究院 阿里云等单位共同编制并发布了一份 边缘云计算技术与标准化白皮书 定义了边缘云计算的概念和标准等 白皮书篇幅略长 边缘计算社区将通过几篇文章拆解白皮书 边缘计算概念 和云计算出现的时候一样 目前业界对边缘计算
  • UniswapV2核心合约学习(1)— UniswapV2Factory.sol

    记得朋友圈看到过一句话 如果Defi是以太坊的皇冠 那么Uniswap就是这顶皇冠中的明珠 Uniswap目前已经是V2版本 相对V1 它的功能更加全面优化 然而其合约源码却并不复杂 本文为个人学习UniswapV2源码的系列记录 一 Un
  • 笔记/mysql数据库备份与恢复

    MySQL mysqldump命令详解 1 数据库信息 数据库地址 127 0 0 1 数据库用户名 root 数据库密码 1234 数据库名称 test1 数据库名称 test2 数据库名称 test3 mysqldump目录 usr b
  • 高级I/O函数

    应用层程序能往一个TCP连接中写入多少字节的数据 取决于对方的接收窗口的大小和本端的拥塞窗口的大小 管道本身有一个容量限制 规定如果应用程序不将数据从管道读走的话 该管道最多能写入多少字节的数据 自Linux 2 6 11内核起 管道容量的
  • AI Studio 飞桨 零基础入门深度学习笔记2-基于Python编写完成房价预测任务的神经网络模型

    AI Studio 飞桨 零基础入门深度学习笔记2 基于Python编写完成房价预测任务的神经网络模型 波士顿房价预测任务 线性回归模型 线性回归模型的神经网络结构 构建波士顿房价预测任务的神经网络模型 1 数据处理 1 1 读入数据 1
  • 企业订单管理软件

    企业订单管理软件 网上订货宝APP系统功能介绍 一 系统概述和用途 系统基于网络 实现厂家和代理商批发商通过网络下单订货功能 二 解决问题 1 解决订单管理混乱问题 2 解决订单遗漏问题 3 解决订单欠款遗漏问题 4 解决不同客户不同价格管
  • 在Windows下使用Python嵌入式环境包

    在 Python Releases for Windows 页面下载你需要的那个版本的 Windows embeddable package 64 bit 文件 这样就得到一个 python x x x embed amd64 zip 文件
  • Hash算法的使用

    Hash算法的使用 标签 默认分类 发表时间 2011 08 06 06 35 作者 GliderX khsing 分享到 出处 http hi baidu com gliderx 在对语料文本进行2 3元切分时 需要借助hash表来获得切
  • 信息学奥赛一本通 1170:计算2的N次方

    题目链接 http ybt ssoier cn 8088 problem show php pid 1170 思路 计算 2 2 2 的 n n n 次方相当于大整数 1
  • 目标检测-yolov50-火灾识别可视化

    使用yolov5模型对利用开源火灾数据集进行训练模型 实现对照片 视频以及摄像头的火焰烟雾的检测 详细的环境配置见 目标检测 YOLOV5 口罩检测 学习目标 数据集的准备 预训练权重 训练模型 训练模型路径的修改 模型测试 pyqt可视化
  • 完整代码CNN-LSTM多变量时间序列预测

    import torch from torch import nn import pandas as pd import numpy as np import matplotlib pyplot as plt from sklearn pr
  • vue源码解析---AST抽象语法树

    目录 首先AST是什么 指针思想 递归深入 斐波那契数列 递归深入 形式转换 栈结构 AST语法树 首先AST是什么 在计算机科学中 抽象 语法树 abstract syntax tree或者缩写为AST 或者语法树 syntax tree
  • Finding a needle in Haystack: Facebook’s photo storage

    文章目录 Finding a needle in Haystack Facebook s photo storage 简介 背景 设计细节 Haystack Directory Haystack Cache Haystack Store 优