案例库 · 工程与运营 · 技术决策 · 2008–2010
Facebook构建Haystack在内存中存储数十亿照片及元数据
Facebook的照片存储将每张图片打包为一个巨大的稻草堆文件中的一根针,减少每张照片的元数据,使所有查找在内存中完成——每次读取只需一次磁盘操作。
解法
到2010年,Facebook已上传超过650亿张照片——考虑到所有尺寸,总计2600亿张图像——并且每周新增10亿张。在旧有的网络附加存储上,每次读取都需要多次磁盘操作来将文件名转换为inode并加载元数据,因此元数据访问成为吞吐量瓶颈。
Haystack的设计颠覆了这一点:照片按顺序追加到大文件中(即“稻草堆”),每张照片是“一根针”,只带几个字节的元数据——足以定位它。所有元数据都加载到主内存中,因此一次读取最多访问磁盘一次。由于照片写一次、读多次、从不修改且很少删除,追加式布局完美匹配这一工作负载。
Haystack还在存储机器之间复制照片以实现容错,并减少对昂贵CDN读取的依赖。OSDI 2010的论文报告称,它是Facebook的生产级照片存储,在廉价的商用硬件上处理超过20PB的数据。
生效的原因
- 每次读取照片最多一次磁盘操作
- 每张照片的小元数据使内存查找切实可行
- 追加式布局匹配写一次、读多次的照片
- 减少对昂贵CDN流量的依赖
取得的成效压缩元数据以适应内存;每次读取只需一次磁盘操作聪明
可借鉴之处
当文件系统的每文件开销成为瓶颈时,应围绕工作负载设计存储:写一次、读多次的数据适合元数据能装进内存的对象存储。
后续进展
Haystack支撑了Facebook数十亿上传时代的照片基础设施,其日志结构、元数据内存化的思想影响了后来的对象存储。该论文成为社交规模照片工作负载存储领域被引用最多的系统论文之一。
资料来源
- Finding a Needle in Haystack: Facebook's Photo Storage
- Finding a Needle in Haystack: Facebook's Photo Storage (paper PDF)
发现哪里写错了?告诉我们。