分享

Facebook图片存储架构的学习

 WindySky 2019-07-01

照片存储服务器

照片存储服务器负责接受 HTTP 请求,并转换成相应的 Haystack 操作。为了尽量减少服务器检索照片时的I/O操作,该服务器维护着全部 Haystack 中文件索引的缓存。服务器启动时,系统就会将这些索引读到缓存中。由于每个节点都有数百万张照片,必须保证索引的容量不会超过服务器的物理内存。在内存中仅需要保存查找照片所需的少量元数据即可。

对于用户上传的图片,系统分配一个64位的独立ID,照片接着被缩放成4种不同尺寸,每种尺寸的图像拥有相同的随机 Cookie 和64位的密钥,图片尺寸描述(大,中,小,缩略图)被存在代用key 中。接着上传服务器通知照片存储服务器将这些资料连同图片存储到 haystack 中。

每张图片的索引缓存包含以下数据:

由于Google的开源 sparse hash data 结构对于每个条目只有2bit的开销,所以Haystack使用它来保证内存中的索引缓存尽可能小。

照片存 储的写/修改操作

写操作将照片数据写到 Haystack 存储并更新内存中的索引。如果该索引记录中包含了相同的键,那么这是一次对现有的照片进行修改的操作。并且只要修改索引记录中的偏移来反应新图像在haystack存储文件的位置。照片存储始终假定,如果有重复的图像(图像具有相同的键),有较大的偏移量的那个存储是有效的。

照片存储的读操作

传递给一个读操作的参包括Haystack ID,照片的 Key, 尺寸以及 Cookie。服务器事先在缓存中按照照片的Key和所需文件的偏移进行查找。如果找到了它,并向haystack发出读取词图像的请求。按照上面说的,haystack的删除操作并不更新它的索引记录,因此添加到内存中的索引可以包含以前删除的照片的内容。当阅读以前的删除的照片失败后,系统将在内存的索引中色绘制词图片的偏移量为0.

照片存储的删除操作

通知 Haystack 执行删除操作之后,内存中的索引缓存会被更新,将偏移量设置为0,表示照片已被删除。

重新整理(压缩)

重新整理(压缩)是一种回收删除和重复的针(针使用相同的Key)的在线操作。它会通过复制针跳过任何重复或删除的条目创建一个新的 haystack。一旦此操作完成它就回去替换掉内存中的文件和结构。

HTTP 服务器

Http 框架使用的是简单的基于开源的libevent库的 evhttp 服务器。使用多线程,每个线程都可以单独处理一个 HTTP 请求。因为我们的系统消耗大多是I/O操作,HTTP服务器的性能并不很重要。

结束语

Haystack 是一个基于 HTTP 的对象存储,包含指向实体数据的指针,该架构消除了文件系统元数据的开销,并实现将全部索引直接存储到缓存,以最小的 I/O 操作实现对照片的存储和读取。

本文编译自:标点符原文地址

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多