Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

文件系统的演进过程 #7

Open
GarinZ opened this issue May 21, 2021 · 1 comment
Open

文件系统的演进过程 #7

GarinZ opened this issue May 21, 2021 · 1 comment

Comments

@GarinZ
Copy link
Owner

GarinZ commented May 21, 2021

想要系统了解文件系统,还是得先从硬盘这个硬件说起

硬盘

机械硬盘

机械硬盘由盘片、主轴、磁头臂组成。无论是否有IO操作,盘片都需要由主轴带动盘片高速旋转,目的是靠磁盘旋转时带动的气流,让磁头在进行IO时能够悬浮在盘片上方。悬浮的目的是为了避免磁头和盘片接触导致磁头与磁盘损坏。它的存储原理就是,数据存储在具有磁性特质的盘片上。
那为什么都说机械硬盘慢,因为机械硬盘在做IO操作时,磁头臂移动到盘片的磁道上,通过磁头读取磁道上的数据。而移动磁头是一个机械动作,需要花费数毫秒时间,因此机械硬盘慢一些。
其实在说机械磁盘慢的时候,必须要考虑IO是顺序还是随机读写,随机读写也就是硬盘数据在硬盘上不连续,那么磁头就需要来回移动,就会花费更长的时间。而顺序读写,说明文件数据连续,比如日志文件,那么磁头就可以减少移动,读写时间就会很短

固态硬盘

固态硬盘由主控芯片、闪存、外置缓存颗粒、PCB板、外壳组成

  • 主控芯片:相当于固态硬盘的CPU,控制内部运算
  • 闪存:存储内容
  • 外置缓存:有些有、有些没有。有的集成在主控中
  • SLC缓存:提供固态硬盘爆发速度的技术
  • 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个索引

  • 直接数据块指针:前12个索引(下标为0-11),直接记录数据块地址
  • 一级间接索引表指针:第13个索引(下标为12),记录另一个索引表地址,指向另一个索引表。
  • 二级间接索引表指针:第14个索引(下标为13),记录二级索引地址
  • 三级间接索引表指针:第15个索引(下标为14),记录三级索引地址

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这个技术,主要是因为以下原因:

  • 既然文件系统是将数据写入硬盘中的不同data block,那么可以将多个硬盘看作一个整体,这样就可以解决以下问题
  • 提高读写速度,解决IO瓶颈:进行数据读写时,对多个硬盘进行并行读写
  • 解决存储瓶颈:使用多个硬盘可以存储更多数据
  • 提高可用性:对相同数据在不同硬盘写入多份作为备份,其中一个硬盘损坏仍然能保证数据可用

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)交互

  • DataNode:负责文件数据的存储和读写,HDFS将文件划分为若干个数据块(Block),每个DataNode存储一部分Block。
  • NameNode:负责分布式文件系统的元数据(Meta Data)管理,元数据包含文件路径名、访问权限控制、数据块ID、存储位置等。同时负责Block的冗余存储控制(复制为多份,默认为3份)

    通过分布式文件系统可以解决:1)IO瓶颈,毕竟IO并发度就可以变为存储对应文件的DataNode个数;2)容量瓶颈,分布式系统本身已经突破了单机的限制,那么最大容量就由集群规模决定了。

参考文章

@GarinZ GarinZ changed the title 文件系统(File System) 文件系统的演进过程 May 21, 2021
@finnlyu41
Copy link

张总好厉害(づ ̄3 ̄)づ╭❤~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants