跳到主要内容

设计 Facebook 照片存储

动机与假设

  • PB 级 Blob 存储
  • 传统的基于 NFS 的设计(每张图像存储为一个文件)存在元数据瓶颈:大的元数据大小严重限制了元数据命中率。
    • 进一步解释元数据开销

对于照片应用,大部分元数据(如权限)未被使用,从而浪费了存储容量。然而,更重要的成本在于,文件的元数据必须从磁盘读取到内存中,以便找到文件本身。在小规模上这并不显著,但在数十亿张照片和 PB 级数据的情况下,访问元数据成为了吞吐量瓶颈。

解决方案

通过将数十万张图像聚合在一个单一的 haystack 存储文件中,消除了元数据开销。

架构

Facebook 照片存储架构

数据布局

索引文件(用于快速内存加载)+ 包含针的 haystack 存储文件。

索引文件布局 索引文件布局 1

索引文件布局 2

haystack 存储文件

haystack 存储文件

CRUD 操作

  • 创建:写入存储文件,然后 ==异步== 写入索引文件,因为索引不是关键的
  • 读取:read(offset, key, alternate_key, cookie, data_size)
  • 更新:仅追加。如果应用程序遇到重复键,则可以选择具有最大偏移量的一个进行更新。
  • 删除:通过在标志字段中标记删除位进行软删除。硬删除通过压缩操作执行。

用例

上传

照片存储上传

下载

照片存储下载