ipfs如何查找一个文件的_如何用 1 分钟遍历一个 100TB 的文件?

如果你在面试的时候遇到这样一个问题:如何用 1 分钟遍历一个 100TB 的文件?是不是立刻就懵圈了?不要紧,读了今天的文章,懵圈的可能是面试官。以下是全文。


文件及硬盘管理是计算机操作系统的重要组成部分,让微软走上成功之路的正是微软最早推出的个人电脑PC操作系统,这个操作系统就叫DOS,即Disk Operating System,硬盘操作系统。我们每天使用电脑都离不开硬盘,硬盘既有大小的限制,通常大一点的硬盘也不过几T,又有速度限制,快一点的硬盘也不过每秒几百M。

文件是存储在硬盘上的,文件的读写访问速度必然受到硬盘的物理限制,那么如何才能1分钟完成一个100T大文件的遍历呢?

想要知道这个问题的答案,我们就必须知道文件系统的原理。

做软件开发时,必然要经常和文件系统打交道,而文件系统也是一个软件,了解文件系统的设计原理,可以帮助我们更好地使用文件系统,另外设计文件系统时的各种考量,也对我们自己做软件设计有诸多借鉴意义。

让我们先从硬盘的物理结构说起。

硬盘

硬盘是一种可持久保存、多次读写数据的存储介质。硬盘的形式主要两种,一种是机械式硬盘,一种是固态硬盘。

机械式硬盘的结构,主要包含盘片、主轴、磁头臂,主轴带动盘片高速旋转,当需要读写盘上的数据的时候,磁头臂会移动磁头到盘片所在的磁道上,磁头读取磁道上的数据。读写数据需要移动磁头,这样一个机械的动作,至少需要花费数毫秒的时间,这是机械式硬盘访问延迟的主要原因。

如果一个文件的数据在硬盘上不是连续存储的,比如数据库的B+树文件,那么要读取这个文件,磁头臂就必须来回移动,花费的时间必然很长。如果文件数据是连续存储的,比如日志文件,那么磁头臂就可以较少移动,相比离散存储的同样大小的文件,连续存储的文件的读写速度要快得多。

机械式硬盘的数据就存储在具有磁性特质的盘片上,因此这种硬盘也被称为磁盘,而固态硬盘则没有这种磁性特质的存储介质,也没有电机驱动的机械式结构。

其中主控芯片处理端口输入的指令和数据,然后控制闪存颗粒进行数据读写。由于固态硬盘没有了机械式硬盘的电机驱动磁头臂进行机械式物理移动的环节,而是完全的电子操作,因此固态硬盘的访问速度远快于机械式硬盘。

但是,到目前为止固态硬盘的成本还是明显高于机械式硬盘,因此在生产环境中,最主要的存储介质依然是机械式硬盘。如果一个场景对数据访问速度、存储容量、成本都有较高要求,那么可以采用固态硬盘和机械式硬盘混合部署的方式,即在一台服务器上既有固态硬盘,也有机械式硬盘,以满足不同文件类型的存储需求,比如日志文件存储在机械式硬盘上,而系统文件和随机读写的文件存储在固态硬盘上。

文件系统

作为应用程序开发者,我们不需要直接操作硬盘,而是通过操作系统,以文件的方式对硬盘上的数据进行读写访问。文件系统将硬盘空间以块为单位进行划分,每个文件占据若干个块,然后再通过一个文件控制块FCB记录每个文件占据的硬盘数据块。

d82789c9ea7e95a817c2e769128db020.png这个文件控制块在Linux操作系统中就是inode,要想访问文件,就必须获得文件的inode信息,在inode中查找文件数据块索引表,根据索引中记录的硬盘地址信息访问硬盘,读写数据。

inode中记录着文件权限、所有者、修改时间和文件大小等文件属性信息,以及文件数据块硬盘地址索引。inode是固定结构的,能够记录的硬盘地址索引数也是固定的,只有15个索引。其中前12个索引直接记录数据块地址,第13个索引记录索引地址,也就是说,索引块指向的硬盘数据块并不直接记录文件数据,而是记录文件数据块的索引表,每个索引表可以记录256个索引;第14个索引记录二级索引地址,第15个索引记录三级索引地址,如下图:

77affe5ccf49de4d90c122f50af2a7bb.png这样,每个inode最多可以存储12+256+256*256+256*256*256个数据块,如果每个数据块的大小为4k,也就是单个文件最大不超过70G,而且即使可以扩大数据块大小,文件大小也要受单个硬盘容量的限制。这样的话,对于我们开头提出的一分钟完成100T大文件的遍历,Linux文件系统是无法完成的。

那么,有没有更给力的解决方案呢?

RAID

RAID,即独立硬盘冗余阵列,将多块硬盘通过硬件RAID卡或者软件RAID的方案管理起来,使其共同对外提供服务。RAID的核心思路其实是利用文件系统将数据写入硬盘中不同数据块的特性,将多块硬盘上的空闲空间看做一个整体,进行数据写入,也就是说,一个文件的多个数据块可能写入多个硬盘。

根据硬盘组织和使用方式不同,常用RAID有五种,分别是RAID 0、RAID 1、RAID 10、RAID 5和RAID 6。

9b7ca6ed967cf4a6d97053e3d8922788.pngRAID 0将一个文件的数据分成N片,同时向N个硬盘写入,这样单个文件可以存储在N个硬盘上,文件容量可以扩大N倍,(理论上)读写速度也可以扩大N倍。但是使用RAID 0的最大问题是文件数据分散在N块硬盘上,任何一块硬盘损坏,就会导致数据不完整,整个文件系统全部损坏,文件的可用性极大地降低了。

RAID 1则是利用两块硬盘进行数据备份,文件同时向两块硬盘写入,这样任何一块硬盘损坏都不会出现文件数据丢失的情况,文件的可用性得到提升。

RAID 10结合RAID 0和RAID 1,将多块硬盘进行两两分组,文件数据分成N片,每个分组写入一片,每个分组内的两块硬盘再进行数据备份。这样既扩大了文件的容量,又提高了文件的可用性。但是这种方式硬盘的利用率只有50%,有一半的硬盘被用来做数据备份。

RAID 5针对RAID 10硬盘浪费的情况,将数据分成N-1片,再利用这N-1片数据进行位运算,计算一片校验数据,然后将这N片数据写入N个硬盘。这样任何一块硬盘损坏,都可以利用校验片的数据和其他数据进行计算得到这片丢失的数据,而硬盘的利用率也提高到N-1/N。

RAID 5可以解决一块硬盘损坏后文件不可用的问题,那么如果两块文件损坏?RAID 6的解决方案是,用两种位运算校验算法计算两片校验数据,这样两块硬盘损坏还是可以计算得到丢失的数据片。

实践中,使用最多的是RAID 5,数据被分成N-1片并发写入N-1块硬盘,这样既可以得到较好的硬盘利用率,也能得到很好的读写速度,同时还能保证较好的数据可用性。使用RAID 5的文件系统比简单的文件系统文件容量和读写速度都提高了N-1倍,但是一台服务器上能插入的硬盘数量是有限的,通常是8块,也就是文件读写速度和存储容量提高了7倍,这远远达不到1分钟完成100T文件的遍历要求。

那么,有没有更给力的解决方案呢?

分布式文件系统

我们再回过头看下Linux的文件系统:文件的基本信息,也就是文件元信息记录在文件控制块inode中,文件的数据记录在硬盘的数据块中,inode通过索引记录数据块的地址,读写文件的时候,查询inode中的索引记录得到数据块的硬盘地址,然后访问数据。

如果将数据块的地址改成分布式服务器的地址呢?也就是查询得到的数据块地址不只是本机的硬盘地址,还可以是其他服务器的地址,那么文件的存储容量就将是整个分布式服务器集群的硬盘容量,这样还可以在不同的服务器上同时并行读取文件的数据块,文件访问速度也将极大的加快。

这样的文件系统就是分布式文件系统,分布式文件系统的思路其实和RAID是一脉相承的,就是将数据分成很多片,同时向N台服务器上进行数据写入。针对一片数据丢失就导致整个文件损坏的情况,分布式文件系统也是采用数据备份的方式,将多个备份数据片写入多个服务器,以保证文件的可用性。当然,也可以采用RAID 5的方式通过计算校验数据片的方式提高文件可用性。

我们以Hadoop分布式文件系统HDFS为例,看下分布式文件系统的具体架构设计。

724b3d4fa3a39da2a3295505d8596acb.pngHDFS的关键组件有两个,一个是DataNode,一个是NameNode。

DataNode负责文件数据的存储和读写操作,HDFS将文件数据分割成若干数据块(Block),每个DataNode存储一部分数据块,这样文件就分布存储在整个HDFS服务器集群中。应用程序客户端(Client)可以并行对这些数据块进行访问,从而使得HDFS可以在服务器集群规模上实现数据并行访问,极大地提高了访问速度。在实践中,HDFS集群的DataNode服务器会有很多台,一般在几百台到几千台这样的规模,每台服务器配有数块硬盘,整个集群的存储容量大概在几PB到数百PB。

NameNode负责整个分布式文件系统的元数据(MetaData)管理,也就是文件路径名、访问权限、数据块的ID以及存储位置等信息,相当于Linux系统中inode的角色。HDFS为了保证数据的高可用,会将一个数据块复制为多份(缺省情况为3份),并将多份相同的数据块存储在不同的服务器上,甚至不同的机架上。这样当有硬盘损坏,或者某个DataNode服务器宕机,甚至某个交换机宕机,导致其存储的数据块不能访问的时候,客户端会查找其备份的数据块进行访问。

有了HDFS,可以实现单一文件存储几百T的数据,再配合大数据计算框架MapReduce或者Spark,可以对这个文件的数据块进行并发计算。也可以使用Impala这样的SQL引擎对这个文件进行结构化查询,在数千台服务器上并发遍历100T的数据,1分钟都是绰绰有余的。

小结

文件系统从简单操作系统文件,到RAID,再到分布式文件系统,其设计思路其实是具有统一性的。这种统一性一方面体现在文件数据如何管理,也就是如何通过文件控制块管理文件的数据,这个文件控制块在Linux系统中就是inode,在HDFS中就是NameNode。

另一方面体现在如何利用更多的硬盘实现越来越大的文件存储需求和越来越快的读写速度需求,也就是将数据分片后同时写入多块硬盘。单服务器我们可以通过RAID来实现,多服务器则可以将这些服务器组成一个文件系统集群,共同对外提供文件服务,这时候,数千台服务器的数万块硬盘以单一存储资源的方式对文件使用者提供服务,也就是一个文件可以存储数百T的数据,并在一分钟完成遍历这样一个大文件的遍历。

思考题

在RAID 5的示意图中,P表示校验位数据,我们看到P不是单独存储在一块硬盘上,而是分散在不同的盘上,实际上,校验数据P的存储位置是螺旋式地落在所有硬盘上的,为什么要这样设计?

欢迎你在评论区写下你的思考,也欢迎把这篇文章分享给你的朋友或者同事,一起交流一下。


是不是发现这不是个简单的问题?这篇文章选自李智慧的专栏《后端技术面试 38 讲》,我觉得非常好。李智慧老师从一道面试题开始,给大家讲了系统文件、RAID、分布式文件系统等内容。其实好的面试题可以引申出非常多的知识体系。点 

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

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

相关文章

calendar类计算时间距离_日期时间--JAVA成长之路

Java中为处理日期和时间提供了大量的API,确实有把一件简单的事情搞复杂的嫌疑,各种类:Date Time Timestamp Calendar...,但是如果能够看到时间处理的本质就可以轻松hold住这堆东西了。常用的类表示类java.util.Date :能够准确记录…

第5章 Python 数字图像处理(DIP) - 图像复原与重建4 - 指数噪声

标题指数噪声指数噪声 指数噪声的PDF为 P(z){ae−az,z≥00,z<0(5.10)P(z) \begin{cases} ae^{-az}, & z\geq 0 \\ 0, & z < 0 \end{cases} \tag{5.10}P(z){ae−az,0,​z≥0z<0​(5.10) 均值和方差为 zˉ1a(5.11)\bar{z} \frac{1}{a} \tag{5.11}zˉa1​(5.…

第5章 Python 数字图像处理(DIP) - 图像复原与重建5 - 均匀噪声

标题均匀噪声均匀噪声 均匀噪声的PDF为 P(z){1b−a,a≤z≤b0,other(5.13)P(z) \begin{cases}\frac{1}{b-a}, & a\leq z \leq b \\ 0, & \text{other}\end{cases} \tag{5.13}P(z){b−a1​,0,​a≤z≤bother​(5.13) 均值和方差为 zˉab2(5.14)\bar{z} \frac{a b}{2…

jquery实现的3D缩略图悬停效果

今天我们要告诉你如何创建一些令人兴奋的3D使用CSS3和jQuery悬停效果。这一想法的灵感来自于凉爽的悬停效果&#xff0c;再给客户做网站的时候用的这样的效果&#xff0c;今天就共享出来 在这个效果当中&#xff0c;我将使用的thumbails&#xff0c;就会发现一些更多的信息悬停…

python网页爬虫例子_Python 利用Python编写简单网络爬虫实例3

利用Python编写简单网络爬虫实例3 by:授客 QQ&#xff1a;1033553122 实验环境 python版本&#xff1a;3.3.5&#xff08;2.7下报错 实验目的 获取目标网站“http://bbs.51testing.com/forum.php”中特定url&#xff0c;通过分析发现&#xff0c;目标url同其它url的关系如下目标…

登陆SharePoint站点出现service unavailable----Http错误503

今天在登陆SharePoint站点时&#xff0c;遇到服务不可用&#xff0c;Http error 503。建议如下操作&#xff1a; 1. 在IIS中检查站点属性。在“起始页”&#xff0c;检查应用程序池。 2. 发现SharePoint Web Services Root已停止&#xff0c;右键启动。问题得到解决。 PS&#…

C# 数组

什么是数组&#xff1f;数组是一种数据结构&#xff0c;包含同一个类型的多个元素。数组的声明&#xff1a;int[] myIntArray; 注&#xff1a;声明数组时&#xff0c;方括号 ([]) 必须跟在类型后面&#xff0c;而不是变量名后面。在 C# 中&#xff0c;将方括号放在变量名后是不…

Downloading Android Source Code

Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制软件&#xff0c;它不同于Subversion、CVS这样的集中式版本控制系统。在集中式版本控制系统中只有一个仓 库&#xff08;repository&#xff09;&#xff0c;许多个工作目录&#xff08…

第5章 Python 数字图像处理(DIP) - 图像复原与重建6 - 椒盐噪声

标题椒盐噪声椒盐噪声 如果kkk是一幅数字图像中表示灰度值的比特数&#xff0c;则灰度值可能是[0,2k−1][0, 2^k -1][0,2k−1]。椒盐噪声的PDF为&#xff1a; P(z){Ps,z2k−1Pp,z01−(PsPp),zV(5.16)P(z) \begin{cases} P_s, & z 2^k -1 \\ P_p, & z0 \\ 1-(P_s P_…

Keras 深度学习框架中文文档

2019独角兽企业重金招聘Python工程师标准>>> Keras深度学习框架中文文档 Keras官网&#xff1a;http://keras.io/Github项目&#xff1a;https://github.com/fchollet/keras中文文档主页&#xff1a;http://keras-cn.readthedocs.io/en/latest/Github中文文档&#…

求一个二维数组外围元素之和_C++数组作为函数的参数(学习笔记:第6章 04)...

数组作为函数的参数[1]数组元素作实参&#xff0c;与单个变量一样。数组名作参数&#xff0c;形、实参数都应是数组名&#xff08;实质上是地址&#xff0c;关于地址详见后续章节&#xff09;&#xff0c;类型要一样&#xff0c;传送的是数组首地址。对形参数组的改变会直接影响…

android p wifi一直在扫描_Android再次解读萤石云视频

点击上方蓝字关注 ??前言我之前写过一篇萤石云的集成文章&#xff0c;很多人问我有没有demo&#xff0c; 今天我再次总结一下&#xff0c; 并加个些功能。集成步骤视频预览播放视频放大缩小视频的质量切换截图之前的文章大家可以看下面的链接&#xff1a;https://mp.weixin.q…

第5章 Python 数字图像处理(DIP) - 图像复原与重建7 - 周期噪声 余弦噪声生成方法

标题周期噪声周期噪声 周期噪声通常是在获取图像期间由电气或机电干扰产生的 def add_sin_noise(img, scale1, angle0):"""add sin noise for imageparam: img: input image, 1 channel, dtypeuint8param: scale: sin scaler, smaller than 1, will enlarge, …

第5章 Python 数字图像处理(DIP) - 图像复原与重建8 - 估计噪声参数

标题估计噪声参数估计噪声参数 周期噪声的参数通常是通过检测图像的傅里叶谱来估计的。 只能使用由传感器生成的图像时&#xff0c;可由一小片恒定的背景灰度来估计PDF的参数。 来自图像条带的数据的最简单用途是&#xff0c;计算灰度级的均值和方差。考虑由SSS表示的一个条…

python 随机获取数组元素_Python创建二维数组的正确姿势

List &#xff08;列表&#xff09;是 Python 中最基本的数据结构。在用法上&#xff0c;它有点类似数组&#xff0c;因为每个列表都有一个下标&#xff0c;下标从 0 开始。因此&#xff0c;我们可以使用 list[1] 来获取下标对应的值。如果我们深入下列表的底层原理&#xff0c…

在ubunut下使用pycharm和eclipse进行python远程调试

我比较喜欢Pycharm&#xff0c;因为这个是JetBrains公司出的python IDE工具&#xff0c;该公司下的java IDE工具——IDEA&#xff0c;无论从界面还是操作上都甩eclipse几条街&#xff0c;但项目组里有些人使用eclipse比较久了&#xff0c;一时让他们转pycharm比较困难&#xff…

CSS:页脚紧贴底部

2019独角兽企业重金招聘Python工程师标准>>> 我的练习来源于《CSS揭秘》这本书第7章-41紧贴底部的页脚这部分内容以及书中提到的链接。 方案一 描述&#xff1a;以下方案简单、干净、现代并且没有hack&#xff0c;适用于IE8, Chrome, Firefox, Opera等浏览器&#x…

第5章 Python 数字图像处理(DIP) - 图像复原与重建9 - 空间滤波 - 均值滤波器 - 算术平均、几何平均、谐波平均、反谐波平均滤波器

标题只存在噪声的复原 - 空间滤波均值滤波器算术平均滤波器几何均值滤波器谐波平均滤波器反&#xff08;逆&#xff09;谐波平均滤波器只存在噪声的复原 - 空间滤波 仅被加性噪声退化 g(x,y)f(x,y)η(x,y)(5.21)g(x, y) f(x, y) \eta(x, y) \tag{5.21}g(x,y)f(x,y)η(x,y)(5…

第5章 Python 数字图像处理(DIP) - 图像复原与重建10 - 空间滤波 - 统计排序滤波器 - 中值、最大值、最小值、中点、修正阿尔法均值滤波器

标题统计排序滤波器中值、最大值、最小值、中点 滤波器修正阿尔法均值滤波器统计排序滤波器 中值、最大值、最小值、中点 滤波器 f^(x,y)median{g(r,c)}(5.27)\hat{f}(x, y) \text{median} \{g(r,c)\} \tag{5.27}f^​(x,y)median{g(r,c)}(5.27) f^(x,y))max{g(r,c)}(5.28)\ha…

如何设置坐标原点值_氨气检测仪电化学原理及报警值如何设置

氨气体检测仪检定规程&#xff1a;一般氨气体检测仪检定规程主要是针对技术参数设定的一些标准&#xff0c;具体包含有规程的名称和范围、仪器示值误差、充分性标准差、响应时间、稳定性、报警功能、流量控制器、检定项目表、检定操作有数值误差、重复性、响应时间、稳定性等。…