文件系统是操作系统的重要组成部分,是操作系统中用于和硬盘进行交互,使得软件得以对硬盘数据进行读写访问的程序。文件系统将硬盘以块(data block)为单位进行划分,每个文件占据若干个块(data block),通过文件控制块(File Control Block, FCB)记录文件占据的硬盘data block。在Linux系统中FCB是inode,想要访问文件,就必须获得文件的inode,然后在inode中查找文件的block索引,定位文件data block,然后才能完成读写。所以,数据存储在硬盘上,文件系统用data block来组织,大小为4KB,用地址来标记,用索引来寻址。inode就是用来记录索引的容器。
inode - 索引节点
inode分为两部分,用户数据(user data)和元数据(meta data)
meta data:包含inode编号、权限、所有者、文件大小、时间。注意:不包含文件名
user data:在inode中通过索引来组织数据,一共包含15个索引。结构包含:data block地址和索引表,每个索引表可以记录256个索引
想要系统了解文件系统,还是得先从硬盘这个硬件说起
硬盘
机械硬盘
机械硬盘由盘片、主轴、磁头臂组成。无论是否有IO操作,盘片都需要由主轴带动盘片高速旋转,目的是靠磁盘旋转时带动的气流,让磁头在进行IO时能够悬浮在盘片上方。悬浮的目的是为了避免磁头和盘片接触导致磁头与磁盘损坏。它的存储原理就是,数据存储在具有磁性特质的盘片上。 那为什么都说机械硬盘慢,因为机械硬盘在做IO操作时,磁头臂移动到盘片的磁道上,通过磁头读取磁道上的数据。而移动磁头是一个机械动作,需要花费数毫秒时间,因此机械硬盘慢一些。 其实在说机械磁盘慢的时候,必须要考虑IO是顺序还是随机读写,随机读写也就是硬盘数据在硬盘上不连续,那么磁头就需要来回移动,就会花费更长的时间。而顺序读写,说明文件数据连续,比如日志文件,那么磁头就可以减少移动,读写时间就会很短
固态硬盘
固态硬盘由主控芯片、闪存、外置缓存颗粒、PCB板、外壳组成
固态硬盘的物理原理
SLC 闪存有 0 和 1 两种状态,可以表示 1 bit 数据;MLC 闪存有 11、10、01 和 00 等 4 种状态,可以表示 2 bit 数据;TLC 闪存有 111、110、101、100、011、010、001 和 000 等 8 种状态,可以表示 3 bit 数据 闪存颗粒原理很复杂,简单点说就是闪存颗粒如果要数据读写,需要将电子穿过一个类似电容的场,不然电子乱跑,加电压以后电子顺着场做运动穿过电容中间的二氧化硅,然后读写数据。就像一道水闸,加电压水闸降低,水就流过去了
但固态硬盘也是有寿命限制的,闪存单元每次编程或擦除的电子穿越过程都会导致硅氧化物的损耗。这东西本来就只有区区 10 nm 的厚度,每进行一次电子穿越就会变薄一些。也正因为如此,硅氧化物越来越薄,耐用性自然就更差了。SLC 的电压状态最少,可以容忍电压的更大变化,MLC 的 4 种状态也基本可以接受,TLC 的 8 种就太多了,电压可变余地很小。在不清楚确切的所需电压之时,就不得不将同样的电压分成 8 份(SLC 和 MLC 分别只要 2 份和 4 份)。在使用过程中,编程和擦写一个 TLC 闪存单元所需要的时间也越来越长,最终达到严重影响性能、无法接受的地步,闪存区块也就废了。
所以固态硬盘快是因为相比机械硬盘,固态硬盘没有机械操作,全是电子操作,所以就快。
文件系统
文件系统是操作系统的重要组成部分,是操作系统中用于和硬盘进行交互,使得软件得以对硬盘数据进行读写访问的程序。文件系统将硬盘以块(data block)为单位进行划分,每个文件占据若干个块(data block),通过文件控制块(File Control Block, FCB)记录文件占据的硬盘data block。在Linux系统中FCB是inode,想要访问文件,就必须获得文件的inode,然后在inode中查找文件的block索引,定位文件data block,然后才能完成读写。所以,数据存储在硬盘上,文件系统用data block来组织,大小为4KB,用地址来标记,用索引来寻址。inode就是用来记录索引的容器。
inode - 索引节点
inode分为两部分,用户数据(user data)和元数据(meta data) meta data:包含inode编号、权限、所有者、文件大小、时间。注意:不包含文件名 user data:在inode中通过索引来组织数据,一共包含15个索引。结构包含:
data block地址
和索引表
,每个索引表可以记录256个索引inode大小固定,因此
1个inode可以寻址的最大文件大小 = 可寻址data block数 * data block大小 = (12 + 256 + 256^2 + 256^3) * 4KB ≈ 64GB
独立硬盘冗余阵列(Redundant Array of Independent Disks, RAID)
RAID是通过硬件RAID卡或软件RAID对多个硬盘进行管理,并统一对外提供服务的技术。 为什么要引入RAID这个技术,主要是因为以下原因:
RADI的现有方案
RAID0 将数据分成N片,向N个硬盘并行写入,优点是容量扩大N倍,读写速度扩大N倍。缺点是单个磁盘损坏就会导致文件不可用 RAID1 用两块硬盘互为备份,并行写入。优点是提高可用性,单个硬盘损坏,文件仍可用。缺点是硬盘利用率为50%,资源浪费 RAID10 结合RAID0和RAID1,将现有N个硬盘两两分组,同一组的互为备份,并行写入。优点是容量扩大N/2倍,读写速度扩大N/2倍,可用性提高1倍。缺点是硬盘利用率为50%,资源浪费 RAID5 现有N个硬盘,将数据分为
N - 1
片,通过对N - 1
个数据片做位运算,计算出一片校验数据,将N片数据并行写入N个硬盘。计算校验数据的算法设计上必须要做到:当其中一个数据片丢失时,可以通过校验数据和其他数据片计算出丢失的数据片,进行数据恢复。优点是容量扩大N-1倍,读写速度约扩大N-1倍,硬盘利用率为(N - 1) / N
。缺点是需要先根据N - 1
个数据片做校验数据片的计算,消耗一定CPU资源和时间 RAID6 思想上和RAID5相同,RAID6除了针对N-1个数据片计算校验数据之外,也对每个data block做计算,产出对应的校验data block,产出的校验data block和原始data block要求不能存储在同一个硬盘上。这有让人想起Kafka主从节点那种存储方式。优点是提供了更高的可用性和数据安全性。缺点是计算时间更长了,CPU资源占用更多了以上方案中,RAID5是使用最多,但单台服务器可以插入的硬盘数量是有上限的,所以我们说的N个硬盘中的N,一般就是8。一台服务器只能插入8个硬盘,所以在RAID5下,提高的IO性能一般为7
分布式文件系统(Distributed File System)
想要继续突破IO瓶颈、容量瓶颈的思路就是借助分布式系统,将文件存储在不同服务器中。将inode这个FCB变为一个Service,由一个集群来通过服务。将inode中存储的data block地址从硬盘地址变为网络地址,data block的存储也由一个Service来负责,背后也是一个集群。 在Hadoop分布式文件系统中,这个服务化的inode称为
NameNode
,服务化的data block存储角色称为DataNode
。对数据的读写需要借助Hadoop Client和HDFS(Hadoop Distributed File System)交互参考文章