Haystack 太强了!存 2600 亿图片

f29e0a01994dc31c4e669128aceefeb0.gif

作者 | 奇伢

来源 | 奇伢云存储

f18404ffd4c79ff59917c5f122555a57.png

小文件存储

83e621ff787ec1fbfc6e45d5d4f2aeb6.png

小文件存储,老生常谈的问题。先聊聊小文件存储重点关注的是什么?

以前我们提过,对于磁盘来说,小 io 吃 iops,大块 io 吃吞吐。

划重点:小文件的重点是 io 次数。

为什么每次提到海量小文件的时候,总说传统的文件系统不合适呢?

因为它的元数据操作太惹人眼球了。假设有 1K 的数据,元数据如果搞个 1K ,这个开销就太大了,空间大一倍,性能下降一倍。所以,只要是针对小文件的存储优化,基本上都会在元数据上下点功夫。

168d984368ac66d243a763976ba877e4.png

Haystack 的背景

450edeff92980d4f5cde12dfea1d7e95.png

Haystack 是 Facebook 为了解决他们图片存储而专门设计的一套存储架构,2012 年发表论文《 Finding a needle in Haystack: Facebook’s photo storage 》。

文中提到当时( 2012 年 )他们已经有 2600 亿张图片,超过 20 PB 的数据,用户每周上传 10 亿张,大约 60 TB 的数据。

从这个数据量来看,确实谈得上海量的文件。算出来的图片平均大小 64K 左右吧,不大,就是以前普通图片的大小。

64K 不知道怎么算的?

用 60 TB 除一个 10 亿就知道了。

ab8a827d5e876ec00c0fb0de35f33e92.png

Haystack 的特点

4937c2c79d5b0471fed266929bf57587.png

接下来聊聊 Haystack 的设计到底有什么神奇特点呢?可以归纳下面四点:

  • Write Once

  • Read Often

  • Nerver Modify

  • Rarely Deleted

大白话就是,只写一次,从不更新,不定期会读,极少删除。这个 Haystack 特点是适配 Facebook 的图片场景的。

注意,是先有 facebook 的业务场景特点,然后才把 Haystack 设计成这样的。因果关系不要搞反了哦。

68971a4a18dfcb4727649d319a469c59.png

海量的文件的挑战在哪里?

1799a8f28fd6e3fca3c264ef34bfbd80.png

每一次文件存储会涉及到元数据和数据两部分的操作。当数量是海量的时候,无论是对存储容量元数据的量都会带来巨大的影响。

存储容量这个自不用提,这是用户的数据,它是你必须要存储的,通常这里考虑的是存储效率,考虑用更少的介质、更高的可靠性,来存储更多的数据,通常这里的选型是副本和纠删码。

元数据就有意思了,因为这个是内部的设计导致的冗余数据(为了索引用户数据而产生的数据),元数据的设计则会影响到用户的体验,特别是海量的场景。

童鞋思考个问题:海量、小文件 的前提下,为什么元数据会带来挑战?挑战主要是哪些方面?

 1   存储成本有挑战

划重点:任何的评估不能脱离场景。

举个简单的例子,假如每个文件 1K ,每个文件对应元数据也 1K ,这开销大不大

太大了嘛。一倍的浪费。在海量的背景下,用户存储 1P 的数据,就要存储 1P 的元数据,浪费在元数据的成本无法容忍。

那元数据设计成 1K 的是错误的吗?

不一定。

比如说,如果是每个文件 1G,对应每个元数据 1K 呢,这个开销大不大

不大,因为 1K/1G 才是 0.00009% ,也就是说,用户存储 1P 的数据,元数据消耗为 0.092 TB ,这成本几乎可以忽略。

所以,前提很重要,设计好坏并不是绝对的,都是相对而言的,任何架构都要适配自己的场景。

 2   存储性能有挑战

接着上面的例子,每个文件 1K ,每个文件对应元数据也 1K ,这性能开销大不大

太大了嘛。性能是一倍的损耗。每个文件 1K ,本该一次磁盘 IO 就能解决,但是另外还要加一次元数据操作的磁盘 IO 。也就是说磁盘极限如果 1 万的 iops ,用户只能获取到 5000 的 iops 性能。内部损耗一半

那如果是每个文件 1G,对应每个元数据 1K 呢,这个开销大不大

不大嘛,假设每笔 io 是 4K 的定长大小。1G 的数据写 262144 次。只是多加一次元数据 IO ,无关紧要。

 3   Hasystack 的突围方向

划重点:小文件的场景,元数据的成本消耗和性能消耗会显得更突出。再加上海量的前提下,这个是必须要解决的挑战。

那 Haystack 应该怎么做呢?两个方面:

  1. 重新设计元数据结构,而不是使用文件系统的结构,要精简元数据的大小;

  2. 削减元数据的 io 的次数,甚至从 io 路径上彻底消除元数据它;

你如果理解了上面的栗子,对于这两个优化方向的导出应该也是水到渠成的。

c183b28a90a4baa1d292d3ae65ce5246.png

Haystack 的目标

c14014e24a747b88b91e6f2d37350a63.png

  • 高吞吐,低延迟

  • 高可靠,具备故障容错能力;

  • 架构简单,底成本

bd8f0b878764cfbc80d96334d1bb631c.png

Haystack 的架构设计

7848636f84662116a0e3ce1aac3e5a55.png

 1   整体架构

Haystack 的架构非常简单,截取论文中的图片:

4af081bb8403f39a5587a942cdd1fe7a.png

图中表明了三个核心组件:

  1. Haystack Directory

  2. Haystack Cache

  3. Haystack Store

Store 就是一个单机的存储引擎,上层告诉它写哪,它就写哪。管理的单位是一个个大块文件。Haystack 里面叫做 Physical Volume ,其实就是一个个大文件而已啦。

划重点:Haystack 也是基于文件系统之上的。

Physical Volume 有一个阈值,比如写满 100 GB就不写了。可以把它理解成一个大日志文件,数据的写入方式也是 log 日志的方式,append 写入。

Directory 是最上层的一个抽象,上面提到 Store 管理的是 Physical Volume ,上报到 Directory 组件,Directory 把这些底层的 Physical Volume 按照副本关系组织起来形成 Logical Volume 。Logical Volume 就是提供给用户写入数据用的。

举个简单的例子,如果是三副本的 Haystack 系统,那么一个 Logical Volume 由 3 个 Physical Volume 组成副本镜像。

Cache 这个就不用说了,就是一个单纯的缓存组件。

 2   数据怎么组织

奇伢用几个问题的形式来阐述数据的组织。

问题一:Physical Volume 是什么?

其实就是大文件,Haystack Store 是基于文件系统之上的。Physical Volume 就实现形式来讲就是文件,可以是 ext4 的文件,也可以是 xfs 的文件。只不过这个文件有名字( Physical Volume ID ),也是一个阈值,比如 100 GB 。

问题二:Logical Volume 是什么?

抽象出来的结构。由多个 Physical Volume 组成。它的个数由副本数决定,比如一个 3 副本 Logical Volume 由 3 个 Physical Volume 组成。

问题三:Physical Volume 内部又是有什么构成呢?

一个叫做 Needle 的东西。

909935d875ae1f4d00e633f5b922946d.png

Needle 其实就是用户数据加一些头部,加一些尾部构成的一个整体结构。Physical Volume 就是由这一个个 Needle 组成的。

问题四:Needle 的头尾有啥用?

主要几个方面:

  1. 用来构建元数据索引用的,里面有 key,size 等关键数据;

  2. 用来校验数据是否损坏,里面有 magic,crc 等;

  3. 用来标识数据是否删除,里面有 Flags 标记位;

这些头尾数据就是 Haystack 给每个用户对象重新设计的元数据了,相比文件系统的元数据,这个太精简了

在内存中的内存表,甚至只需要一个 16 个字节就够了,8 字节的 key ,4 字节的 offset,4 字节的 size 。这个比内核文件系统动辄几百字节甚至几 K 字节要好太多了。

问题四:元数据现在多大了?

元数据分为磁盘元数据(持久化了的)和内存元数据。

磁盘元数据可以看上面的 Needle 结构体,具体实现在 32 字节左右。内存元数据可以控制在 16 个字节。

 3   读、写、删

数据写入的流程:

49a0a3bf52d9ee765e2a3fe1e3e25c45.png

  1. Web 接入点先去 Haystack Directory 选一个 Logical Volume ;

  2. 把数据发往 Haystack Store ,写到对应的三个 Physical Volume 即可(注意,append 写入哦);

数据读取的流程:

ff9fd804ddeba1989c9720615ee3439c.png

  1. Web 接入点先去 Haystack Directory 拿到指定对象的元数据;

  2. 然后请求发给 Haystack Store ,读取数据(这里就不提 Haystack Cache 或者 CDN 的逻辑了,过于简单);

数据删除的流程:

  1. Web 接入点先去 Haystack Directory 拿到指定对象的元数据;

  2. 然后把删除请求发给 Haystack Store ,就地更新 Needle 的标记位,标记成删除;

划重点:Haystack 的删除是就地更新,而不是 append 写入。这里跟纯粹的 log 文件不大一样。 但由于删除是极少的,所以就算不是 append 写入,也不影响大局。

 4   空间回收

Haystack 也和 LSM,Bitcask 等设计类似,删除是删除,回收是回收,这是两个步骤。

空间回收就是 Compact ,太简单了,论文甚至都没稀的提它,寥寥数语说了两句,原文描述如下:

A Store machine compacts a volume file by copying needles into a new file while skipping any duplicate or deleted entries.

实现很简单,和以前提过的 Compact 并无二样。逻辑就是遍历 Volume 文件,把重复的和标记删除了的 Needle 跳过,有效的 Needle 读出来写到新的地方,即可。

eaa2ca9f69b7731ce9549f7dc7da917d.png

不一样的思考

5d413d20cee46a405878c2cb11b5197e.png

回想一下这个架构,思考一下它做到了它立的 flag 吗?

 1   它的目标:高吞吐,低延迟,怎么实现的呢?

对于写请求,全都化为 append 请求,极力的保持磁盘的顺序性能。并且得益于 Needle 的设计,Haystack 把数据和元数据放在一起,一次性落盘,相当于省去了元数据的 IO 写开销

当然,这种设计也必然有代价,由此带来的代价就是加载时间变长

对于读请求,通过元数据的精简,让内存 hold 住所有的元数据,去除了元数据的 IO 开销,这样读操作也就只剩用户数据的 IO 。

注意:Haystack 删除不是 append 哦,而是覆盖写,但之前已经说过了,Haystack 的适用场景就是“极少删除” 。

 2   高可靠,故障容错怎么实现的呢?

这个很简单,通过副本冗余来做的。Volume 的组织逻辑放在 Directory 组件中,一份数据存储多份,并且分散在不同的位置。当其中一份故障,则只需要拷贝其他副本即可。

 3   毕竟 2012 年的论文,Haystack 的实践过时了吗?

论文中提到,Facebook 当时的实践是用 2U 的刀片服务器,48G 内存,搭配 12 * 1TB 的 SATA 盘。

如果按照一个文件 64 KB 算,一个 needle 内存元数据 16 字节(这个很极限了),只需要 3 G 的内存,单机 48 GB 的物理内存应对这整机的元数据确实绰绰有余。

但现在很多服务器已经升级到 64 盘,单盘 16 TB,满载的话需要 256 G 的内存装元数据。这个内存配比就不大合适了,如果元数据再稍微大点,就更不行了。

但话说回来,并不是每个人都用 64 盘 16 T 的高密服务器,所以并不能一概而论,还是要看自己的需求场景。

就算过去 10 年,我觉得它还能秀。

16ec75f0c9b0ed3bd20b223559120ffe.png

总结

634eb1f7a9d744e0781cfd1e4c83d89e.png

  1. Haystack 最核心的优化是?重新设计元数据的结构,使得内存元数据只有十几个字节,极大的减轻了负担,且设计的 Needle 结构可以完整恢复内存元数据;

  2. 得益于元数据的精简,Haystack 就能把单机全量元数据放在内存

  3. 读的时候,元数据在内存,只有用户数据的 IO 消耗,极大的提高了性能;

  4. 写的时候,得益于 Needle 的设计,元数据更新操作不单独刷,而是和用户数据在一起刷,相当于省掉了元数据 IO 的开销;

  5. 和 Bitcask 类似,为了提高内存加载速度,也有索引(Index 文件)的实现

  6. Haystack 并不过时,可以结合自己的场景,焕发生机;

dfdb10d93257105731e7a72144088232.gif

往期推荐

为什么还有这么多的网络故障?

k8s集群居然可以图形化安装了?

用了HTTPS,没想到还是被监控了

将 k8s 制作成 3D 射击游戏,好玩到停不下来

fd0f6070cc3e285ad80074aac2db7dab.gif

点分享

9833c600fe71fb61f25d2c12ce48675e.gif

点收藏

3e62624c3cf9b24b6926632714fde71b.gif

点点赞

a35368154f1e91ba3c3ceebb13c56ea2.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国计算机网络教学研讨会,历届全国高校计算机网络教学研讨会

1. 第六届全国高校计算机网络教学研讨会在内蒙古大学成功召开2. 第五届全国高校计算机网络教学研讨会在温州大学成功召开 2012年10月26日-27日,第五届全国高校计算机网络教学研讨会在温州大学召开。会议由中国计算机学会互联网专业委员会和中国计算机学会…

Dubbo 和 HSF 在阿里巴巴的实践:携手走向下一代云原生微服务

简介: HSF 和 Dubbo 的融合是大势所趋。为了能更好的服务内外用户,也为了两个框架更好发展,Dubbo 3.0 和以 Dubbo 3.0 为内核适配集团内基础架构生态的 HSF 3 应运而生。 作者 | 郭浩 Dubbo 和 HSF 都是阿里巴巴目前在使用的微服务 RPC 框架…

apache过滤恶意频繁访问_采用网关过滤器实现权限验证及对异常统一处理

采用网关过滤器实现权限验证1、创建 zuul 项目2、修改 pom.xml 文件<project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://mav…

如何攻破容器持久化存储挑战?

背景 云原生趋势下&#xff0c;应用容器化比例正在快速增长&#xff0c;Kubernetes 也已成为云原生时代新的基础设施。 观察今天的容器和 Kubernetes 的应用现状&#xff0c;可以看到两个普遍的现象&#xff1a; 首先&#xff0c;在云上托管 Kubernetes 已经成为企业上云及运…

用科技共创美好:英特尔助力北京冬奥会新体验

2022年1月24日&#xff0c;北京2022年冬奥会在即&#xff0c;北京冬奥会的气氛愈发浓烈。作为奥运会全球TOP合作伙伴&#xff0c;英特尔以基于英特尔处理器的创新技术支持奥运会&#xff0c;释放科技冬奥的魅力。今天&#xff0c;英特尔在位于前门建成的全新升级的“英特尔北京…

职称计算机Word2003是考什么,2017年职称计算机考试word2003考点

2017年职称计算机考试word2003考点计算机在我们的工作中太重要了&#xff0c;很多工作岗位对计算机都有一定的要求。以下是小编整理的2017年职称计算机考试word2003考点&#xff0c;希望可以为您的学习带来帮助!内置段落样式1、套用段落样式&#xff1a;选中要套用样式的一个或…

李飞飞:新技术变革时代的数据库产业

简介&#xff1a; 云计算将改变数据库格局 近日&#xff0c;阿里云智能数据库事业部负责人李飞飞在媒体沟通会上发表了“新技术变革时代的数据库产业”主题演讲。 李飞飞说&#xff0c;云数据库已经成为数据库最重要的发展方向&#xff0c;从国际国内数据库产业的发展来看&am…

iostat命令详解_对iostat输出结果的理解

前言&#xff1a;日常工作中&#xff0c;线上服务会出现各种奇奇怪怪的问题&#xff0c;每次出现问题都是根据现象猜测出现问题的原因&#xff0c;比如请求响应慢了&#xff0c;就排查整个请求的逻辑&#xff0c;每一步花了多少时间&#xff0c;分析半天终于发现是某一步慢了以…

计算机windows10属性配置,电脑显示属性设置,教你win10系统电脑显示属性的设置教程...

今天小编教你win10系统电脑显示属性的设置教程&#xff0c;显卡作为计算机最为基本的配置和最重要的配件之一&#xff0c;承担着输出显示图形的任务。不知电脑显卡设置在哪里打开及如何设置的用户&#xff0c;请来看看下面的介绍吧。显卡是一台电脑的第二个核心&#xff0c;我们…

庖丁解牛-图解MySQL 8.0优化器查询解析篇

简介&#xff1a; SQL优化器本质上是一种高度抽象化的数据接口的实现&#xff0c;经过该设计&#xff0c;客户可以使用更通用且易于理解的SQL语言&#xff0c;对数据进行操作和处理&#xff0c;而不需要关注和抽象自己的数据接口&#xff0c;极大地解放了客户的应用程序。 作者…

三款典型国产分布式数据库的对比评测

简介&#xff1a; 编者按&#xff1a;近几年国产数据库市场风生水起&#xff0c;涌现了多款优秀的国产数据库产品&#xff0c;本文选取了三款典型的国产分布式数据库进行全方位对比压测&#xff0c;呈现了国产分布式数据库的发展现状。 对于所有的应用系统&#xff0c;数据都是…

bootstraptable中responsehandle获取数据缺失_Python中的向量化字符串操作

Python的一个使用优势是它在处理和操作字符串数据方面相对容易。在此基础上Pandas提供了一套全面的向量化字符串操作(vectorized string operation)&#xff0c;这些操作成为处理现实世界数据时所需的必不可少的功能。在本文中&#xff0c;我们将介绍一些Pandas的字符串操作&am…

15 载专注视频增强技术,小而美的 Imint 蕴藏大匠心

如今视频已深深融入我们的生活和工作中&#xff0c;据 CNNIC 数据显示&#xff0c;截止 2021 年 6 月&#xff0c;我国网民的规模达 10.11 亿&#xff0c;其中短视频用户规模 8.88 亿&#xff0c;占网民整体的 87.8%。 这表明我们正步入“视频社会化”时代&#xff0c;随着人们…

Serverless Devs 2.0 全新发布,让 Serverless 应用开发更简单

简介&#xff1a; 2020 年 10 月 23日&#xff0c;阿里巴巴正式宣布开源其首个 Serverless 开发者平台 Serverless Devs。历经近一年精心打磨&#xff0c;今天 Serverless Devs 2.0 正式版全新发布。Serverless Devs 2.0 在平台能力、应用模板以及开发者套件方面能力提升&#…

疫情防控“漫入调查系统”上线 SENSORO 助力提升筛查效率及精准度

连日来&#xff0c;国内多地报告新增病例&#xff0c;加上因春节临近导致的人员流动和聚集增加&#xff0c;基层防疫面临着比平时更大的挑战。为快速、高效地解决大规模漫入信息筛查任务&#xff0c;缓解一线疫情防控压力&#xff0c;SENSORO&#xff08;北京升哲科技有限公司&…

程序媛如何自我突破?

简介&#xff1a; 很多时候人们是被自己内心的偏见所打败的。作为一名程序媛&#xff0c;保持一种对世界、对人生的不同看法&#xff0c;可以帮助我们树立自己的参照系&#xff0c;不被外部轻易左右。或许我们无法像一些伟人那样打破、推动如此重大的社会认知&#xff0c;但是我…

如何基于Dataphin实现敏感数据保护

简介&#xff1a; 在企业的发展过程中&#xff0c;如果不重视敏感数据的保护&#xff0c;和数据安全体系的建设&#xff0c;那么一旦发生了敏感数据泄漏事件&#xff0c;轻则企业口碑受损&#xff0c;业务受影响&#xff1b;重则会直接触法律&#xff0c;受到主管部门的处罚和制…

百度研究院发布2022科技趋势预测:大模型实用化、AI助力深空探测成热门

1月25日&#xff0c;百度研究院发布2022年科技趋势预测&#xff0c;这是其连续第三年发布对前沿科技趋势的展望。 今年上榜的科技趋势预测涵盖了AI核心技术、交叉学科与跨领域研究&#xff0c;以及AI的产业及社会价值三个层面&#xff0c;包括预训练大模型、AI for Science&am…

计算机操作员技术特长,计算机及应用专业自我鉴定(通用5篇)

计算机及应用专业自我鉴定(通用5篇)自我鉴定是个人在一个阶段的自我总结&#xff0c;自我鉴定可以总结出具体的经验&#xff0c;因此我们是时候写一份自我鉴定了。自我鉴定一般是怎么写的呢&#xff1f;以下是小编收集整理的计算机及应用专业自我鉴定(通用5篇)&#xff0c;仅供…

5 款阿里常用代码检测工具,免费用!

简介&#xff1a; 5 款阿里常用代码检测工具免费体验&#xff0c;仅需 2 步&#xff0c;Cherry键盘、公仔抱回家&#xff0c;100%拿奖&#xff01; 作者 | 喻阳 面临问题 在日常研发过程中&#xff0c;我们通常面临的代码资产问题主要分为两大类&#xff1a;代码质量问题和代…