目录
一、文件系统
百度上是这样描述文件系统的:
我的理解就是对于底层的资源,比如硬盘进行逻辑组织,对于上层的应用提供统一文件的接口。
那么为什么要使用文件系统呢。
在计算机的世界中,数据通过1和0来表示。为什么使用1和0这种二进制,而不使用我们人类比较熟悉的0到9的十进制呢?答案是因为1和0比较好表示。对于计算机来讲电子特性最亲近,高电平用0,低电平用1,这样最快、最直接。可以用数字电路或者模拟电路,来实现表示1和0。
那么计算机是怎么管理这些数据的呢。
如果每一位数据都要进行管理,这无疑会为编码带来巨大的挑战,于是计算机使用块作为最小的管理单位。注意这里的块不是我们熟悉的块存储中的块(RAID控制器每次读取的最小单位),也并非是硬盘上的某一个扇区(一般512B大)。在Linux文件系统中这个块叫做block(一般1KB),在Windows文件系统FAT中叫做簇(一般4KB)。
一份文件无论他有多大,FS都将他切成整数个块,不足一块的也使用一个块,这部分未使用的空间叫做块内碎片。接下来文件系统会采用不同的方式来对这些块进行逻辑映射,把他们组织起来。
二、机械盘的架构
机械盘通过磁性来记录数据,它包括几个重要部件:盘面、机头、控制器、步进电机等。
每个磁盘有上下两个盘面,在盘面上划分磁道,再细分出扇区,如下图所示:
一般一个扇区可以记录512B的数据,盘面旋转时的物理特性能够让磁头在一个相较于盘面合适的距离上漂浮,磁头能够在步进电机的帮助下换磁道。计算机有很多种方式来决定磁头的寻道策略,比如最近最短、电梯算法等。
数据一般使用CHS编码的方式,即 Cylinders、Heads、Sectors (柱面、磁头、扇区) 。这种方式好处是比较直接,但是对于一块盘来讲,还是期望能有一个整体的所有扇区的寻址方式。于是便有了LBA,逻辑区块地址。理解他的话,就是在逻辑上把所有扇区全部排列到一起123456......
LBA(逻辑扇区号)=磁头数 × 每磁道扇区数 × 当前所在柱面号 + 每磁道扇区数 × 当前所在磁头号 + 当前所在扇区号 – 1
那么机械盘和块有什么联系呢。
可以看到不同的文件系统,无论是簇还是BLOCK都是由许多个扇区组成的。
三、闪存盘颗粒和特性
我们都知道机械盘是IT重要基础设备中唯一非电子元件,他的处理速度远远赶不上cpu。为了减少系统中断时间,科学家们使用了缓存技术,并对读写进行优化。直到闪存盘的出现,才真正改良了现状。
(1)先来了解存储控制器的种类:
按照存储介质分为三大类:光学存储、半导体、磁性存储。
在半导体存储中,可以按照是否非易失性分为随机的(RAM)和只读的(ROM)。
RAM按照是否需要定期充电刷新分为:动态的(DRAM)、静态的(SRAM)。综合考虑性能、成本和扩展性,目前都是用DRAM做内存芯片,SRAM做高性能领域的运用(比如CPU的一二级缓冲)。
(2)固态盘的分类
SSD盘属于非易失性存储介质ROM。ROM刚出现的时候是只读的(read only),后来也出现了可擦除的,但是命名和分类还是延续了。
闪存盘属于FLASH,有NAND FLASH和NOR FLASH。
FLASH芯片分为三极:源极(Source)、漏极(Drain)、栅极(Gate)。
栅极和底座(P substrate)之间有一层绝缘物质(oxide一般是使用二氧化硅)。电子通过隧道效应进行充电(写)、放电(擦)。
NAND和NOR的区别主要是:NOR的充电,采用的是从栅极到源极的热电子方式,放电和NAND一样。
他们的区别主要是:
NAND读写速度比NOR慢,但擦除速度比NOR块很多。综合考虑成本和性能,一般使用NAND做外部存储,使用NOR做芯片内部执行运用的存储。
(3)NAND FLASH
再回顾一次FLASH的的颗粒(Cell)
写就是在控制极加正电压,使电子通过绝缘层进入浮栅极。擦除操作正好相反,是在衬底加正电压,把电子从浮栅极中吸出来。如下图所示:
NAND Flash的cell分为三种:Single、Multiple、Triple。(现在还有qlc)
相对应的存储单元分别有1bit、2bit、3bit,状态(编码)就有2、4、8。从容量上看s、m、t单位容量递增,但是由于在单个单位的数据越多,对电子的控制精细度也会越高,反而会使得读写时间变长、鲁棒性变差。
所以性能最好的是s,寿命较长的是s,最贵的也是s。
了解完存储单元(Cell)后,我们再来看看NAND的是怎么组织他们,管理他们的:
一个word line 代表每次读写操作的单位,也叫他page。在控制器的眼中,如果是s,那么一个word line 就是一页,m的话就是两页,t的话就是三页。
一个块包含许多页,块是每次擦除的单位。
可以看出,擦除的单位非常大,而读写每次才操作一页,而cell是有寿命的,所以要尽量减少在同一个块的擦写次数,不同厂商会有不同的策略,一般这些策略的效果就是reblance。(写操作前需要进行擦除)
除了reblance策略以外,为了提升nand的效率,控制器还会设置分区,提高并行处理能力。
控制器给所有的块划分成lun,在每个lun内每次只能对某个块的一页进行操作,但由于有多个lun,所有整体系统的并行处理能力得到了提升。一个lun又会被分为多个plane。除此之外,系统还会为每个lun设置register(寄存器),来进一步提升速度。因为寄存器的速度更快(比cell),所以可以起到一个类似于缓存的效果。寄存器的大小和页一样大。一般每个plane有自己单独的寄存器。
具体的工作流程如下:
写:host把数据写到page所属于的plane的寄存器中,然后再将寄存器中的数据下刷到page中。
读:page将数据传到page所属于的plane的寄存器中,然后host再根据需要,有挑选的读。
我们常说的读写时间指的是page于寄存器之间传输的时间。
同样的为了提升吞吐量,系统还可以设置Dual-Plane策略。
之前是每次读写一个page会先让数据落到寄存器上,但一次只处理一个page。现在dual以后,系统会等到寄存器上有两个page的数据以后再一起落page或读。显然,这样的操作让系统的吞吐量提升了。
NAND FLASH的读写以Page为基本单元。一个Page大小主要有4KB,8KB,16KB。写一个Block当中的Page,要求顺序写,不允许随机写,但可随机读。
以上所有策略都叫SSD的固件算法。
为什么nand的擦除是以块为单位的呢?
因为一个块的cell都是共用一个衬底的,对衬底加压,会让所有栅极里面的电子都被“吸”出来了。每个块都有最大的擦写次数的,s、m、t的次数依次递减。(SLC的擦写次数可达十万次,MLC一般为几千到几万,TLC降到几百到几千)并且,随着SSD工艺的复杂度增加,擦写寿命反而呈现下降趋势。
最后我们需要注意的是,一块SSD盘,出厂时就是有坏块的,厂商会进行坏块标记。
目前来看nand的一个page对应于机械盘的一个扇区。
了解了基本原理,还得了解生态环境:
闪存盘部分参考以下两篇文章:
http://www.elecfans.com/d/659117.html
http://www.ssdfans.com/blog/2017/08/03/%e9%97%aa%e5%ad%98%e5%9f%ba%e7%a1%80/
四、ext2文件系统
通过学习ext2来学习了解文件系统是如何工作的。
(1)从一台pc出发
我们用的笔记本电脑都会配上一块盘,然后我们可以自行选择分区,比如c盘、d盘等。那么底层是怎么做的呢。
一块裸盘要交付给os使用需要进行格式化,此时会把磁盘进行分区。形象地说这个区就是某两个柱面之间的全部块。请注意,这个块并非扇区,一个块为扇区的整数倍,例如fat文件系统中一个块4KB,ext文件系统中一个块1KB。
作完分区这件事情以后,需要给每个分区装上文件系统,效果如下:
每个分区上都有文件系统,我分了四个区,就有四棵“树”。
然而服务器所需要处理的数据量非常大,一块盘已经完全不能满足使用了。如果用很多盘来做独立的文件系统,那么文件系统的可用容量大小将会受限于盘的大小。
该怎么解决问题呢?
科学家采用了两项技术,raid和LVM。
(2)从服务器的角度来看
通过raid技术将多块盘逻辑成一块物理盘,我们叫他LUN。LUN交付给os,os采用LVM技术将他进行分区使用,这样可以有效的提升文件系统的可用容量了,不再受限于单独的一块盘的容量。
(3)ext2文件系统和Inode
这张图形象的解释了ext2的数据组织结构:
首先磁盘(或者LUN)的第一个扇区记录了MBR信息,它主要包括3个部分,引导信息、分区表、结束标志。
接下来进行分区了,将整个系统的块分区,采用不同的文件系统来初始化分区的前缀名会不同:
每个分区有许多block,这些block通过分组进行管理,这样可以减少上层访问数据时的碰撞率。
每个块组的第一个块是超级块,他描述了整个分区的信息,每个组的超级块实际上都是一样的:
既然每个分区的块被分组了,那么也需要对分组信息进行管理,所以超级块之后就是GDT了:
接下来需要对块组内的空闲块进行管理,通过位视图的方式:
块位图(Block Bitmap)用来描述整个块组中哪些块已用哪些块空闲。块位图本身占一个块,其中的每个bit代表本块组的一个block,这个bit为1代表该块已用,为0表示空闲可用。假设格式化时block大小为1KB,这样大小的一个块位图就可以表示1024*8个块的占用情况,因此一个块组最多可以有1024*8个块。
同理,管理空闲的inode:
接下来是inode列表了,把一堆inode例举出来:
五、块存储
终于,回到了我们的主题,块存储。
首先我们先要理解啥是存储,他和服务器本地存储有什么区别,或者说为啥要用独立的存储设备:
1)数据量:带盘服务器能够接入的盘数有限
2)数据安全:目前企业对数据安全的要求越来越高,存算分离是大趋势
3)性能:由于服务器的主要业务是面对前端的计算请求,如果再分离出资源来管理所有的盘,做副本做纠删等等操作会挤占前端资源,所以比较好的做法是将存储单独拿出来,这样也能提供更好的带宽给服务器,减轻服务器压力。
4)扩展性:在不借助分布式文件系统或者超融合设备的情况下,一台服务器很难进行设备的灵活扩展。采用存算分离,借助存储控制器的能力来进行scale-up,比较合适。
那么什么是块存储呢?
每次处理的单位是块。与他相对应的是字符设备,比如磁带(每次一个字节)。
块存储和nas的区别就是我们的存储控制器给上层业务交付的服务是块还是文件。(当然目前还有更高一级的对象存储)
块存储:块服务
nas:块+文件系统
对象存储:块+文件系统+对象封装
层级越多效率越低。