分享

Facebook图片存储架构的学习

 WindySky 2019-07-01

Haystack 对象存储

Haystack 是一个简单的日志结构(只能追加),存储着其内部数据对象的指针。一个 Haystack 包括两个文件,包括指针和索引。下面的图片将描述haystack存储文件的布局:

haystack最前面的8K存储是被超级块占用。紧随超级块是针,每针组成的一个头部,数据和尾部:

一个针被他的元组标识,其中的偏移量为其在haystack存储的偏移。Haystack不在任何健值上做限制,即允许可以有重复键针。下图显示了索引文件的布局:

在haystack存储文件中有每针相应的的索引记录,并且包含针索引记录的顺序必须和haystack存储文件相关的针的顺序相匹配。按照规定索引文件的最低需求是找到一个特定的针在haystack存储文件的元数据。载入和组织索引记录到一个有效的查找数据结构是Haystack程序的责任。索引文件是不是很关键,因为如果需要它可以从haystack存储文件重建。索引的主要职责是让针元数据无需通过较大的Haystack存储文件,快速加载到内存中。原因是其可以让索引编程原来存储的1%。

Haystack 写操作

Haystack 写操作同步将指针追加到 haystack 存储文件,当指针积累到一定程度,就会生成索引写到索引文件。由于索引文件是不是很关键,为了能有更快的性能所以采用异步的方式进行写入。

为了降低硬件故障带来的损失,索引文件还会定期写到存储空间中。在崩溃或突然断电的情况下,将haystack恢复处理器存储中任何残缺的针和截断haystack存储中最后一个有效的针。接下来,它会把丢失的针的索引记录 写到haystack文件的最后。

Haystack不允许重写现有的针偏移,如果一个针数据需要被重写,那么新版本必须使用相同的元组。应用程序会自动分辨出这两个相同的键,有最大偏移的便是最新的那一个。

Haystack 读操作

传到 haystack 读操作的参数包括指针的偏移量,健,备用键,Cookie 以及数据大小。Haystack为数据大小添加头部和尾部的长度,然后根据数据尺寸从文件中读取整个指针。读取操作成功的关键就是作为参数传递的健,备用键,Cookie是否匹配,数据是否通过了校验,并且针没有被删除掉。(见下文)

Haystack 删除操作

删除操作比较简单 – 只需要在 Haystack 存储的指针字段中的“删除”位标记一下即可。并且,相关的索引记录不会做任何的修改。是最终的应用程序引用到的是一个删除的针。像这样一个读取删除针的操作将会返回一个相应的错误给应用程序。空间对已删除的针不做任何的回收,只有这样,才能使 haystack 的空间非常的紧凑。(见下文)

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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多